
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
30.09.2003, 14:11
|
|||
|---|---|---|---|
|
|||
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Привет! Имеем подключение к SQL серверу FireBird через ODBC с использованием сквозных запросов. Как можно в VFP выполнить серию запросов след. образом: 1. Послать запрос на сервер (SQLExec или препаре - не суть), пуская он его молотит .... 2. Что-то поделать (обработать данные пред. запроса, подготовить какие-нибудь базочки и т.д.) 3. Получить от сервера результаты запроса (курсор). 4. Послать следующий запрос... 5. Обработать результаты первого ... 6. Послать следующий ... 7. Обработать рез. второго ... и т.д. Что-то я не никак не разберусь как надо использовать для этого SQLPrepare(), SQLExec(), SQLMoreResults() или что-то еще. С уважением Панов А.Ю. ООО "Такт" г.Сызрань ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.09.2003, 15:40
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Общая схема: * Устанавливаем соединение с сервером LOCAL lnCH lnCH=SQLStringConnect(...) * Устанавливаем асинхронный режим выполнения SQLSetProp(m.lnCH,'Asynchronous',.T.) * Выполняем запрос LOCAL lnResult lnResult=SQLExec(m.lnCH,'SELECT ...','Result') * Выполняем прочие действия проверяя не закончился ли еще предыдущий запрос DO WHILE m.lnResult=0 * Если попали сюда, то это значит, что асинхронный запрос еще не закончил * выполнения. Можно произвести ряд действий на клиентской машине * Убеждаюсь, что асинхронный запрос все еще продолжает выполняться m.lnResult=SQLExec(m.lnCH,'') ENDDO * Анализ выполненного асинхронного запроса DO CASE CASE m.lnResult>0 AND USED('Result') * Запрос выполнен успешно. Результат записан в курсор с именем "Result" CASE m.lnResult=-1 * В процессе выполнения запроса на сервере произошла ошибка * Анализ ошибки по AERROR() OTHERWISE * Выполнение запроса было прервано пользователем ENDCASE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.09.2003, 17:38
|
|||
|---|---|---|---|
|
|||
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Итак, после детального исследования механизма асинхронного выполнения SQL запросов можно сделать следующие выводы: 1. При выполнении Res=SQLExec(nConnect,'Select ....','Result') в асинхронном режиме VFP дожидается выполнения запроса полностью и поступления первой порции данных (т.е. начала фетча записей), после чего управление передается программе и далее при вызове очередного Res=SQLExec(nConnect) принимает очередную порцию данных (у меня по 100 записей). 2. Таким образом во время обработки запроса на сервере программа все равно простаивает. :((( А мне хотелось использовать это время для обработки других данных. У меня как раз и были "тяжелые" группировочные запросы, возвращающие небольшие курсоры. 3. Отсюда следует, что асинхронность выгодна при выполнении запросов не связанных с группировкой или сортировкой данных (GROUP BY, ORDER BY в запросах), а при длительных и тяжелых фетчах, когда записи выбираются медленно, в промежутках между поступлением записей можно что-то поделать. 4. Если после первого SqlExec() обратиться к полученному курсору (например спросить Reccount), то VFP все равно закачает все записи и пойдет дальше. Вот так! С уважением Панов А.Ю. ООО "Такт" г.Сызрань. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.10.2003, 12:26
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Что-то у Вас какие-то странные выводы получились. Асинхронный запрос именно потому так и называется, что его выполнение распаралелено с прочими процессами в FoxPro. 1. С какой стати ему ждать ПОЛНОГО выполнения запроса? -) Fox послал инструкцию на сервер и стал выполнять прочие операции не ожидая окончания выполнения этой инструкции -) Поступление очередных порций результата никак не завязано на факт подачи команд SQLExec(). Процесс-то асинхронный. Какое отношение имеет к нему прочие команды? -) Периодическая подача команды SQLExec() необходима для проверки состояния в котором находится выполнение асинхронного запроса. Если возвращает 0, то асинхронный запрос все еще выполняется. Все. Никакого другого "тайного" смысла в этой команде нет. -) Объем очередных порций данных регулируется настройкой CursorSetProp('FetchSize',...) 2. Нет, в процессе выполнения асинхронного запроса программа не простаивает. Скорее всего, Вы просто некорректно построили саму программу, вынуждая ее к простою. 3. Опять неправильный вывод 4. А вот с Reccount() как раз правильно. Но вовсе не потому о чем Вы подумали. Просто в процессе выполнения асинхронного запроса значение Reccount() непрерывно меняется и Fox не в состоянии прочитать его значение из заголовка временной таблицы до окончания процесса. Вот он и ждет пока процесс завершиться. Т.е. фактически Вы переходите в режим синхронного запроса. Вообще, просто нельзя пытаться выполнять какие-либо операции с результатом выполнения асинхронного запроса ДО окончания этого запроса, поскольку любая такая попытка фактически отменяет саму ассинхронность. Кроме того, необходимость в асинхронном запросе возникает, только если результат выполнения инструкции имеет значительный объем, или время выполнения этой инструкции очень значительно. В первом случае, возникает резонный вопрос: а зачем качать с сервера такую кучу информации? Т.е. у Вас крайне непродуманная идеология. Во втором случае следует отсылка к оптимизатору запросов. Вимдимо очень некорректно составлен сам запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.10.2003, 12:44
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
По поводу reccount() вот выдержка из фидо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.10.2003, 12:32
|
|||
|---|---|---|---|
|
|||
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Привет, Владимир! >Что-то у Вас какие-то странные выводы получились. Выводы на основе эксперимента по Вашей схеме. А Вы сами пробовали ? Скорее всего у Вас были простые запросы без группировки или сортировки. Вот код (проверки на ошибки и прочие "фантики" опущены): --------------------------------------------------- LOCAL lnRes,lnCount,lтConnect =SQLSetProp(lnConnect,'Asynchronous',.T.) lnRes=SQLExec(lnConnect,'SELECT ... FROM ... GROUP BY 1','TestRes') * Здесь пауза порядка неск. сек (пауза естественно зависит от запроса) lnCount=0 DO WHILE lnRes=0 WAIT WIND 'Запрос выполняется '+str(lnCount,5) NOWAIT lnRes=SQLExec(goIB.nConnect) lnCount=lnCount+1 ENDDO ------------------------------------------------------------ Так вот после подачи первой SQLExec имеем паузу - это выполняется запрос (счетчик в цикле не мелькает), а вот когда замелькал счетчик это пошел фетч, видно как записи увеличиваются в статусной строке. Этот же запрос я проверял в стороннем инструменте там точно такая же пауза перед началом фетча. >Асинхронный запрос именно потому так и называется, что его выполнение распаралелено с прочими процессами в FoxPro. Я тоже так думаю. Сервер молотит запрос, FoxPro может делать другую работу. >1. С какой стати ему ждать ПОЛНОГО выполнения запроса? Вот-вот я тоже так считаю. Только давайте определимся с термином "Полное выполнение запроса". Я применяю его к запросам имеющим группировку и сортировку. В этом случае сервер вначале производит выборку в свой внутренний "буфер", а затем уже сортирует или группирует. Может быть я и не прав, но как-то по другому это выполнить невозможно. А после выполнения он готов фетчить (пересылать) на клиента. При наличии запросов без группировки или сортировки, сервер практически сразу (время на препарацию запроса не берем в расчет) начинает выполнять запрос и одновременно фетчить на клиента. >-) Fox послал инструкцию на сервер и стал выполнять прочие операции не ожидая окончания выполнения этой инструкции Видимо все-таки ждет. >-) Поступление очередных порций результата никак не завязано на факт подачи команд SQLExec(). Процесс-то асинхронный. Какое отношение имеет к нему прочие команды? Т.е. вы хотите сказать, что если я "прочие команды" буду выполнять достаточно долго (допустим повешу MessageBox и буду ждать пять минут), то после подачи последнего и одного SqlExec() у меня в курсоре будет сидеть вся выборка? Это я и хотел бы получить, но что-то не выходит или "в консерватории что-то поправить" >-) Периодическая подача команды SQLExec() необходима для проверки состояния в котором находится выполнение асинхронного запроса. Если возвращает 0, то асинхронный запрос все еще выполняется. Все. Никакого другого "тайного" смысла в этой команде нет. При выполнении очередного SqlExec() почему увеличивается счетчик кол-ва записей в курсоре, а без оного не желает, из чего я и сделал вывод, что SqlExec фетчит очередную порцию. >-) Объем очередных порций данных регулируется настройкой CursorSetProp('FetchSize',...) Это понятно. >2. Нет, в процессе выполнения асинхронного запроса программа не простаивает. Скорее всего, Вы просто некорректно построили саму программу, вынуждая ее к простою. См. выше усе как Вы и советовали. >3. Опять неправильный вывод Возможно. >4. А вот с Reccount() как раз правильно. Но вовсе не потому о чем Вы подумали. Просто в процессе выполнения асинхронного запроса значение Reccount() непрерывно меняется и Fox не в состоянии прочитать его значение из заголовка временной таблицы до окончания процесса. Вот он и ждет пока процесс завершиться. Т.е. фактически Вы переходите в режим синхронного запроса. Собственно я так и понял и даже не спорю. >Кроме того, необходимость в асинхронном запросе возникает, только если результат выполнения инструкции имеет значительный объем, или время выполнения этой инструкции очень значительно. >В первом случае, возникает резонный вопрос: а зачем качать с сервера такую кучу информации? Т.е. у Вас крайне непродуманная идеология. Около 1000 записей содержащих движение по товару это разве "куча". Идеология как раз продуманная и качаем только то что нужно, а не для того чтоб было. >Во втором случае следует отсылка к оптимизатору запросов. Вимдимо очень некорректно составлен сам запрос. Ну уж не знаю, что может быть некоректного в выборке движения товара за определенный период, посредством запроса SELECT T.Wkod,SUM(T.Quan) FROM T WHERE T.DateDoc>='01.04.2003' and T.DateDoc<='30.04.2003' GROUP BY 1 Запрос конечно упрощен, там есть еще неск. join, но они все оптимизированы т.е. выполняются при помощи индексов. Давайте не заострять внимания на составлении запросов. Если будут вопросы по этому - спрошу отдельно. Для начала разберемся с асинхронностью. С уважением Панов Алексей Юрьевич ООО "Такт" г.Сызрань. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.10.2003, 13:30
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Я с аснихронными запросам вобщем-то не работал. Так разбирался для общего развития. Но решил специально проверить. Итак, есть таблица на MS SQL 7 SP4 порядка 40тыс записей и VFP6SP5 Установил коннект с номером 1 и сделал его асинхронным =SQLSetProp(1,'Asynchronous',.T.) Делаю запрос ?SQLExec(1,'SELECT TreeDevID,COUNT(*) FROM Devices GROUP BY TreeDevID') Что получилось: -) Значение 0 отобразилось мгновенно. Задержки не заметил. -) Счетчик записей меняется непрерывно с шагом 100 без дополнительных команд с моей стороны (в результате выборки около 2000 записей) Однако сделал такой запрос ?SQLExec(1,'SELECT COUNT(*) FROM Devices') Что получилось -) Значение 0 отобразилось мгновенно. Задержки не заметил -) Результат выборки не появился пока не дал дополнительную команду SQLExec(1,'') Ладно, делаю заведомо неоптимизируемый запрос ?SQLExec(1,"SELECT TreeDevID,COUNT(*) FROM devices WHERE NickName LIKE '%вал%' GROUP BY TreeDevID") Что получилось -) Значение 0 отобразилось мгновенно. Задержки не заметил -) Результат выборки не появился пока не дал дополнительную команду SQLExec(1,'') -) Счетчик добавляемых записей не отображается, однако сам процесс закачки видимо идет, поскольку если подождать достаточно долгое время (достаточное для выполнения запроса) и подать команду SQLExec(1,''), то получаю сразу всю выборку (по этому условию около 500 записей) Мои выводы: -) Я предполагаю, что задержка после подачи команды SQLExec() в твоем случае объясняется собственно большим количеством символов, которые необходимо передать серверу (сложный запрос). Для проверки этой идеи попробуй сделать на сервере хранимую процедуру с этим запросом и в SQLExec() просто запустить ее на выполнение -) В случае выполнения асинхронного запроса, последующая команда SQLExec(1,'') служит не для подкачки очередных порций результата, а для явного указания FoxPro завершения асинхронного процесса. Автоматического завершения асинхронного процесса не произойдет. -) Более того, необходимы как минимум 2 команды SQLExec(1,''). Первая создаст временный курсор содержащий результаты выборки, а вторая завершит асинхронный процесс. PS: Если в результате у тебя всего 1000 записей, то стоит ли заморачиваться с асинхронными запросами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.10.2003, 16:25
|
|||
|---|---|---|---|
|
|||
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Проверил еще раз, уже в командном окне. Имеем таблицу на FireBird 1.5 RC6 330 тыс записей. Подаю ? SqlExec(1,"SELECT Wkod,SUM(Quan) FROM ExpL GROUP BY 1") Возникает пауза порядка 6 секунд, затем отображается значение ноль и идет счетчик записи. Если не дождаться остановки счетчика записей, ? SqlExec(1) выдает ноль. Если дождались, то 1. Я согласен со всеми твоими выводами, кроме паузы возникающей после первого SqlExec(). Я думаю, что пауза возникает не из-за величины запроса, а из-за свойств SQL-сервера или ODBC драйвера. >PS: Если в результате у тебя всего 1000 записей, то стоит ли заморачиваться с асинхронными запросами? В случае одного запроса конечно не стоит, просто у меня выполняется несколько последовательных запросов ну и хочется при выполнении следующего обрабатывать результаты предыдущего, экономия времени как-никак. Спасибо за ответы. С уважением Панов Алексей. ООО "Такт" г.Сызрань. PS: А что у тебя за задача, в которой используешь VFP и MS SQL, а то в конференции по FireBird, VFP монстром обозвали и сказали нерационально его использовать для Sql-Сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.10.2003, 17:01
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
> Я думаю, что пауза возникает не из-за величины запроса, а из-за свойств > SQL-сервера или ODBC драйвера. Да, вероятнее всего задержка связана именно с ODBC. Но все-равно, мне кажется, что эта задержка не следствие выполнения чего-то там на самом сервере, а следстве затрудненности собственно передачи инструкции на сервер. Т.е. в твоем случае эти 6 секунд запрос "пропихивается" через ODBC > В случае одного запроса конечно не стоит, просто у меня выполняется > несколько последовательных запросов ну и хочется при выполнении > следующего обрабатывать результаты предыдущего, экономия времени как- > никак. Может имеет смысл забросить все эти запросы одним пакетом, а потом вытаскивать по SQLMoreResult() раз самым узким местом является именно процесс отправки запроса на сервер? Или через одну хранимую процедуру (не знаю, есть ли такие в FireBird) По поводу задачи: Ну вообще-то я особо с MS SQL не разбирался. Написал простенькую программу учета оргтехники в нашей организации с хранением истории ее перемещений от одного человека к другому. В чем выражается это "убожество" мне непонятно. Чем больше я занимаюсь программированием тем осторожнее обхожусь со словами особенно типа "монстр", "убожество". Скорее всего, тот кто это сказал наткнулся на невозможность использования в VFP какого-то подхода к которому он привык в другой среде. Например, мне очень нравится в FoxPro такая вещь как макроподстановка, но в других языках программирования этого или в принципе нет, или ее реализация крайне затруднена. А это значит, что придется использовать совсем другой стиль программирования. Кому же это понравится :) Ну и желательно все-таки "спорить о вкусе устриц с теми кто их ел" (с) (Жванецкий), только после того, как сам попробуешь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.10.2003, 17:57
|
|||
|---|---|---|---|
|
|||
Асинхронное выполнение SQL - запросов |
|||
|
#18+
>Да, вероятнее всего задержка связана именно с ODBC. Но все-равно, мне кажется, что эта задержка не следствие выполнения чего-то там на самом сервере, а следстве затрудненности собственно передачи инструкции на сервер. Т.е. в твоем случае эти 6 секунд запрос "пропихивается" через ODBC Попробовал дать ? SQLExec(1,'SELECT Wkod FROM ExpL WHERE Wkod=12345') Запрос возвращает одну запись, ответ последовал мгновенно. Т.е. дело не в отправке запроса на сервер. > Или через одну хранимую процедуру (не знаю, есть ли такие в FireBird) Угадал, раньше так и было, все запросы обрабатывались в ХП, но возникли непредвиденные проблемы с ODBC драйвером, не могущем разруливать уровни изолированности транзакций (FireBird версионник), т.е. два юзера не могли одновременно воспользоваться процедурой. Поэтому сейчас тупо переделываю на посылку серии запросов. (Пойми правильно это не проблема FireBird, там технология позволяет одновременно использовать процедуру хоть тысяче пользователей). >Скорее всего, тот кто это сказал наткнулся на невозможность использования в VFP какого-то подхода к которому он привык в другой среде. Опять угадал (ты случайно не телепат ли) именно так и сказали, "трудно совместить навигационный подход VFP с технологией Sql". > Например, мне очень нравится в FoxPro такая вещь как макроподстановка, но в других языках программирования этого или в принципе нет, или ее реализация крайне затруднена. А это значит, что придется использовать совсем другой стиль программирования. Кому же это понравится :) Совершенно верно. С уважением Панов Алексей. ООО "Такт" г.Сызрань ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.10.2003, 21:04
|
|||
|---|---|---|---|
|
|||
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Перекликается c темой немного, но, наверное, всё нижесказанное покажется полной ерундой. Задача - получить отклик из хранимой процедуры (SQLServer2000(SP3),VFP6(SP5)) во время её выполнения. На сервере SQL Server создал ХП в Northwind: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Вызываю ее из VFP через асинхронный коннект Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. Наблюдается следующее поведение: 1) при использовании {CALL} SQLExec возвращает управление всегда. 2) при использовании EXEC SQLExec возвращает управление не всегда: 2.а) при WAITFOR DELAY '00:00:01' в ХП управление не возвращается (по ESC не прерывается) 2.б) при WAITFOR DELAY '00:00:02' в ХП управление возвращается (по ESC прерывается) т.е. зависит от того, а что написано в ХП :-о Сильное подозрение, что такое поведение связано с настройками компьютера. Если Вас не затруднит, проверьте на Вашем компьютере. Ну и вопрос не относящийся к асинхронному выполнению непосредственно: отклики из ХП приходят как бы порциями. Объёмом порций я управляю через =SQLSetprop(0,"PacketSize",64) По-моему это не совсем, то что нужно. Как можно заставить ODBC пересылать ответ немедленно? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2003, 09:54
|
|||
|---|---|---|---|
|
|||
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Ну во первых у нас разные сервера и как следствие разные ODBC. Поэтому корректно сравнивать как мне кажется не получится. Настройки посмотреть без проблем, только вот какие и где (я не сисадмин поэтому в настройках сетей разбираюсь плохо). С уважением Панов Алексей. ООО "Такт" г.Сызрань ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2004, 19:25
|
|||
|---|---|---|---|
|
|||
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Те же проблемы при работе через Client Access 32-bit c As/400. Кто поможет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.08.2007, 18:29
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Асинхронный, не пакетный режим. Решил убрать ожидание системы, т.к. запрос очень тяжелый и выполняется около 2-ух минут. В это время окно фокса некрасиво висит. Решил попробовать следующий код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. на больших - вис системы на 2 минуты, затем ошибка: "Invalid call issued while executing a SQLEXEC() sequence" на строке "lnMoreResults=SQLMORERESULTS(_nCH,'c_tmp1',aInfo)" Если убрать ассинхронный режим, поставить пакетный режим, и соответственно убрать цикл DO WHILE ***ENDDO , тогда большой запрос обрабатывается на ура, хоть и долго. В чем проблема? Такое ощущение, что я чего то не то делаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.08.2007, 19:21
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Попробуй для проверки завершения в цикле Код: plaintext = 0 - выполняется > 0 - готово В комбинации с SQLMORERESULTS() не пробовал. Такой код в таймере работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.08.2007, 20:16
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Почитай тут http://www.caws.atnet.ru/vfox/sql_async.html Может что поможет. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.08.2007, 09:47
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
Разобрался только в одном, что это мне не нужно :) Запрос большой, с группировками, но результирующая таблица маленькая, прилетает с сервера за секунду, однако обработка самого запроса на сервере занимает 2 минуты. Как я понимаю, ассинхронный режим больше подходит при запросе большых объемов данных при относительно слабой сети. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.08.2007, 10:02
|
|||
|---|---|---|---|
Асинхронное выполнение SQL - запросов |
|||
|
#18+
GoshaSЗапрос большой, с группировками, но результирующая таблица маленькая, прилетает с сервера за секунду, однако обработка самого запроса на сервере занимает 2 минуты. Надо смотреть план запроса, его оптимизировать, 2 мин давольно большой интервал, если только это не сложный отчет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=41&tablet=1&tid=1588868]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 384ms |

| 0 / 0 |
