我对Snowflake和ELT一般都是新手,在使用"Insert Into"VS将数据加载到Snowflake时,是否有显著的性能差异.从外部stage"复制到"?

是否会使用"INSERT INTO"而不是"COPY INTO"来逐行处理该数据?据我所知,这会损害像Snowflake这样的列式数据库的性能.

使用"INSERT INTO"将数据从外部阶段加载到Snowflake原始表:

-- BEGIN COPY INTO PROCESS
INSERT INTO ORDERS.RAW.FACT_ORDERS (
    ID,
ORDER_ID,
PRODUCT_ID,
PRODUCT_PRICE,
QUANTITY,
SALE_FACTOR,
FINAL_PRODUCT_PRICE,
PURCHASE_DATE,
ORDER_RETURN_FLAG,
RETURN_ID,
CUSTOMER_ID,
STORE_ID,
EMPLOYEE_ID,
_METADATA_PARTITION_DATE,
_METADATA_FILE_NAME,
_METADATA_CREATED_BATCH_ID,
_METADATA_UPDATED_BATCH_ID,
_METADATA_CREATED_DATE_TIME,
_METADATA_UPDATED_DATE_TIME
)
SELECT DISTINCT
    stg.$1,
    stg.$2,
    stg.$3,
    stg.$4,
    stg.$5,
    stg.$6,
    stg.$7,
    stg.$8,
    stg.$9,
    stg.$10,
    stg.$11,
    stg.$12,
    stg.$13,
    to_date($process_date, 'YYYYMMDD') as _METADATA_PARTITION_DATE,
    METADATA$filename::varchar(512) as _METADATA_FILE_NAME,
    $batch_id,
    $batch_id,
    $batch_timestamp,
    $batch_timestamp
FROM
    @ORDERS.RAW.STAGE (pattern => $file_pattern) stg

使用"复制到"将数据从外部stage加载到Snowflake原始表中:

-- BEGIN COPY INTO PROCESS
COPY INTO ORDERS.RAW.FACT_ORDERS (
    ID,
ORDER_ID,
PRODUCT_ID,
PRODUCT_PRICE,
QUANTITY,
SALE_FACTOR,
FINAL_PRODUCT_PRICE,
PURCHASE_DATE,
ORDER_RETURN_FLAG,
RETURN_ID,
CUSTOMER_ID,
STORE_ID,
EMPLOYEE_ID,
_METADATA_PARTITION_DATE,
_METADATA_FILE_NAME,
_METADATA_CREATED_BATCH_ID,
_METADATA_UPDATED_BATCH_ID,
_METADATA_CREATED_DATE_TIME,
_METADATA_UPDATED_DATE_TIME
)
SELECT DISTINCT
    stg.$1,
    stg.$2,
    stg.$3,
    stg.$4,
    stg.$5,
    stg.$6,
    stg.$7,
    stg.$8,
    stg.$9,
    stg.$10,
    stg.$11,
    stg.$12,
    stg.$13,
    to_date($process_date, 'YYYYMMDD') as _METADATA_PARTITION_DATE,
    METADATA$filename::varchar(512) as _METADATA_FILE_NAME,
    $batch_id,
    $batch_id,
    $batch_timestamp,
    $batch_timestamp
FROM
    @ORDERS.RAW.STAGE (pattern = $file_pattern) stg

我正在try 了解将大量数据从AWS S3加载到我的Snowflake原始表的最佳实践.

推荐答案

INSERT INTO - This is optimized to load the data in micro partitions in ideal state.
COPY INTO - This is optimized to just load the data.

因此,如果您有非常小的转换或没有转换(如您的示例),请使用INSERT INTO,但如果您有一些转换,请使用COPY INTO 按原样加载到临时表中,然后使用INSERT INTO对其进行转换.

在这种情况下,SELECT花费大部分时间,而不是INSERT,因此在运行两个SQL之后判断您的SQL配置文件以确定最佳解决方案.

Sql相关问答推荐

我可以将INSERT语句与SELECT一起使用来创建条件吗?

在SQL中创建一个计数器,根据BigQuery/SQL中的条件递归地添加行值

MariaDB查询在逗号分隔的字符串中查找多个值

如何从JSON数组中 Select 多个值

收到%1、%2或%2邮箱的唯一客户

PostgreSQL-按距离阈值挤压相邻行的性能

在子窗口SQL Presto中使用特定条件执行值计数

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

SQL:考虑合并分支计算分支的增长百分比

清理 XML 数据

使用row_number() over partition by保留首次出现且值不为空的行的方法

查询中获取审批者不起作用

SQL 函数 DIFFERENCE 返回有趣的分数

如何在 ClickHouse SQL 中使用 CTE 将邻居语句中的数字作为偏移量传递?

具有日期时间条件的存储过程

如何在一个存储过程中创建全局临时表,并在另一个存储过程中使用它

为每组填写行以进行旋转

CURRENT_ROW 窗口框架上的 SQL 滞后

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON

在现有日期列的查询结果中添加周数列