Останавливает ли обработка snowflake TOP / Limit / Fetch обработку, как только находит достаточно строк?

#snowflake-cloud-data-platform #snowflake-schema

#snowflake-cloud-data-platform #snowflake-schema

Вопрос:

Когда вы используете предложение Snowflake TOP в запросе, прекращает ли механизм SQL Server поиск строк, когда их достаточно, чтобы удовлетворить TOP X, который необходимо вернуть?

Ответ №1:

Я думаю, это зависит от остальной части вашего запроса. Например, если вы используете TOP 10 , но не указываете order by значение then yes, оно остановится, как только будут возвращены 10 записей, но ваши результаты недетерминированы.

Если вы используете an order by , то сначала должен быть выполнен весь запрос, прежде чем можно будет вернуть 10 лучших результатов, но ваши результаты будут детерминированными.

Вот реальный пример. Если я запускаю select в SAMPLE_DATA.TPCH_SF10000.CUSTOMER таблице с помощью a limit 10 , он возвращается через 1,8 секунды (без кэширования). В этой таблице 1 500 000 000 строк. Если я затем проверю план запроса, он отсканировал только небольшую часть таблицы, 1 из 6 971 раздела:

введите описание изображения здесь

Вы можете видеть, что он вернется, когда 10 записей будут переданы обратно из начального сканирования таблицы, поскольку ему больше нечего делать.

Комментарии:

1. я не применяю order by , но я вижу, что для этого все равно требуется то же время выполнения, что и без предложения top

2. Какова ваша полная инструкция SQL? Мое объяснение order by — это всего лишь пример того, когда это не остановится.

Ответ №2:

Из моего тестирования и понимания это не останавливается. Обычно вы можете видеть, что последним шагом в плане выполнения является шаг «limit». Вы также можете увидеть, что происходит, просмотрев планы выполнения. Обычно вы увидите ОГРАНИЧЕНИЕ (или что-то еще) после полной обработки. Кроме того, если вы берете запрос, который выполняется, скажем, 20 секунд без ОГРАНИЧЕНИЯ (или аналогичный), и добавляете ОГРАНИЧЕНИЕ, вы обычно не увидите никакой разницы во времени выполнения (но помните о времени выборки). Обычно я запускаю тестирование производительности запросов в пользовательском интерфейсе, чтобы избежать проблем с клиентскими инструментами, которые могут ввести вас в заблуждение из-за ограничений на обработку и / или использование курсоров.