我有一个parquet文件并创建了一个新的外部表,但是与突触中的普通表相比,性能非常慢。你能告诉我如何克服这个吗?
非常宽泛的问题。所以我会给出一个大致的答案:
- 使用正常表。难以击败"普通表"的性能;使用外部表。"正常table"表示使用
CREATE TABLE
在专用SQL池中创建的表。如果从一个或多个表中重复查询数据,并且每个查询都是不同的(group-by, join, selected columns),那么您无法获得优于"正常"的性能。 - 了解并应用基本的最佳实践:
使用拼花格式,你正在做的。
选择正确的分区列,并通过将分区存储到不同的文件夹或文件名来对数据进行分区。
如果查询的目标是单个大文件,那么将其拆分为多个较小的文件将会受益。
尽量保持您的CSV(如果使用CSV)文件大小在100 MB和10 GB之间。
使用正确的数据类型
手动创建CSV文件的统计信息
使用CETAS增强查询性能和连接
…还有更多。
a)第一步是使用相关的分区列(如年、月和日期)对Parquet File进行分区。
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 ...
)
裁判:https://www.serverlesssql.com/certification/mastering - dp - 500考试查询分区——来源——- azure storage/