|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Michael LongneckДа, действительно, фетч продолжается в фоне. Однако первые видимые записи он показывает гораздо раньше окончания фетча. Вы на какое время ориентируетесь - на то, что пишет SSMS в строке статуса как время выполения? И что, оно гораздо меньше времени запроса через FireDac при fmAll? Медленней, в 4 раза Вот это: Код: pascal 1. 2.
Добавляет ещё пару секунд на обработку. Уже всё перепробовал, хоть тресни В общем вопрос открытый, почему FireDAC работает очень медленно при большой загрузке строк (140т. строк). Аж в 4-ре раза медленней чем ADO! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 15:27 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Valery_Bпрокладываю маршрут своего Пепелаца Такой пример покатит, если ты Человек дождя и вводишь все координаты с экрана вручную. И то, не уверен, что тут нужен фетч всех записей, вполне хватит OnDemand. Valery_Bт.е. обсуждение нужно мне 150 тыс строк или нет - это отдельная тема. Считаешь, я опережаю время? Только когда автор вернётся с вопросом "почему фильтрация/сортировка/расчёт виртуальной колонки/выгрузка в эцих" работает медленно, ему можно будет сказать что он с самого начала был не прав? ТростьУже всё перепробовал, хоть тресни Трость, а если не делать Query.Last? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 15:36 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Glaysпочему фильтрация/сортировка/расчёт виртуальной колонки/выгрузка в эцих" работает медленнофильтрация/сортировка зафетченного набора данных даже в сотни тысяч записей работает быстро в любом приличном датасете как работает "расчёт виртуальной колонки" пожалуй зависит от вложенного в это смысла и содержание расчета что есть "выгрузка в эцих" непонятно но тоже весьма вероятно влияет качество реализации у меня юзвери порой и сотни тысяч записей с более чем сотней полей на клиента в cds тягают ч/з "мертвый" мидас ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 15:49 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Glays, Про Query.Last не понял... Можно поподробнее ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 15:50 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
ТростьGlays, Про Query.Last не понял... Можно поподробнее ТростьХотя если Mode = fmOnDemand и делаем Query.Last Что происходит если не делать Query.Last? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 16:05 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Причин может быть много. Присылай на darefiev at da-soft dot com: 1) Отчет об окружении - http://docwiki.embarcadero.com/RADStudio/Seattle/en/DBMS_Environment_Reports_(FireDAC) 2) Дамп таблицы или файл бэкапа БД PS: Обычно дело в клиенте SQL Server'а и в том как FireDAC выбирает тип курсора. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 17:19 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
GlaysТростьGlays, Про Query.Last не понял... Можно поподробнее ТростьХотя если Mode = fmOnDemand и делаем Query.Last Что происходит если не делать Query.Last? Если не делаем, то фетчим первые 50 строк (параметр по умолчанию). Если делаем Query.Last закачиваем 140т. строк. Всё таки считал что FireDAC в этом плане как минимум не будет уступать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 19:50 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
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.
Вы пишите, что есть несколько причин. Приведите хотя бы 2-3, чтоб можно было хоть что нибудь попробовать. PS: Обычно дело в клиенте SQL Server'а и в том как FireDAC выбирает тип курсора. Тут совсем ничего непонятно. Какой клиент SQL Server'а? Вы про нэатив-клиент (Found [SQL Server Native Client 10.0])? И какой тип курсора подойдёт для него? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 20:06 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
ТростьЕсли не делаем, то фетчим первые 50 строк (параметр по умолчанию). Если делаем Query.Last закачиваем 140т. строк. Спасибо капитан. Время выполнения то изменяется? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2015, 09:21 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
GlaysТростьЕсли не делаем, то фетчим первые 50 строк (параметр по умолчанию). Если делаем Query.Last закачиваем 140т. строк. Спасибо капитан. Время выполнения то изменяется? Нет не изменяется, уже писал выше по форуму. Повторюсь Mode = fmAll или Mode = fmOnDemand + Query.Last, скорость можно сказать не отличается ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2015, 09:37 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
ТростьНет не изменяется, уже писал выше по форуму. Повторюсь Mode = fmAll или Mode = fmOnDemand + Query.Last, скорость можно сказать не отличается Mode = fmAll или просто Mode = fmOnDemand Скорость отличается? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2015, 09:38 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
И медленней на пару сек. если: Mode = fmOnDemand, затем While not FireDacDataSet.Eof do FireDacDataSet.Next; ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2015, 09:39 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
GlaysТростьНет не изменяется, уже писал выше по форуму. Повторюсь Mode = fmAll или Mode = fmOnDemand + Query.Last, скорость можно сказать не отличается Mode = fmAll или просто Mode = fmOnDemand Скорость отличается? )))) Естественно! Или закачать с сервера 50 строк или закачать 140т. строк. Вопрос то в другом, почему через SSMS и через приложение на ADO время выполнения занимает 8 сек, а у FireDAC 32 сек.? И что можно попробовать сделать, чтоб ситуация на FireDAC изменилась, или этого просто невозможно сделать тк FireDAC не рассчитан на такую обработку ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2015, 09:43 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
1) Я так и не понял: Код: pascal 1. 2. 3.
и Код: pascal 1. 2.
как различаются по времени ? 2) В запросе: Код: sql 1.
поля как определены ? 3) Попробуй различные значения FetchOptions.CursorKind. что-то меняется ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2015, 10:39 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Dmitry Arefiev1) Я так и не понял: Код: pascal 1. 2. 3.
и Код: pascal 1. 2.
как различаются по времени ? 2) В запросе: Код: sql 1.
поля как определены ? 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сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2015, 11:26 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Так это говорит само за себя ... 1) FireDAC честно читает всю выборку на 29 сек. ADO за 216 сек. FireDAC судя по всему использует дефолтный MSSQL курсор. 3) При одном из других видов курсоров (не ckDefault) возможно время открытия будет меньше, но полное время выборки будет много больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2015, 18:41 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Dmitry ArefievТак это говорит само за себя ... 1) FireDAC честно читает всю выборку на 29 сек. ADO за 216 сек. FireDAC судя по всему использует дефолтный MSSQL курсор. 3) При одном из других видов курсоров (не ckDefault) возможно время открытия будет меньше, но полное время выборки будет много больше. А по Вашему мнению, почему SSMS вопрос выполняет 8сек.? он тоже грузит "нечестно"? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2015, 10:00 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Трость, Сервер MSSQL и SSMS запущены на одной машине? Есть вероятность что данные передаются через SharedMemory, все одно быстрее чем по TCP/IP ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2015, 10:20 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Трость, или как тебя там по имени ? 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.
У меня это занимает 110 мс. Если разкоментить - то 520 мс. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2015, 11:45 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
А для тех, у кого нет таблицы со 150,000 строками может сделать такой запрос: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2015, 11:48 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Попробуй сделать так:Какое-то идиотское усложнение. Почему не Last ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2015, 12:04 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
LSV, у автора вообще медленный газ. Он никак не может понять, что 1. у запроса есть время выполнения на сервере, до выдачи первой записи клиенту. 2. датасет на клиенте, в зависимости от того, как написан клиент и датасет, и от настроек, может а) показать первые несколько записей, дальше остановиться (или продолжить выборку записей в фоне, как автору уже сказали про SSMS) б) считать в кэш все записи, только потом их "показать". Соответственно, будет разное время 1+2а и 1+2б. Дальше. Если автор пишет про цикл while not Eof do Next, значит он предполагает ПОСЛЕДОВАТЕЛЬНУЮ обработку. А для этого буферизация выбираемых записей не нужна. Буферизация однозначно займет память (все 150к записей на клиента) и также увеличит время. Делает-ли буферизацию SSMS? Скорее всего нет. Если же нужна оценка выкачки всех записей в кэш датасета, то действительно нужен Last. А если нужен цикл while с обработкой записей, тогда кэшировать датасет не нужно. Мне больше другое интересно - почему открытие "простого запроса" (без джойнов и т.д.) занимает 8 секунд в SSMS? Если тупо написать select * from table хоть с миллионом записей, первые записи должны быть показаны МГНОВЕННО, речь должна идти про миллисекунды, а не секунды. Вот на таком запросе и надо сравнивать SSMS и FireDAC (с соответствующими настройками). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2015, 12:16 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
kdvпочему открытие "простого запроса" (без джойнов и т.д.) занимает 8 секунд в SSMS? Потому что SMSS не использует ни FireDac, ни TClientDataSet. Там скорее всего ADO.Net. Это же интересно и автору темы. Точнее, сомневаюсь что ему интересно. Главное - что бы у него работало так же. Но не работает. А вообще, сначала лучше попробуй сделать сам, прежде чем наезжать на автора темы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2015, 12:35 |
|
Медленное получение данных через TFDQuery (FireDAC)
|
|||
---|---|---|---|
#18+
Valery_BПотому что SMSS не использует ни FireDac, ни TClientDataSet. Там скорее всего ADO.Net. какая разница. механизмы выборки у всех серверов и клиентов одинаковы. Я имею в виду - выполнить запрос, выбрать запись, и т.д. Valery_BА вообще, сначала лучше попробуй сделать сам я с MS SQL не работаю. Только с InterBase и Firebird. К ним есть штук 20-30 разных компонент доступа, и штук 8 разных инструментов разработчика (типа SSMS), в которых все это проверяется практически моментально. В соответствующих форумах уже давно сравнивали FireDAC, IBX, dbExpress, FIBPlus, и др. компоненты на скорость выборки. Valery_Bпрежде чем наезжать на автора темы я не наезжаю, я констатирую. ему объясняют смысл уже вторую страницу темы. А он как будто не читает ответы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2015, 12:42 |
|
|
start [/forum/topic.php?fid=58&msg=39123941&tid=2036956]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
154ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 274ms |
0 / 0 |