Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Индексы в связке с DBF, Оптимизация запросов 
:(
    Опции темы
FINANSIST
Дата 8.10.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Статус: Жив
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 11.4.2008
Где: Москва

Репутация: 1
Всего: 23



Ситуация следующая:
Из корпоративного приложения (C++) ежедневно выгружаются 3 DBF файла - 2 справочника и таблица с факт.оборотами за 1 день
Протянул связь от этих файлов в Access
Сделал под факт.обороты 2 абсолютно идентичные статичные таблицы с одинаковыми полями для оптимизации - в первой хранится история до 2009 года, во второй - текущий год, т.к. 99% всех SQL запросов по текущему году. Проиндексировал эти две таблицы по всем полям, которые связываются в SQL со связанными справочниками DBF.
В результате - таблица с Историей это 5 миллионов записей, таблица с текущим годом - 1,3 миллонов записей. Связанные справочники DBF - по 1000 записей в каждом.
Физически таблицы со справочниками естественно не связаны.
Справочники естественно не индексируются.
Новые записи добавляются в 2009 год из ежедневных DBF Insert-ом.
DBF-ники связанных справочников просто подменяются.
Вопрос 1: есть ли смысл в индексации, если в запросах индексированные таблицы обязательно Inner Join с DBF связками?
Вопрос 2: стоит ли для повышения производительности SQL сделать статичными в базе справочники DBF с их индексацией, Pkey & Fkey без DELETE Cascade т.к. статичные справочники придется ежедневно Delete & Insert (+предварительный разрыв связей и последующее создание связей)  из DBF с их последующей переиндексацией?
Вопрос 3: Есть 2-я база как клиент связанная с данным хранилищем- повлияет ли индексация здесь на производительность SQL там?
Как вообще лучше поступить, или у меня сейчас все оптимально? (sql запросы не обсуждаются - только структура базы)



Это сообщение отредактировал(а) FINANSIST - 8.10.2009, 11:14


--------------------
“...Брали корову рыжую одну, отдавать будем корову рыжую одну, чтобы не нарушать отчетности”
Эдуард Успенский, “Каникулы в Простоквашино”
PM MAIL ICQ   Вверх
Akina
Дата 8.10.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Любые манипуляции со связанными DBF - это страдание одним нехорошим делом.
Если ты реально печёшься о быстродействии, следует импортировать данные из DBF в Аксессовскую таблицу нужной структуры с нужными индексами. А при старте БД (ну и ручной режим предусмотреть) сверять дату/время DBF с датой/временем последнего импорта, и если DBF более свежие - выполнять импорт.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 8.10.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



FINANSIST, я думаю, что 
- самую лучшую производительность даст какой-нибудь полноценный SQL сервер. 
- имеет смысл перенести справочник из dbf в MS Access, т.к. уменьшится цепочка драйверов, которые участвуют в обработке драйверов.
- при любом объединени таблиц используется или строится индексация! Когда счет на миллионы, то индексы единственный способ повысить производительность объединения таблиц.
- MS Access использует концепцию файловой бд при доступе к данным. 
   Что это значит: Допустим бд лежит на комп1, клиентская бд на комп2. Когда клиентская бд доступается до таблицы, то вся таблица загружается на комп2. Т.е. если выполняется запрос с несколькими таблицами, то все таблицы целиком загружаются на комп2. Впечатляет? Так что в твоей ситуации все индексы не помогут ускорить работу пользователей по сети.

Резюмирую:
- завести SQL сервер
- в клиентской бд использовать ODBC запросы к серверу, без СВЯЗАННЫХ таблиц.
Если заинтересуетесь, могу поделиться опытом и небольшой библиотекой для создания подключения и прочих радостей. Я использовал mySQL.

Будет просто летать. Единственная сложность - изменять данные тяжеловато - придется программно писать инсерты и апдейты. Но для анализа это вообще может не пригодиться.

Добавлено через 1 минуту и 12 секунд
Цитата(Akina @  8.10.2009,  11:25 Найти цитируемый пост)
А при старте БД (ну и ручной режим предусмотреть) сверять дату/время DBF с датой/временем последнего импорта, и если DBF более свежие - выполнять импорт. 

Если клиентов много, то могут быть накладки. Лучше делать это одним админским тулом или зашедуленной утилитой, которая будет это делать, когда пользователи не будут работать с бд, ночью, например.
PM MAIL WWW ICQ Skype GTalk   Вверх
FINANSIST
Дата 8.10.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Статус: Жив
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 11.4.2008
Где: Москва

Репутация: 1
Всего: 23



Цитата(Akina @  8.10.2009,  11:25 Найти цитируемый пост)
 и если DBF более свежие - выполнять импорт. 

Код

Option Compare Database
Option Explicit
Public Function UpdateReferencesAndTables(UpdateSpravochn As Boolean) As Boolean
Dim sql As String
UpdateReferencesAndTables = False
If UpdateSpravochn Then
    'рвем связи
    Let sql = "alter table REALIZ"
    Let sql = sql & " drop constraint FkeyToPartners"
    Debug.Print sql: CurrentDb.Execute sql
    Let sql = "alter table REALIZ"
    Let sql = sql & " drop constraint FkeyToNomenclatura"
    Debug.Print sql: CurrentDb.Execute sql
    'чистим справочники
    CurrentDb.Execute "delete * from partners"
    CurrentDb.Execute "delete * from sprod_k"
    'наполняем справочники из DBF
    Let sql = "insert into partners"
    Let sql = sql & " select * from partners_app"
    Debug.Print sql: CurrentDb.Execute sql
    Let sql = "insert into sprod_k"
    Let sql = sql & " select * from sprod_k_app"
    Debug.Print sql: CurrentDb.Execute sql
    'заново создаем связи
    Let sql = "alter table REALIZ"
    Let sql = sql & " add constraint FkeyToPartners"
    Let sql = sql & " foreign key (KPRT) references partners (KPRT)"
    Debug.Print sql: CurrentDb.Execute sql
    Let sql = "alter table REALIZ"
    Let sql = sql & " add constraint FkeyToNomenclatura"
    Let sql = sql & " foreign key (NPROD) references sprod_k (NPROD)"
    Debug.Print sql: CurrentDb.Execute sql
End If
'Заполняем факт
Let sql = "insert into REALIZ"
Let sql = sql & " select * from otfact"
DoCmd.RunSQL sql
UpdateReferencesAndTables = True
End Function


Я тебя правильно понял???

Цитата(bopoha @  8.10.2009,  11:30 Найти цитируемый пост)
Так что в твоей ситуации все индексы не помогут ускорить работу пользователей по сети.

Не, у меня все проще: и хранилище и клиент висят на моем железе и в локаль не лезут - клиента создал из-за того, что есть регламентированная ежемесячная отчетность (15 довольно сложных отчетов) со своими процессами обработки данных хранилища, формами, процедурами  и личными локальными справочниками.
А в хранилище помимо данных только ежедневные разовые временные запросы для формирования кубов различным пользователям. Потому и спрашиваю: индексы хранилища ускорят работу клиента, если все протекает в рамках моего железа?


Цитата(bopoha @  8.10.2009,  11:30 Найти цитируемый пост)
Если заинтересуетесь, могу поделиться опытом и небольшой библиотекой для создания подключения и прочих радостей. Я использовал mySQL.

А вот на эту тему с тобой плотно пообщаюсь (правда не в рамках этого топика), т.к. планирую переводить всё это хозяйство либо на мускул, либо на жарптицу в которых опыта 0



--------------------
“...Брали корову рыжую одну, отдавать будем корову рыжую одну, чтобы не нарушать отчетности”
Эдуард Успенский, “Каникулы в Простоквашино”
PM MAIL ICQ   Вверх
Akina
Дата 8.10.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(FINANSIST @  8.10.2009,  13:38 Найти цитируемый пост)
Я тебя правильно понял???

Наполовину.
Такой процесс неминуемо вызовет рассогласование, и другие клиенты вместо данных получат цену на рис в Китае... оно тебе надо?
Следует создать в БД хранимую процедуру, которая выполнит необходимые действия (объявит транзакцию, заблокирует таблицы, уберёт индексы и констрейны, импортирует данные во временные таблицы, дропнет данные в постоянных таблицах, выполнит копирование новых данных, создаст индексы и констрейны и, если не было ошибок, закомиттит всё это дело).
Но это всё однозначно ADO, Jet или DAO не стреляют.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
FINANSIST
Дата 8.10.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Статус: Жив
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 11.4.2008
Где: Москва

Репутация: 1
Всего: 23



Цитата(Akina @  8.10.2009,  12:52 Найти цитируемый пост)
Такой процесс неминуемо вызовет рассогласование

Уже наступил на эти грабли, еще голова не остыла
Но я уже упоминал, что клиент только у меня, хранилище тоже у меня и закрыть клиента мне ничего не стоит - но данная проблема возникает на другом этапе: слепил форму, в которой две подчиненной на основе запроса из аппендикса DBF в одной подчиненной и запрос из факт.оборотов тек.года в другой. Это необходимо для сравнения записей перед импортом во избежание дубликации ( группировка по датам - 30 записей это максимум) а так же для сравнения между тем что выгрузилось в DBF и тем что выгрузилось из C++ творения (косяки бывают).
Как ты и писал, ругается 
user posted image
Есть конкретный код или решение на временную отвязку запросов форм от таблиц в процессе обработки? (RowSource?)





Это сообщение отредактировал(а) FINANSIST - 8.10.2009, 14:03


--------------------
“...Брали корову рыжую одну, отдавать будем корову рыжую одну, чтобы не нарушать отчетности”
Эдуард Успенский, “Каникулы в Простоквашино”
PM MAIL ICQ   Вверх
Akina
Дата 8.10.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Таблица "REALIZ" - это DBF?
Сделай её импорт. Пуст источник данных будет родная, а не связанная, таблица.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
FINANSIST
Дата 8.10.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Статус: Жив
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 11.4.2008
Где: Москва

Репутация: 1
Всего: 23



Цитата(Akina @  8.10.2009,  14:17 Найти цитируемый пост)
Таблица "REALIZ" - это DBF?

Не, она как раз родная туда из DBF ежедневно вносятся "аппендиксы", думаю на нее функция ругается, так как контрол внедренный0 на форме, с которой запускаю функцию имеет следующий источник:
Код

SELECT REALIZ.DATA, Format(Sum(REALIZ.VES),"### ### ###") AS [Sum-VES]
FROM (sprod_k INNER JOIN REALIZ ON sprod_k.NPROD = REALIZ.NPROD) INNER JOIN partners ON REALIZ.KPRT = partners.KPRT
GROUP BY REALIZ.DATA
HAVING (((REALIZ.DATA)>=DateSerial(Year(Date()),Month(Date()),1)))
ORDER BY REALIZ.DATA
UNION ALL SELECT 'Total:',  Format(Sum(REALIZ.VES),"### ### ###") AS [Sum-VES]
FROM (sprod_k INNER JOIN REALIZ ON sprod_k.NPROD = REALIZ.NPROD) INNER JOIN partners ON REALIZ.KPRT = partners.KPRT
WHERE (((REALIZ.DATA)>=DateSerial(Year(Date()),Month(Date()),1)));

Как бы мне эту подчиненную форму от таблицы отключить в момент исполнения?






--------------------
“...Брали корову рыжую одну, отдавать будем корову рыжую одну, чтобы не нарушать отчетности”
Эдуард Успенский, “Каникулы в Простоквашино”
PM MAIL ICQ   Вверх
bopoha
Дата 8.10.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Цитата(FINANSIST @  8.10.2009,  14:23 Найти цитируемый пост)
ак бы мне эту подчиненную форму от таблицы отключить в момент исполнения?

А это уже изврат. 

Может не стоит усложнять? Все обновления бд стоит делать при запуске приложения, если нужно. или по желанию пользователя, тогда все формы и отчеты закрыть и обновить.

Цитата(Akina @  8.10.2009,  12:52 Найти цитируемый пост)
Но это всё однозначно ADO, Jet или DAO не стреляют. 

DAO вполне потдреживает транзакции, если работать только в рамках MS Access.
PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 8.10.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(bopoha @  8.10.2009,  17:37 Найти цитируемый пост)
O вполне потдреживает транзакции, если работать только в рамках MS Access.

При чём тут транзакции? Я о том, что только через ADO можно в Аксессовой базе создавать хранимки, триггеры и прочие вкусные вещи, из интерфейса недоступные.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 8.10.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Цитата(Akina @  8.10.2009,  20:51 Найти цитируемый пост)

При чём тут транзакции? Я о том, что только через ADO можно в Аксессовой базе создавать хранимки, триггеры и прочие вкусные вещи, из интерфейса недоступные. 

Вот те раз, первый раз слышу!
PM MAIL WWW ICQ Skype GTalk   Вверх
FINANSIST
Дата 9.10.2009, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Статус: Жив
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 11.4.2008
Где: Москва

Репутация: 1
Всего: 23



Цитата(bopoha @  8.10.2009,  16:37 Найти цитируемый пост)
А это уже изврат. 

В принципе да, но учитывая, что у меня в момент подгрузки висит только 1 форма, проще временно отключить контролы (тем более критичных контролов всего 2): решил проблему преобразовав подчиненнные формы в листбоксы с переключением rowsourcetype с Table/Query в Value list и обратно по завершению.
А что, Access не поддерживает временное отключение источников подчиненных форм?
И по индексам хранилища я так и не понял - они окажут положительное воздействие на скорость запросов в клиенте, или я зря парился с локализацией таблиц?


Это сообщение отредактировал(а) FINANSIST - 9.10.2009, 08:50


--------------------
“...Брали корову рыжую одну, отдавать будем корову рыжую одну, чтобы не нарушать отчетности”
Эдуард Успенский, “Каникулы в Простоквашино”
PM MAIL ICQ   Вверх
bopoha
Дата 9.10.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Цитата(FINANSIST @  9.10.2009,  07:55 Найти цитируемый пост)
И по индексам хранилища я так и не понял - они окажут положительное воздействие на скорость запросов в клиенте, или я зря парился с локализацией таблиц?

Окажут.

Цитата(FINANSIST @  9.10.2009,  07:55 Найти цитируемый пост)
В принципе да, но учитывая, что у меня в момент подгрузки висит только 1 форма

Все равно изврат. Это даст о себе знать, при развитии приложения.

Цитата(FINANSIST @  9.10.2009,  07:55 Найти цитируемый пост)
А что, Access не поддерживает временное отключение источников подчиненных форм?

Библиотека ADO.NET подреживает. Библиотеки DAO и ADO нет.

Это сообщение отредактировал(а) bopoha - 9.10.2009, 12:21
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0690 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.