我想提高我的 Snowflake SQL 查询性能

问题描述 投票:0回答:1

我有一个雪花查询,我正在尝试提高性能。

WITH CTE AS
(
  SELECT DISTINCT
      AC
  FROM "DB1"."SCHEMA1"."TABLE1"
  WHERE
      AG   = 'PPPPPP'
      AND MG = 'CCC'
      AND MC IN ('11')
)
SELECT
    c.AC
    ,VC
    ,VA
FROM "DB2"."SCHEMA2"."TABLE2" v
INNER JOIN CTE c ON v.AC = c.AC
WHERE
   SC = 70
   AND VC IN ( 'V1', 'V2' , 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20', 'V21', 'V22', 'V23', 'PP', 'HH' )
   AND GG = 'PPPPPP'

第一个子查询速度很快,返回 57,936 行。

"DB1"."SCHEMA1"."TABLE1"
表有 22,852,551 行 (239.7 MB),没有聚类依据。

各列是:

Columns | Data Type
MI| NUMBER(38,0)
MG| VARCHAR(16777216)
MC| VARCHAR(16777216)
MN| VARCHAR(16777216)
AI| NUMBER(38,0)
AG| VARCHAR(16777216)
AC| VARCHAR(16777216)
AN| VARCHAR(16777216)
RR| VARCHAR(16777216)

第二个子查询(和总查询)很慢并且返回 1,448,400 行。

"DB2"."SCHEMA2"."TABLE2"
表有 23,449,693,351 行 (324.4 GB),并按
LINEAR(GG,SC)
进行聚类。

Statistics
Bytes scanned 13.32GB
Percentage scanned from cache 0.00%
Bytes written to result 14.37MB

Pruning
Partitions scanned 2,411
Partitions total 21,514

最初没有集群,但是添加这个集群提高了性能。

各列是:

Columns | Data Type
AC | VARCHAR(64)
GG | VARCHAR(64)
NN | VARCHAR(16777216)
SC | VARCHAR(2)
GI | NUMBER(10,0)
VC | VARCHAR(16777216)
WU | VARCHAR(255)
VV | FLOAT

如何提高该查询的性能?我尝试了不同的查询修剪技术,例如不使用 CTE、使用临时表、不同的 JOIN ON 等。

查询从 75 秒(无集群)变为 25 秒(有集群),但我希望它低于 5 秒。

请参阅雪花查询执行计划:

sql snowflake-cloud-data-platform query-optimization sqlperformance
1个回答
0
投票

这必须将子查询中每一行的字段与第二个表中的每一行进行比较。 57,936 * 23,449,693,351 为 1,358,581,433,983,536。需要进行超过一万亿次的潜在比较。 5秒可能是雄心勃勃的。

值得庆幸的是,索引可以提供帮助。这里最重要的索引是第二个表。在不知道列的选择性的情况下很难确定,但我怀疑

(SC, GG, AC)
的索引,按顺序和相同的索引(而不是单独的索引)会有所帮助。

初始子查询中的

DISINCT
还会清除第一个表中可能有帮助的任何索引。如果数据库知道其行按
AC
顺序排列,那么它会更加高效。因此,您可能会通过
(AC, AG, MG)
上的第一个表的索引获得更好的性能,您还可以直接 JOIN 两个表,然后在 JOIN 之后通过 GROUP BY 或类似方法将每个 AC 缩小到一行...但这对我来说很难来预测这一点。

© www.soinside.com 2019 - 2024. All rights reserved.