我正在使用两个非常大的表(A是~20E6行,B是~65E3行),我有非常详细的where子句来获取我需要的项目。可以加快速度的一件事是首先评估条目的创建日期(信息可以追溯到10年以上,只需要过去3年);这样可以在进行昂贵的字符串处理之前消除大部分数据。有没有办法强制评估WHERE date > cutoff_date
在其他条款之前发生?
这是我的查询的样子。
SELECT A.C1, A.C2,
SUM(CASE WHEN B.C1 = '[condition 1]' OR ... [condition n] THEN 1 ELSE NULL END)
AS SUM_OF_B_C1, ... [other sums]
FROM DB.TABLE_A A LEFT JOIN DB.TABLE_B AS B ON B.COMMON_COL = A.COMMON_COL
WHERE B.DATE > DATE('[cutoff date]')
AND [complex substr conditions]
AND NOT [other complex string conditions]
GROUP BY A.C1, A.C2
一个问题是,我只有DB的读权限。通过控制中心查看,表A或B上似乎没有索引,因此优化路径已经用完。
你能提供的任何帮助都会很棒;我的小测试查询大约花了5分钟,产品查询大约要大20倍。
答案 0 :(得分:2)
尝试超越现代查询优化器通常不会很有效率。我想你应该把时间花在做其他两件事上。
EXPLAIN PLAN
的输出。这个
让您通过显示代码的数字来管理
死得慢不是因为你不称职,而是因为具有 no 索引的表通常由程序生成,以简化查询和报告,或减少主数据库服务器上的负载。找出谁负责那些计划。和他们交朋友。给他们买披萨。想想“社会工程”。
答案 1 :(得分:0)
您可以在SELECT statement中使用WITH子句:
WITH
B2(col1, col2, ... ) AS (
SELECT col1, col2, ...
FROM DB.TABLE_B AS B
WHERE B.DATE > DATE('[cutoff date]')
)
SELECT A.C1, A.C2,
SUM(CASE WHEN B2.C1 = '[condition 1]' OR ... [condition n] THEN 1 ELSE NULL END)
AS SUM_OF_B_C1, ... [other sums]
FROM DB.TABLE_A A LEFT JOIN B2 ON B2.COMMON_COL = A.COMMON_COL
WHERE
AND [complex substr conditions]
AND NOT [other complex string conditions]
GROUP BY A.C1, A.C2