本文属于【Azure Data Platform】系列。
接上文:【Azure Data Platform】Dedicated SQL Pool——导入性能测试(2)——CTAS
本文介绍SQL DW,也称Synapse Analysis,或者最新的Dedicated SQL Pool的外部导数工具的对比。
前言
继续使用上面搭建好的环境进行导入,这次使用Copy命令。这个命令同样是微软推荐的其中一种快速导入数据到SQL DW的方式之一。并且与Polybase相比,Copy命令所需的权限更低。因为它不需要外部表,外部数据源等,也不需要对数据库有control权限(INSERT 和ADMINISTER DATABASE BULK OPERATIONS 权限还是需要的 )。直接使用下面的语句来加载到SQL DW即可。另外, CTAS是创建新表,而Copy into默认不创建,直接导入现有表。不过copy into有一个auto_create_table的选项,如果设为on,则也可以创建新表, 只是这个新表可能在数据类型中会使用很多默认设定而无视于你实际的表,比如datetime类型会变成datatime2。
不过有个缺点,copy命令只能用于从外部导入到SQL DW,而不能从SQL DW导出数据来,Polybase则可以实现双向传输。
导入测试
--1:20:49
COPY INTO dbo.test_hash_cci_Copy
FROM 'https://存储账户名.dfs.core.windows.net/容器名/完整路径/*'
WITH ( FILE_FORMAT = [ParquetFF], CREDENTIAL = (IDENTITY = 'Managed Identity') )
go
--44:44
COPY INTO dbo.test_hash_heap_Copy
FROM 'https://存储账户名.dfs.core.windows.net/容器名/完整路径/*'
WITH ( FILE_FORMAT = [ParquetFF], CREDENTIAL = (IDENTITY = 'Managed Identity') )
go
--55:04
COPY INTO dbo.test_robin_cci_Copy
FROM 'https://存储账户名.dfs.core.windows.net/容器名/完整路径/*'
WITH ( FILE_FORMAT = [ParquetFF], CREDENTIAL = (IDENTITY = 'Managed Identity') )
go
--41:26
COPY INTO dbo.test_robin_heap_Copy
FROM 'https://存储账户名.dfs.core.windows.net/容器名/完整路径/*'
WITH ( FILE_FORMAT = [ParquetFF], CREDENTIAL = (IDENTITY = 'Managed Identity') )
go
导入后的表大小:
最后三种方法的对比结果:
从上面的表格看来,copy命令并没有官网说的那么神奇,官网说Copy会比CTAS也就是polybase好。但是由于测试的范围不够广,所以可以说的是,我个人会优先使用Polybase,其次才会考虑Copy。
如果对上一章有印象的话,应该记得Polybase如果需要获取最高性能,那么最好还是单个导入并且使用多文件。也就是说Polybase会更偏向于独占尽可能多的资源。而Copy则没有这方面的情况,在下一文会介绍一些细节。
Copy的好处在于它的并行。这个并行不是简单的并行,举个例子,Polybase导数的时候,使用的是CTAS命令也就是会在导入时create table。因为不可能同时create一个table,因此如果没有其他技术辅助,polybase只能同时导入一个表。而copy因为不需要创建表,所以它可以同时多会话导入到同一个表中实现并行导入,这一点也可以弥补在这里单表测试导入过程的性能差异。
但是我没法测试在多少并行的情况下,copy可以追上Polybase,因为在ADLS上的文件,往往时是随机分散的,我们通常会把文件夹下面的所有文件一次性导入,这一点就不容易使用多个copy会话来提升性能。
小结
综合这三篇结果,个人会偏向于使用Polybase作为首要加载工具,毕竟它不仅快,还可以导入导出。同时我会尽可能抛弃传统的导数工具。
但是有些因素在选择polybase还是copy时要关注的:
- 数据量的大小,如果是只需要一次或者少数导入导出,但是量很大,那么polybase是目前最好的选择。
- 如果无法独占资源(比如库正在使用但是又有必要导入时),那么copy会更好。
- 如果要同时实现导入导出,当然选择polybase。
- 是否追加数据?CTAS没法直接追加数据,而copy默认就是追加数据。
下一文,我打算讲一些技术细节,特别是在这三次导入时的一些监控数据。