Spec-Zone.ru › MariaDB

ОГРАНИЧЕНИЕ СТРОК, ИСПЫТЫВАЕМЫХ

Синтаксис

SELECT ... FROM ... WHERE ...
[group_clause] [order_clause]
LIMIT [[offset,] row_count] ROWS EXAMINED rows_limit;

Аналогично параметрам LIMIT, rows_limit может быть как параметром подготовленного запроса, так и параметром хранимой программы.

Описание

Цель данной оптимизации — предоставить возможность прекращения выполнения SELECT заявлений, которые проверяют слишком много строк и, следовательно, используют слишком много ресурсов. Это достигается путем расширения LIMIT-описания — LIMIT ROWS EXAMINED number_of_rows . В случае возможности семантика LIMIT ROWS EXAMINED аналогична семантике обычного LIMIT (например, для агрегатных функций).

Запрос движок учитывает LIMIT ROWS EXAMINED-описание только во время выполнения запроса. Таким образом, описание игнорируется в следующих случаях:

  • Если запрос EXPLAIN.
  • Во время оптимизации запроса.
  • Во время вспомогательных операций, таких как запись в системные таблицы (например, журналы).

Описание не применяется к DELETE или UPDATE заявлениям, и при использовании в этих заявлениях приводит к синтаксической ошибке.

Воздействие этого описания таково:

  • Сервер подсчитывает количество прочитанных, вставленных, изменённых и удалённых строк во время выполнения запроса. Это учитывает использование временных таблиц и сортировку для промежуточных операций запроса.
  • Когда счётчик превышает значение, указанное в описании LIMIT ROWS EXAMINED, выполнение запроса прерывается как можно скорее.
  • Последствия прерывания запроса из-за LIMIT ROWS EXAMINED следующие:
    • Результат запроса является подмножеством полного запроса, в зависимости от того, когда движок запросов определил, что предел достигнут. Результат может быть пустым, если строки результата не могли быть вычислены до достижения предела.
    • Генерируется предупреждение следующего вида: «Выполнение запроса было прервано. Запрос проверил как минимум 100 строк, что превышает LIMIT ROWS EXAMINED (20). Результат запроса может быть неполным.»
    • Если обработка запроса была прервана во время filesort, возвращается ошибка в дополнение к предупреждению.
    • Если UNION был прерван во время выполнения одного из его запросов, последний шаг UNION всё ещё выполняется, чтобы получить частичный результат.
    • В зависимости от используемых стратегий соединения и других стратегий выполнения запроса, один и тот же запрос может вообще не дать результата или дать другое подмножество полного результата при прерывании из-за LIMIT ROWS EXAMINED.
    • Если запрос содержит предложение GROUP BY, последняя группа, где был достигнут предел, будет отброшена.

Описание LIMIT ROWS EXAMINED не может быть указано для каждого подзапроса. Для всего LIMIT ROWS EXAMINED-заявления может быть только одно SELECT описание. Если SELECT-заявление содержит несколько подзапросов с LIMIT ROWS EXAMINED, то учитывается тот, который был проанализирован последним.

Примеры

Простой пример описания:

SELECT * from t1, t2 LIMIT 10 ROWS EXAMINED 10000;

Описание LIMIT ROWS EXAMINED является глобальным для всего заявления.

Если составной запрос (такой как UNION, или запрос с производными таблицами или подзапросами) содержит более одного LIMIT ROWS EXAMINED, учитывается последний проанализированный. Таким образом, учитывается либо последний, либо внешний. Например, в запросе:

SELECT * FROM t1
WHERE c1 IN (SELECT * FROM t2 WHERE c2 > ' ' LIMIT ROWS EXAMINED 0)
LIMIT ROWS EXAMINED 11;

Учитываемый лимит — 11, а не 0.

Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают мнения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/limit-rows-examined/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API