sys.objects 表存储在 SQL 数据仓库的控制节点上(而不是分布在计算节点上)。因此,此表上的 CETAS 由 1 个写入器线程执行,该线程在 blob 存储中创建 1 个文件。分布式表中的数据在 60 个分布中分片,因此 SQL DW 中分布式表上的 CETAS 将始终创建 60 个文件,每个分布并行写入 1 个文件。
强制为分布式表写入单个文件的一种解决方法是在语句的 SELECT 部分中使用 TOP 子句。
SELECT count(*) FROM dbo.Finance --N rows
CREATE EXTERNAL TABLE dbo.FinanceExternal
WITH ( LOCATION = '/finance/', DATA_SOURCE = AzureStorage, FILE_FORMAT = TextFile)
AS SELECT TOP N * FROM dbo.FinanceNew;
由于 TOP 表达式是在控制节点上计算的,因此分布式表的行将被移动到控制节点。随后,1 个写入器线程会将结果集写入 blob 存储中的单个文件。
是的,将来当 SQL DW 支持复制表时,复制表的 CETAS 将只创建一个文件。
萨哈伊
要了解 SQL DW 架构和控制/计算节点的作用,请参阅:https ://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-overview-what-is/