#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 секунд без ОГРАНИЧЕНИЯ (или аналогичный), и добавляете ОГРАНИЧЕНИЕ, вы обычно не увидите никакой разницы во времени выполнения (но помните о времени выборки). Обычно я запускаю тестирование производительности запросов в пользовательском интерфейсе, чтобы избежать проблем с клиентскими инструментами, которые могут ввести вас в заблуждение из-за ограничений на обработку и / или использование курсоров.