我试图从我的abfss v2容器查询拼花文件。该数据的结构如下:
daily/pricedate=2018-04-01/part-0.parquet
...
daily/pricedate=2022-11-16/part-0.parquet
如果我做这个查询(注意select
中的result.filepath(1)
和BULK
中的通配符:
SELECT top 10 cast(convert(datetime,result.filepath(1), 120) as date) as pricedate, col1, col2
FROM
OPENROWSET(
BULK 'daily/pricedate=*/*.parquet',
DATA_SOURCE='adls',
FORMAT = 'parquet'
)
with (
pricedate date,
col1 float,
col2 float)
as [result]
where result.filepath(1)='2022-10-31'
GO
则需要10-15秒
如果我像这样去掉通配符和where
:
SELECT top 10 cast(convert(datetime,'2022-10-31',120) as date) as pricedate, col1, col2
FROM
OPENROWSET(
BULK 'daily/pricedate=2022-10-31/*.parquet',
DATA_SOURCE='adls',
FORMAT = 'parquet'
)
with (
pricedate date,
col1 float,
col2 float)
as [result]
--where result.filepath(1)='2022-10-31'
GO
则需要0-2秒。
在这两种情况下,在MSQLMS中的消息下,它都显示Total size of data scanned is 3 megabytes, total size of data moved is 1 megabytes, total size of data written is 0 megabytes.
我尝试用collate
像这样包装result.filepath(1)
:(result.filepath(1) collate Latin1_General_100_BIN2_UTF8)
,但这是相同的性能。
我怎样才能使它们的性能,即使不相同,也比5倍的差异好呢?
似乎当Synapse在路径中看到通配符时,它会先扫描目录,然后再查看查询的其余部分。此目录扫描非常耗时,因此拥有大量分区的成本非常高。我接受了@GregGalloway的部分建议,并像这样重新分区:
yearmo/year=YYYY/month=MM/part-0.parquet
,分区的数量从近1700个blob增加到大约50个。我的文件大小从2mb变成了100mb。我可能在原始文件中使用了比重分区中更大的压缩级别,所以我没有读太多。
我的查询时间急剧下降。不幸的是,我的查询大小也急剧增加,所以我想买家要小心了。