我有一个镶木地板文件并创建了一个新的外部表,但与突触中的普通表相比,性能非常慢。你能告诉我如何克服这个问题吗?
非常广泛的问题。所以我会给出广泛的答案:
CREATE TABLE
在专用 SQL 池中创建的表。如果您重复查询一个或多个表中的数据,并且每个查询都不同(分组、联接、选定列),那么您无法获得带有外部表的“普通”表的性能。使用您正在做的镶木地板格式。
选择正确的分区列并通过将分区存储到不同的文件夹或文件名来对数据进行分区。
如果查询针对单个大文件,您将受益于将其拆分为多个较小的文件。
尝试将 CSV(如果使用 csv)文件大小保持在 100 MB 到 10 GB 之间。
使用正确的数据类型。
手动创建 CSV 文件的统计信息
使用 CETAS 增强查询性能和联接
...还有更多。
a) 第一步是使用相关分区列(例如年、月和日期)对 Parquet 文件进行分区。
b) 我建议使用视图而不是外部表作为第二个建议。外部表不支持分区修剪,并且不会在读取过程中使用分区列来消除不必要的文件。
c) 确保强制执行数据类型,并且正确使用字符串类型。
d) 如果可能,将 Parquet 文件转换为 Delta 格式。 Synapse 能够从 Delta 读取分区列,而无需使用
filepath()
和 filename()
函数。外部表不支持 Delta,仅支持视图。
注意:外部表不支持 Parquet 分区列。
SELECT *,
CAST(fct.filepath(1) AS SMALLINT) AS SalesOrderPathYear,
CAST(fct.filepath(2) AS TINYINT) AS SalesOrderPathMonth,
CAST(fct.filepath(3) AS DATE) AS SalesOrderPathDate
FROM
OPENROWSET
(
BULK 'conformed/facts/factsales/*/*/*/*.parquet',
DATA_SOURCE = 'ExternalDataSourceDataLake',
FORMAT = 'Parquet'
) AS fct
WITH
(
ColA as String(10),
ColB as Integer,
ColC as ...
)