Производительность SnowFlake в группе по сравнению с разделом по сравнению с отдельными - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица в Snowflake. Один из столбцов в таблице называется obj_key (ключ объекта). Размер таблицы очень велик (в ТБ), поэтому желательна производительность.

Теперь новая запись добавляется в таблицу каждый раз, когда выполняется обновление объекта. Вновь вставленная строка имеет тот же obj_key, но другую запись в столбце time_modified. Предположим, я хочу получить из таблицы отдельные obj_key при определенных условиях.

У меня есть три подхода:

Подход 1:

SELECT obj_key 
FROM my_table
WHERE some_condition
GROUP BY obj_key;

Подход 2:

SELECT distinct(obj_key) 
FROM my_table
WHERE some_condition;

Подход 3:

SELECT obj_key
FROM my_table
WHERE some_condition
QUALIFY ROW_NUMBER() OVER (PARTITION BY obj_key ORDER BY obj_key) = 1;

По сути, мой вопрос сводится к следующему:

Я читал, что distinct для нескольких столбцов выполняется group_by(col1, col2, ..., col n). Итак, как производительность отличается на двух (если есть)?

Поскольку PARTITION BY также требует ORDER BY, разве это не сильно снижает производительность?

Мне бы хотелось, если бы кто-нибудь смог подробно рассказать, как эти запросы выполняются в SnowFlake. .

1 Ответ

1 голос
/ 26 мая 2020

Первые два запроса могут быть выполнены с одним и тем же планом выполнения в зависимости от ожидаемой мощности Snowflake.

Ваш третий подход будет использовать оператор оконной функции, и это, вероятно, займет больше времени.

Поскольку у вас есть набор данных, я бы НАСТОЯТЕЛЬНО порекомендовал вам провести свои собственные тесты и понаблюдать за планами выполнения и производительностью:

https://docs.snowflake.com/en/user-guide/ui-query-profile.html#how -to-access- query-profile

На самом деле, я провел несколько тестов с базой данных SNOWFLAKE_SAMPLE_DATA, и я вижу, что первые два запроса выполняются с одним и тем же планом выполнения и работают лучше, чем третий запрос.

...