powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Медленное получение данных через TFDQuery (FireDAC)
25 сообщений из 59, страница 2 из 3
Медленное получение данных через TFDQuery (FireDAC)
    #39122445
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Michael LongneckДа, действительно, фетч продолжается в фоне. Однако первые видимые записи он показывает гораздо раньше окончания фетча. Вы на какое время ориентируетесь - на то, что пишет SSMS в строке статуса как время выполения? И что, оно гораздо меньше времени запроса через FireDac при fmAll?

Медленней, в 4 раза

Вот это:
Код: pascal
1.
2.
FireDacDataSet.First;
While not FireDacDataSet.Eof do FireDacDataSet.Next;


Добавляет ещё пару секунд на обработку.


Уже всё перепробовал, хоть тресни
В общем вопрос открытый, почему FireDAC работает очень медленно при большой загрузке строк (140т. строк). Аж в 4-ре раза медленней чем ADO!
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122454
Glays
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_Bпрокладываю маршрут своего Пепелаца
Такой пример покатит, если ты Человек дождя и вводишь все координаты с экрана вручную.
И то, не уверен, что тут нужен фетч всех записей, вполне хватит OnDemand.

Valery_Bт.е. обсуждение нужно мне 150 тыс строк или нет - это отдельная тема.
Считаешь, я опережаю время?
Только когда автор вернётся с вопросом "почему фильтрация/сортировка/расчёт виртуальной колонки/выгрузка в эцих" работает медленно, ему можно будет сказать что он с самого начала был не прав?

ТростьУже всё перепробовал, хоть тресни
Трость, а если не делать Query.Last?
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122471
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glaysпочему фильтрация/сортировка/расчёт виртуальной колонки/выгрузка в эцих" работает медленнофильтрация/сортировка зафетченного набора данных даже в сотни тысяч записей работает быстро в любом приличном датасете
как работает "расчёт виртуальной колонки" пожалуй зависит от вложенного в это смысла и содержание расчета
что есть "выгрузка в эцих" непонятно но тоже весьма вероятно влияет качество реализации

у меня юзвери порой и сотни тысяч записей с более чем сотней полей на клиента в cds тягают ч/з "мертвый" мидас
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122472
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glays,

Про Query.Last не понял...
Можно поподробнее
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122484
Glays
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТростьGlays,

Про Query.Last не понял...
Можно поподробнее


ТростьХотя если Mode = fmOnDemand и делаем Query.Last
Что происходит если не делать Query.Last?
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122562
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причин может быть много. Присылай на darefiev at da-soft dot com:
1) Отчет об окружении - http://docwiki.embarcadero.com/RADStudio/Seattle/en/DBMS_Environment_Reports_(FireDAC)
2) Дамп таблицы или файл бэкапа БД

PS: Обычно дело в клиенте SQL Server'а и в том как FireDAC выбирает тип курсора.
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122686
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GlaysТростьGlays,

Про Query.Last не понял...
Можно поподробнее


ТростьХотя если Mode = fmOnDemand и делаем Query.Last
Что происходит если не делать Query.Last?

Если не делаем, то фетчим первые 50 строк (параметр по умолчанию).
Если делаем Query.Last закачиваем 140т. строк.

Всё таки считал что FireDAC в этом плане как минимум не будет уступать.
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122696
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievПричин может быть много. Присылай на darefiev at da-soft dot com:
1) Отчет об окружении - http://docwiki.embarcadero.com/RADStudio/Seattle/en/DBMS_Environment_Reports_(FireDAC)
2) Дамп таблицы или файл бэкапа БД

PS: Обычно дело в клиенте SQL Server'а и в том как FireDAC выбирает тип курсора.

1. Наверное то:
================================
Connection definition parameters
================================
SERVER=90.90.90.90,1433
User_Name=sa
Password=*****
ApplicationName=Architect
Workstation=WIN7NEW
DATABASE=DBTEST5227
MARS=yes
DriverID=MSSQL
================================
FireDAC info
================================
Tool = RAD Studio XE6
FireDAC = 10.0.1 (Build 69712)
Platform = Windows 32 bit
Defines = FireDAC_NOLOCALE_META;FireDAC_MONITOR
================================
Client info
================================
Loading driver MSSQL ...
Loading odbc32.dll driver manager
Creating ODBC environment handle
Searching for ODBC driver ...
Checking for ODBC driver [SQL SERVER NATIVE CLIENT 11.0] ...
Checking for ODBC driver [SQL SERVER NATIVE CLIENT 10.0] ...
Found [SQL Server Native Client 10.0]
Driver Manager version = 03.80.7601.0000
================================
Session info
================================
Current catalog =
Current schema = dbo
Driver name = sqlncli10.dll
Driver version = 10.50.4000
Driver conformance = 3
DBMS name = Microsoft SQL Server
DBMS version = 10.50.1600


2. Не могу предоставить, там конфиденциальные данные. В селекте выбираю 4 поля "идентификатор клиента", "фамилия", "имя", "Отчество".
Код: sql
1.
SELECT [ID], [Fam], [Nam], [Otch] FROM [Clients]



Вы пишите, что есть несколько причин. Приведите хотя бы 2-3, чтоб можно было хоть что нибудь попробовать.

PS: Обычно дело в клиенте SQL Server'а и в том как FireDAC выбирает тип курсора.


Тут совсем ничего непонятно. Какой клиент SQL Server'а?
Вы про нэатив-клиент (Found [SQL Server Native Client 10.0])?
И какой тип курсора подойдёт для него?
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122850
Glays
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТростьЕсли не делаем, то фетчим первые 50 строк (параметр по умолчанию).
Если делаем Query.Last закачиваем 140т. строк.
Спасибо капитан.
Время выполнения то изменяется?
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122863
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GlaysТростьЕсли не делаем, то фетчим первые 50 строк (параметр по умолчанию).
Если делаем Query.Last закачиваем 140т. строк.
Спасибо капитан.
Время выполнения то изменяется?

Нет не изменяется, уже писал выше по форуму. Повторюсь

Mode = fmAll
или
Mode = fmOnDemand + Query.Last,

скорость можно сказать не отличается
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122865
Glays
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТростьНет не изменяется, уже писал выше по форуму. Повторюсь

Mode = fmAll
или
Mode = fmOnDemand + Query.Last,

скорость можно сказать не отличается
Mode = fmAll
или просто
Mode = fmOnDemand
Скорость отличается?
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122866
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И медленней на пару сек. если:

Mode = fmOnDemand, затем While not FireDacDataSet.Eof do FireDacDataSet.Next;
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122869
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GlaysТростьНет не изменяется, уже писал выше по форуму. Повторюсь

Mode = fmAll
или
Mode = fmOnDemand + Query.Last,

скорость можно сказать не отличается
Mode = fmAll
или просто
Mode = fmOnDemand
Скорость отличается?

)))) Естественно! Или закачать с сервера 50 строк или закачать 140т. строк.

Вопрос то в другом, почему через SSMS и через приложение на ADO время выполнения занимает 8 сек, а у FireDAC 32 сек.?
И что можно попробовать сделать, чтоб ситуация на FireDAC изменилась, или этого просто невозможно сделать тк FireDAC не рассчитан на такую обработку
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122922
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Я так и не понял:
Код: pascal
1.
2.
3.
FDQuery.FetchOptions.Mode := fmOnDemand;
FDQuery.Open;
while not FDQuery.Eof do FDQuery.Next;


и
Код: pascal
1.
2.
ADOQuery.Open;
while not ADOQuery.Eof do ADOQuery.Next;


как различаются по времени ?
2) В запросе:
Код: sql
1.
SELECT [ID], [Fam], [Nam], [Otch] FROM [Clients]


поля как определены ?
3) Попробуй различные значения FetchOptions.CursorKind.
что-то меняется ?
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39122986
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev1) Я так и не понял:
Код: pascal
1.
2.
3.
FDQuery.FetchOptions.Mode := fmOnDemand;
FDQuery.Open;
while not FDQuery.Eof do FDQuery.Next;


и
Код: pascal
1.
2.
ADOQuery.Open;
while not ADOQuery.Eof do ADOQuery.Next;


как различаются по времени ?
2) В запросе:
Код: sql
1.
SELECT [ID], [Fam], [Nam], [Otch] FROM [Clients]


поля как определены ?
3) Попробуй различные значения FetchOptions.CursorKind.
что-то меняется ?

По 1-вы моменту:
FireDAC:
FetchOptions.CursorKind = ckAutomatic
Если Mode = fmAll, открывает примерно за 29,6 сек.
Если Mode = fmOnDemand + Query.Last скорость примерно 29,0 - 29,1 сек.
Если Mode = fmOnDemand + While not Query.Eof do Query.Next; скорость примерно 25,3

ADO:
Если ADOQuery.Open, открывает примерно за 8,0 - 8,5сек.
Если ADOQuery.Open + ADOQuery.Last, скорость примерно 8,1-8,5 сек.
Если ADOQuery.Open +While not ADOQuery.Eof do ADOQuery.Next; скорость 216 сек. ЖЕСТЬ!!!

2
ID - INT автоинкремент, PK (ключевое)
Fam - NVARCHAR(20)
Nam - NVARCHAR(15)
Otch - NVARCHAR(15)

3
etchOptions.CursorKind = ckDefault
Если Mode = fmOnDemand + While not Query.Eof do Query.Next; скорость примерно 29,5

etchOptions.CursorKind =ckDynamic
Если Mode = fmOnDemand + While not Query.Eof do Query.Next; скорость примерно 166 сек.

etchOptions.CursorKind =ckForwardOnly
Если Mode = fmOnDemand + While not Query.Eof do Query.Next; скорость примерно 159сек.

etchOptions.CursorKind =ckStatic
Если Mode = fmOnDemand + While not Query.Eof do Query.Next; скорость примерно 138сек.
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39123549
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это говорит само за себя ...
1) FireDAC честно читает всю выборку на 29 сек. ADO за 216 сек.
FireDAC судя по всему использует дефолтный MSSQL курсор.
3) При одном из других видов курсоров (не ckDefault) возможно время
открытия будет меньше, но полное время выборки будет много больше.
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39123824
Трость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievТак это говорит само за себя ...
1) FireDAC честно читает всю выборку на 29 сек. ADO за 216 сек.
FireDAC судя по всему использует дефолтный MSSQL курсор.
3) При одном из других видов курсоров (не ckDefault) возможно время
открытия будет меньше, но полное время выборки будет много больше.

А по Вашему мнению, почему SSMS вопрос выполняет 8сек.? он тоже грузит "нечестно"?
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39123851
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трость,

Сервер MSSQL и SSMS запущены на одной машине?
Есть вероятность что данные передаются через SharedMemory, все одно быстрее чем по TCP/IP
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39123941
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трость, или как тебя там по имени ?

1. FireDac.Open занимает 30 секунд. Тут ты вряд ли что-то сделаешь.
2. ADO.Open занимает 3 секунды(у меня). Тут делать ничего не надо.
3. Что касается While not ADO.Eof - жесть. Да, жесть так жесть. Но это не вина АДО, это такая "фича" от разработчиков Delphi 5 (!)
4. О других багах АДО я пытался написать тут

Попробуй сделать так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
 X:Integer;
 MyValue:OleVariant;
begin
ADOQuery1.RecordSet.MoveFirst;
for x:=0 to 150000-1 do
  begin
   ADOQuery1.Recordset.MoveNext;
//   MyValue := ADOQuery1..Recordset.Fields['MyField'].Value;
  end;
end;


У меня это занимает 110 мс. Если разкоментить - то 520 мс.
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39123943
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для тех, у кого нет таблицы со 150,000 строками может сделать такой запрос:

Код: sql
1.
2.
3.
select top 150000 * 
from sys.objects a
cross join sys.objects b
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39123973
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй сделать так:Какое-то идиотское усложнение. Почему не Last ?
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39123990
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV,

у автора вообще медленный газ. Он никак не может понять, что

1. у запроса есть время выполнения на сервере, до выдачи первой записи клиенту.
2. датасет на клиенте, в зависимости от того, как написан клиент и датасет, и от настроек, может
а) показать первые несколько записей, дальше остановиться (или продолжить выборку записей в фоне, как автору уже сказали про SSMS)
б) считать в кэш все записи, только потом их "показать".

Соответственно, будет разное время 1+2а и 1+2б.
Дальше. Если автор пишет про цикл while not Eof do Next, значит он предполагает ПОСЛЕДОВАТЕЛЬНУЮ обработку. А для этого буферизация выбираемых записей не нужна. Буферизация однозначно займет память (все 150к записей на клиента) и также увеличит время. Делает-ли буферизацию SSMS? Скорее всего нет.
Если же нужна оценка выкачки всех записей в кэш датасета, то действительно нужен Last. А если нужен цикл while с обработкой записей, тогда кэшировать датасет не нужно.

Мне больше другое интересно - почему открытие "простого запроса" (без джойнов и т.д.) занимает 8 секунд в SSMS? Если тупо написать select * from table хоть с миллионом записей, первые записи должны быть показаны МГНОВЕННО, речь должна идти про миллисекунды, а не секунды.
Вот на таком запросе и надо сравнивать SSMS и FireDAC (с соответствующими настройками).
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39124013
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvпочему открытие "простого запроса" (без джойнов и т.д.) занимает 8 секунд в SSMS?

Потому что SMSS не использует ни FireDac, ни TClientDataSet.
Там скорее всего ADO.Net.

Это же интересно и автору темы.
Точнее, сомневаюсь что ему интересно. Главное - что бы у него работало так же. Но не работает.

А вообще, сначала лучше попробуй сделать сам, прежде чем наезжать на автора темы.
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39124023
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BПотому что SMSS не использует ни FireDac, ни TClientDataSet.
Там скорее всего ADO.Net.
какая разница. механизмы выборки у всех серверов и клиентов одинаковы. Я имею в виду - выполнить запрос, выбрать запись, и т.д.
Valery_BА вообще, сначала лучше попробуй сделать сам
я с MS SQL не работаю. Только с InterBase и Firebird. К ним есть штук 20-30 разных компонент доступа, и штук 8 разных инструментов разработчика (типа SSMS), в которых все это проверяется практически моментально.
В соответствующих форумах уже давно сравнивали FireDAC, IBX, dbExpress, FIBPlus, и др. компоненты на скорость выборки.
Valery_Bпрежде чем наезжать на автора темы
я не наезжаю, я констатирую. ему объясняют смысл уже вторую страницу темы. А он как будто не читает ответы.
...
Рейтинг: 0 / 0
Медленное получение данных через TFDQuery (FireDAC)
    #39124056
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvкакая разница. механизмы выборки у всех серверов и клиентов одинаковы"мощно задвинул, внушает" (С)
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Медленное получение данных через TFDQuery (FireDAC)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]