我想知道如何从table1中获取table3中具有匹配行的所有行。
表的结构是:
table1:
k1 k2
table2:
k1 k2 t1 t2 date type
table3:
t1 t2 date status
条件是:
如果考虑到三个表有数百万行,那么我怎么能做这个查询(内连接,存在,等等),所以它必须尽可能最优?
我有查询,这是肯定的,但它们太多条件让Teradata无法得到答案。我认为加入太多了。
答案 0 :(得分:1)
我不会将三个表和几百万行视为复杂查询。
在Teradata中,您通常不必考虑加入/存在/存在的内容,所有内容都将被重写为连接。但是这是一对多的关系,所以你应该避免加入,因为这需要最终的DISTINCT。
更好地使用IN或EXISTS:
SELECT
K1,K2
FROM Table1
WHERE (K1,K2) IN
(
SELECT K1,K2
FROM Table2
WHERE datecol = CURRENT_DATE
AND typecol = 'a'
AND (T1,T2) IN
(
SELECT T1,T2
FROM Table3
WHERE datecol = CURRENT_DATE
AND status = 'ok'
)
)
关于实际计划:如果有必要的统计数据,优化器应选择一个好的计划,检查Explain中的置信度。您还可以在运行Explain之前运行diagnostic helpstats on for session;
以查看是否缺少统计信息。
答案 1 :(得分:0)
以下内容应该有效。
SELECT
Table1.*
FROM
Table1
INNER JOIN Table2 ON
Table1.K1 = Table2.K1 AND
Table1.K2 = Table2.K2 AND
Table2.date = CURRENT_DATE and
Table2.type = 'a'
INNER JOIN Table3 ON
Table2.T1 = Table3.T1 AND
Table2.T2 = Table3.T2 AND
Table3.date = CURRENT_DATE and
Table3.status = "OK"
更多地谈到问题的优化部分。 Teradata最有可能采取的执行步骤是:
同时,它会选择Table1
的所有记录,Table2
date
为CURRENT_DATE
且type
为a
的记录1}}和表3中的记录date
为CURRENT_DATE
且status
为OK
。
然后,它会将SELECT
Table2
的结果加入SELECT
的{{1}}结果。
然后,它会将结果与table1
的{{1}}的结果相结合。
您可以在SELECT查询之前添加SELECT
来获取更多信息。从数据库返回的结果将是您的Teradata服务器将执行查询的解释,这在尝试优化大慢查询时非常有启发性。
不幸的是,上面的步骤是您可以期待的最佳选择。应用过滤器并行执行所有三个表,然后连接结果。对于大数据,查询中最慢的部分通常是连接,因此在进入该步骤之前进行过滤是一个很大的优点。
还可以采取更多措施进行优化,例如确保您的索引符合规定并收集统计信息,尤其是在您要过滤的字段上。但是如果没有管理员访问权限,你的双手就会被束缚。