#sql #netezza #sql-limit
#sql #netezza #sql-limit
Вопрос:
Исследуя несвязанную тему, я заметил использование LIMIT ALL в примере на веб-сайте IBM Knowledge Center для Netezza. Мне неясны преимущества указания LIMIT ALL здесь, и я прошу разъяснений по поводу объяснения (цитируемого ниже) от IBM. Когда мне может понадобиться указать LIMIT ALL?
SELECT CASE WHEN rand = .1 THEN 'A' WHEN rand = .2 THEN 'B' ELSE 'C' END
FROM (SELECT random() rand FROM tblA LIMIT ALL) subset
От IBM Knowledge Center:
«ОГРАНИЧЕНИЕ ALL в подзапросе предотвращает его включение в родительский запрос, а функция random() вызывается только один раз для каждой строки tblA, и, следовательно, один и тот же результат random() проверяется в каждом предложении WHEN».
Кстати … Мой вопрос не связан с использованием «random()» в примере IBM.
Спасибо!
Ответ №1:
Я понимаю, что для всех баз данных, которые поддерживают LIMIT
, LIMIT ALL
это то же самое, что использовать no LIMIT
.
В некоторых случаях это может использоваться, чтобы «подсказать» оптимизатору запросов создать план запроса определенным образом. Я полагаю, что приведенный выше отрывок взят из документации Netezza 7.0.
Ответ №2:
Я видел, что это часто используется при запросе представлений системного каталога (тех, которые начинаются с ‘_’), поскольку подсказка оптимизатора приведет к тому, что план НЕ будет извлекать все содержимое базовых таблиц каталога из базы данных (Postgres) на хосте и отправлять их содержимое в SPU. В целом, это хорошая идея попробовать.