ZEOS на Delphi7 - ZQuery1.Open - ›очень медленно

Я использую Delphi-7 и zeos 6.6.4 (и только сейчас обновляюсь до zeos 7.1.4) для больших строк таблицы, все становится очень очень медленно при запросе. Строк тоже не так много (на salesdetail в моей таблице было около 200 тыс. Строк). после того, как я сделаю резервную копию и почищу таблицу, это очень быстро.

Я почти уверен, что проблема в ZQuery1.Open. Я копирую и вставляю «поисковый / выборочный запрос» и запускаю его на mysql, и это заняло всего 1 секунду или около того. -> Так что я уверен, что это не вина моего запроса. Но если я выполню его на Delphi7, это займет около 15 секунд.

Я провел некоторую трассировку и обнаружил, что проблема в ZQuery1.Open, после передачи этого кода все работает с нормальной скоростью.

попробовал обновить zeos до последней версии, но проблема не устранена.

какие решения?

Спасибо.

РЕДАКТИРОВАТЬ: я читал аналогичный случай по этому поводу:

"guyvdb писал: Здравствуйте, мы также провели несколько тестов и пришли к такому же выводу. 'qry.open' работает очень медленно с ZEOS. Скорость значительно лучше с 'ADO' и 'SQLDirect' Отключение определения отладки в zeos.inc не ничего не меняю ".

http://zeoslib.sourceforge.net/viewtopic.php?t=120

Я в значительной степени предпочитаю продолжать использовать zeos, не изменен на ADOquery и т.д., потому что приложение уже завершено, проблема обнаружена через несколько месяцев после использования, после больших данных в таблице. и будет много работы, чтобы изменить все zquery на что-то еще . Спасибо


person Stevanus Lianto    schedule 31.08.2017    source источник
comment
Связан ли ваш запрос с какими-либо элементами управления с учетом данных? Если это так, они могут реагировать на события данных. Таким образом, 15 секунд, которые вы измерили для Open, могут включать, например, сетка, загружающая 200000 записей, а не только запросы данных.   -  person nil    schedule 31.08.2017
comment
не должно быть, потому что в этом случае мой zquery1 создан в частном порядке только для выполнения этого запроса, после того, как zquery создан, заполнен zquery.sql, а затем zquery.open. Никакое другое использование / загрузка сетки и т. Д. Тот же запрос работает быстро менее 1 секунды на mysql. Я нашел аналогичный случай, пожалуйста, обратитесь к моему отредактированному OP   -  person Stevanus Lianto    schedule 31.08.2017
comment
Вам действительно нужно получить столько строк? Какие-либо поля BLOB-объектов в таблице, которые могли быть обработаны вместе с другими данными? У вас есть какие-либо индексы, определенные в компоненте? Разница вполне может происходить из-за того, что ADO извлекает только живое окно (200 тыс. Строк за 1 секунду подозрительно быстро), а не все кортежи (поскольку они могут быть извлечены позже при прокрутке набора данных), в то время как Zeos извлек их все (звучит 15 секунд). хотя довольно много).   -  person Victoria    schedule 31.08.2017
comment
Привет, Виктория, Нет .. 200k - это всего строк в таблице salesdetail, но я получаю только 2-10 строк по каждому запросу. Мой запрос просто такой: выберите продажи и совместите с подробностями продаж, где id = xxx. При менее чем 100 тыс. Строк в таблице salesdetail со скоростью не проблема для zeos, но как только моя таблица станет больше (около 200 тыс. ++), она также станет медленнее.   -  person Stevanus Lianto    schedule 31.08.2017
comment
Что вы имеете в виду под большими строками? Можете ли вы воспроизвести то же самое без соединения (если вы запустите WHERE ID IN (...))? Вы запускаете свой сервер на локальном компьютере? Пока не могу воспроизвести (Zeos 7.1.4) ..   -  person Victoria    schedule 31.08.2017
comment
Сколько памяти у Delphi? Зеос? Пожалуйста, добавьте «запрос», SHOW CREATE TABLE table_name (s), SHOW INDEX FROM table_name (s) к вашему вопросу для документации.   -  person Wilson Hauck    schedule 31.08.2017
comment
Я добавлю более подробную информацию как можно скорее, мой ноутбук находится в офисе .. Но, как я уже сказал, сам запрос в порядке, поскольку он выполняется быстро, если тестируется на mysqlyog, на локальном сервере. "большие строки" я имею в виду, если в таблице больше 100k + данных. Я сделал простой тест, поставил showmessage 1,2,3,4,5 на delphi. «1» после заполнения zquery.sql, текст, затем «2» прямо перед zquery.open и «3» сразу после zquery.open, 4 и 5 позже. showmessage 1 и 2 прибывают быстро ... затем 3 нужно 15 секунд, чтобы появиться, затем 4,5, тоже быстро .. Так что это вроде застряло в zquery.open.   -  person Stevanus Lianto    schedule 31.08.2017
comment
Что ж, я провел быстрый тест с более чем 100 тыс. Кортежей без проблем с производительностью. Я бы немедленно профилировал приложение, страдающее чем-то вроде этого, чтобы найти узкое место.   -  person Victoria    schedule 01.09.2017
comment
Я попытался создать тестовое приложение, простую кнопку для печати «моего запроса на печать» на виртуальном принтере / симпатичном pdf. Я обнаружил, что с низкими рекодами на моем подробном столе он печатается очень быстро, менее 1 секунды или около того. Но с 200k записей потребовалось 15 секунд. затем я попытался переключить принтер на принтер TMU-220 / необработанную печать. Это заняло даже больше времени, 30 секунд или около того. Он отправляет задания буферизации, но затем задерживается на долгое время, прежде чем продолжить печать. С низкими записями в таблице salesdetail я никогда не обнаруживал этих проблем. (Я сбрасываю db два раза в год. Эта медленная проблема появляется в месяцы 8 ++, я хочу сбросить по крайней мере один раз в год).   -  person Stevanus Lianto    schedule 14.10.2017


Ответы (1)


Установка на TZConnection.SQLHourGlass := false

person András Babar    schedule 01.09.2017