Производительность SnowFlake по группам по сравнению с разделами по сравнению с отдельными

У меня есть таблица в 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.


person ghost    schedule 26.05.2020    source источник


Ответы (1)


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

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

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

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

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

person Gokhan Atil    schedule 26.05.2020
comment
Да, я играл с профилем запроса и запускал разные запросы. Однако я увидел, что время работы group by было таким же, как и у partition over, поэтому я и задал этот вопрос. Я также попытался создать row number() over partition в качестве нового столбца RN, а затем извлек только те строки с RN=1. Это тоже, к моему величайшему удивлению, имело аналогичную производительность. - person ghost; 26.05.2020