![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема скорости работы [D7, Access]
Taurus © (2007-12-17 22:26:00)Здравствуйте! Помогите,пожалуйста, решить следующую проблему.
Открывается 3 связанных компонента ADODataSet. Связь главный-подчиненный:
Таблица 1 -> Таблица 2 -> Таблица 3.
В таблице 1 порядка 7 тыс записей, в таблице 2 - 15 тыс, в таблице 3 - 150 тыс, т.е. база небольшая.
На форме соответственно 3 сетки, в которые и выводятся данные. Все идет нормально до тех пор, пока на таблицу 2 не накладывается дополнительное условие типа where God=:Gd, т.е. необходимо выводить записи текущего года. После этого система начинает жутко тормозить при перемещении записей в 1й сетке.
Курсор на клиенте.
Как исправить ситуацию?
Slym (2007-12-19 10:50:00) [1]Proba.KodPoint - проиндексировать т.к. внешний ключ
Sergey13 (2007-12-18 13:53:00) [2]> [9] Taurus (18.12.07 12:35)
А если все таки попробовать на "ручное управление" перевести по афтерскролу? Там делов то на 10 минут на попробовать.
sniknik (2007-12-18 13:43:00) [3]> также.
хреново...
> Фильтр на подчиненную таблицу не ставится.
вот вроде при варианте по запросам должен... а при втором (в [8]) варианте точно сам мастер детайл использует фильтр, поэтому и не ставиться...
выложи куданибудь тест прогу с базой. посмотреть.
базу (данные) если они секрет можеш "поковеркать", данные в полях не участвующих в связке вообще удалить (UPDATE ... SET xxx=NULL)
в тест (пустой проект) перенеси только то что участвует в связке.
Taurus (2007-12-18 12:35:00) [4]
> что будет если их прописать разово в десигне? также медленно?
также.
> как насчет замены доп. параметров фильтром, меняется чтонибудь?
Фильтр на подчиненную таблицу не ставится.
sniknik (2007-12-18 11:54:00) [5]> А план выполнения в аксесе можно посмотреть?
если и можно то я не знаю как...
но вообще, план будет простой..., тут и так ясно, что с введением доп. параметров оно(мастер детайл) у него переключается с "запросного" механизма на открытие всей таблицы + общий фильтр. т.е. на манер типа как если ADOTable по мастер детайлу связать...
почему, и чем он этого добился х.з., но скорее всего так оно и есть.
Sergey13 (2007-12-18 11:25:00) [6]> кстати индекс на DateOtb не так уж и важен
Поже на то.
> В таблице 1 порядка 7 тыс записей, в таблице 2 - 15 тыс, в таблице 3 - 150 тыс
т.е. на 1 запись в первой таблице приходится всего 2 записи во второй. В таком случае наличие/отсутствие индекса по 2 полям не должен бы вроде оказывать влияния.
А план выполнения в аксесе можно посмотреть?
sniknik (2007-12-18 10:52:00) [7]> Индекс на Proba по KodPoint и DateOtb есть?
+
в каком месте задаются параметры -
> ADO_Proba.Parameters.ParamByName('D1').Value:=StrToDate('01.01.2005');
> ADO_Proba.Parameters.ParamByName('D2').Value:=StrToDate('31.12.2005');
?
что будет если их прописать разово в десигне? также медленно?
кстати индекс на DateOtb не так уж и важен, не помешает конечно, раз уж по нему отбор есть но основной KodPoint, тот который из первого рекордсета передается.
и раз уж только с ним одним отбор быстрый, то как насчет замены доп. параметров фильтром, меняется чтонибудь?
Sergey13 (2007-12-18 09:48:00) [8]> [3] Taurus (18.12.07 09:13)
> DataSource 2-го и 3-го датасета настроены соответственно
> на источники данных 1-го и 2-го.
Есть вариант сделать это руками по АфтерСкрол и с задержкой по таймеру (время подобрать эмпирически) для отсеивания быстрого прокручивания данных. Но за этим надо следить и отключать при, например, печати отчета по этой связке.
Sergey13 (2007-12-18 09:34:00) [9]> [3] Taurus (18.12.07 09:13)
Индекс на Proba по KodPoint и DateOtb есть?
Taurus (2007-12-18 09:13:00) [10]Наборы данных и так по запросам:
1-й Датасет:
select KodP, KodPoint, KodRai from Point where KodRai>=:KR1 and KodRai<=:KR2
2-й ДатаСет:
select KodProb, KodP, DateOtb from Proba where KodPoint=:KodP and DateOtb>=:D1 and DateOtb<=:D2
3-й ДатаСет:
select * from Analiz where KodProb=:KodProb
DataSource 2-го и 3-го датасета настроены соответственно на источники данных 1-го и 2-го.
Тормоза появляются после задания параметров 2-го:
ADO_Proba.Parameters.ParamByName('D1').Value:=StrToDate('01.01.2005');
ADO_Proba.Parameters.ParamByName('D2').Value:=StrToDate('31.12.2005');
Если исключить эти параметры из запроса или отключить 3-й Датасет, скорость станосится нормальной.
Правильный_Вася (2007-12-17 22:45:00) [11]используй не Таблица 1 -> Таблица 2 -> Таблица 3, а наборы данных по запросам
запросы заодно в студию занеси
sniknik (2007-12-17 22:35:00) [12]> Как исправить ситуацию?
это практически невозможно...
видиш ли для этого нужно исправить ошибку в 17й строке, но ты же ее никогда не покажешь (проверено практикой)...