Azure Synapse无服务器查询通配符性能



我试图从我的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。我可能在原始文件中使用了比重分区中更大的压缩级别,所以我没有读太多。

我的查询时间急剧下降。不幸的是,我的查询大小也急剧增加,所以我想买家要小心了。

最新更新