Медленная работа связки ADO с MS SQL Server
От: barbanel  
Дата: 09.08.23 11:58
Оценка:
Доброго времени и мое почтение старожилам!

На новой работе свела судьба некрокомпонентом TBetterAdoDataset и соответственнно кровавым легаси.
Есть довольно большой продукт, написанный на DelphiXE 10.3 но использующий ADO и вышеупомянутый некроморф. БД — MS SQL Server.
С недавних пор, один из клиентов жалуется что данное приложение работает неприлично медленно.
Под неприлично медленно имеется ввиду: 3 примитивных запроса типа "SELECT Field1, Field2 FROM TableName WHERE ID=Value" выполняются порядка 5 секунд.
Запросы возвращают одну запись.
В редких случаях, вылетает исключение с таймаутом.

Можно списать на плохую сетевую инфраструктуру, НО:
Другое приложение, также написанное на Delphi + TBetterAdoDataset, работающее с этой же самой базой, на этом же самом ПК, таких проблем не имеет и работает с нормальной скоростью.
К сожалению исходники второго приложения нам недоступны.

Я понимаю что это очень тупой вопрос, но:
может у кого-то есть идеи, куда можно посмотреть?
Мы рассматриваем абсолютно любую зацепку. Даже за мысли вслух будем благодарны.

Всем заранее спасибо!
ado ms sql server tbetteradodataset медленно тормозит adodataset
Re: Медленная работа связки ADO с MS SQL Server
От: wety Россия  
Дата: 09.08.23 12:06
Оценка:
Здравствуйте, 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 всё же будет быстрее.
Отредактировано 09.08.2023 12:22 wety . Предыдущая версия . Еще …
Отредактировано 09.08.2023 12:20 wety . Предыдущая версия .
Отредактировано 09.08.2023 12:13 wety . Предыдущая версия .
Re[2]: Медленная работа связки ADO с MS SQL Server
От: barbanel  
Дата: 11.08.23 15:27
Оценка:
Здравствуйте, 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), которая указывает количество записей, которое должен вернуть сервер.
Re[3]: Медленная работа связки ADO с MS SQL Server
От: wety Россия  
Дата: 17.08.23 05:48
Оценка:
Здравствуйте, barbanel, Вы писали:

Чем закончилась данная работа? Что в итоге получилось?
Может всё же стоит переписать код на актуальном стеке, если проблема медленной работы очень волнует бизнес?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.