改善Teradata中的复杂查询

时间:2014-10-14 14:43:28

标签: teradata

我想知道如何从table1中获取table3中具有匹配行的所有行。

表的结构是:

table1:
k1 k2

table2:
k1 k2 t1 t2 date type

table3:
t1 t2 date status

条件是:

  • k1和k2必须与table2中的相应列匹配。
  • 在表2中,我只会查看日期='今天'并输入=' a'。
  • 表2中可以返回0行,1行或多行。
  • 查看表2中的t1和t2,得到表3中匹配的行。
  • 如果在表3中日期='今天'和status =' ok',我将从table1返回原始行,这是k1和k2。

如果考虑到三个表有数百万行,那么我怎么能做这个查询(内连接,存在,等等),所以它必须尽可能最优?

我有查询,这是肯定的,但它们太多条件让Teradata无法得到答案。我认为加入太多了。

2 个答案:

答案 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最有可能采取的执行步骤是:

  1. 同时,它会选择Table1的所有记录,Table2 dateCURRENT_DATEtypea的记录1}}和表3中的记录dateCURRENT_DATEstatusOK

  2. 然后,它会将SELECT Table2的结果加入SELECT的{​​{1}}结果。

  3. 然后,它会将结果与table1的{​​{1}}的结果相结合。

  4. 您可以在SELECT查询之前添加SELECT来获取更多信息。从数据库返回的结果将是您的Teradata服务器将执行查询的解释,这在尝试优化大慢查询时非常有启发性。

    不幸的是,上面的步骤是您可以期待的最佳选择。应用过滤器并行执行所有三个表,然后连接结果。对于大数据,查询中最慢的部分通常是连接,因此在进入该步骤之前进行过滤是一个很大的优点。

    还可以采取更多措施进行优化,例如确保您的索引符合规定并收集统计信息,尤其是在您要过滤的字段上。但是如果没有管理员访问权限,你的双手就会被束缚。