Здравствуйте, barbanel, Вы писали:
1. Интересует точно ли ситуация с 5 секундами воспроизводится регулярно?
2. Запрос с TBetterAdoDataset выполняется с той же самой машины, с которой выполняется и тот самый долгий запрос?
3. Параметры (value) идентичны?
4. Что с планом запроса? Интересует есть ли покрывающий индекс в базе данных?
Должно быть вот так примерно так:
create nonclustered index ix1 on dbo.TableName (id) include (Field1, Field2);
updste statistics dbo.TableName WITH fullscan;
Также вот ссылки, чтобы поразмышлять:
https://groups.google.com/g/borland.public.delphi.database.ado/c/3H82a_CAdO4?pli=1
http://www.delphigroups.info/2/56/218124.html
В целом, должно быть вот так:
1. CursorLocation — Server
2. CursorType — OpenForwardOnly
3. ExecuteOptions — ASyncFetch
4. CacheSize — some small number like 20.
В противном случае, TBetterAdoDataset всё же будет быстрее.
Здравствуйте, wety, Вы писали:
Спасибо за ответ!
W>1. Интересует точно ли ситуация с 5 секундами воспроизводится регулярно?
Да.
W>2. Запрос с TBetterAdoDataset выполняется с той же самой машины, с которой выполняется и тот самый долгий запрос?
Да.
W>3. Параметры (value) идентичны?
Нет, но это не имеет значения, т.к. фактически Value это ID записи.
W>4. Что с планом запроса? Интересует есть ли покрывающий индекс в базе данных?
Дело железобетонно не в запросе, не в индексах и не в плане запроса.
Другое приложение работает с этой же БД нормально.
W>Также вот ссылки, чтобы поразмышлять: https://groups.google.com/g/borland.public.delphi.database.ado/c/3H82a_CAdO4?pli=1
W>http://www.delphigroups.info/2/56/218124.html
W>В целом, должно быть вот так:
W>1. CursorLocation — Server
W>2. CursorType — OpenForwardOnly
W>3. ExecuteOptions — ASyncFetch
W>4. CacheSize — some small number like 20.
W>В противном случае, TBetterAdoDataset всё же будет быстрее.
Спасибо, это интересно.
По поводу CursorLocation:
В нашем приложении CursorLocation был выставлен в серверный и приложение при это общается с сервером БД заметно медленнее.
Запустив профайлер MS SQL мы заметили что в случае серверного курсора приложение запрашивает (ну или сервер отдает, мы пока не разобрались) записи по одной.
Т.е. не скажем 30 или 200 или еще больше, а именно по одной. В случае клиентского курсора, весь ответ сервера отправляется одним "пакетом", и работает в нашем случае это заметно быстрее.
В связи с этим, мы полагаем что мы не знаем о какой-либо специфичной настройке (или свойстве, или методе whatever), которая указывает количество записей, которое должен вернуть сервер.