Таймаут - максимальное время выполнения SQL запроса
Запросы SQL (язык структурированных запросов) нашли широкое применение среди пользователей геоинформационной системы ZuluGIS. Их преимущества перед простыми запросами к базам данных очевидны. Во-первых, они выполняются не к определенной базе данных, а сразу ко всем слоям и подключенным к ним базам данных и, во-вторых, диалект запросов дополнен в соответствии с OGC расширением языка SQL, что позволяет выполнять их не только текстовыми и числовыми данными, но и пространственными объектами на карте.
Сам язык запросов не так прост, тем более, когда приходится работать с пространственными наборами данных, которые содержат сотни тысяч объектов и записей. Когда вы работаете со слоями среднего и большого размера, написание наиболее эффективных запросов SQL является приоритетом. Не всегда удается сформировать эффективную конструкцию запроса к базе данных, тем более с первого раза. Неэффективно написанные запросы могут выполняться минутами, а в некоторых случаях часами, и чтобы прекратить их выполнение, необходимо останавливать работу программы. Запросы к слоям опубликованным на ZuluServer, при закрытии программы продолжают выполняться, тем самым занимают имеющиеся подключения к серверу.
Сравнение эффективности 2 запросов
На изображениях приведены примеры запросов, которые решают одну и ту же задачу к слою, с общим количеством объектов в карте 12978. С применением запросов SQL в базу данных потребителей заносится ID камеры, к которой он подключен, но второй выполняется в 100 раз быстрее. Причина долгого выполнения первого запроса кроется в том, операторы geometry плохо оптимизированы. Они удобны, но двойное сравнение геометрии объектов в рамках одного запроса лучше заменить простым оператором JOIN.
Начиная с версии ZuluGIS 8.0.0.7754 (дата релиза — 24.03.2021), введён таймаут (максимальное время) выполнения SQL запроса, значение таймаута по умолчанию — 60 сек. Это позволяет избежать зависаний при выполнении "продолжительных" запросов. По истечении времени таймаута выдаётся соответствующая ошибка.
Если запрос на обновление данных по объектам должен выполняться 100 секунд, а таймаут 60 секунд — данные не обновятся и отобразится сообщение о превышении таймаута.
Таймаутом можно управлять прямо в теле запроса, указав максимальное время в секундах, например:
SET TIMEOUT <число>;
SELECT <какой-то длинный запрос>;
Чтобы задать "бесконечный" таймаут используйте аргумент INFINITE:
SET TIMEOUT INFINITE;
SELECT <какой-то длинный запрос>;