使SQL查询更有效

时间:2018-01-23 12:31:43

标签: sql sql-server join db2 ibm-cloud

所以我是SQL的新手,并尝试构建一个查询来加入和检索DB2 Warehouse on Cloud中不同表的数据。我想提高效率,以便更快地检索数据。这是我的SQL语句:

SELECT ML_ANOMALY_DETECTION.DATETIME, 
       ML_ANOMALY_DETECTION.TAG_NAME, 
       ML_ANOMALY_DETECTION.MLAD_VALUE AS INDEX, 
       PARENT.MLAD_VALUE AS SCORE, 
       ML_MEASURE.MLAD_VALUE AS VALUE, 
       DATA_CONFIG.TAG_DESCRIPTION AS TAG_DESCRIPTION, 
       DATA_CONFIG.UNITS AS UNITS 
  FROM ML_ANOMALY_DETECTION AS ML_ANOMALY_DETECTION 
  LEFT JOIN ML_ANOMALY_DETECTION AS PARENT 
    ON (ML_ANOMALY_DETECTION.DATETIME = PARENT.DATETIME AND ML_ANOMALY_DETECTION.TAG_NAME = PARENT.TAG_NAME) 
 INNER JOIN ML_MEASURE 
    ON (ML_ANOMALY_DETECTION.DATETIME = ML_MEASURE.DATETIME 
   AND ML_ANOMALY_DETECTION.TAG_NAME = ML_MEASURE.TAG_NAME) 
 INNER JOIN DATA_CONFIG 
    ON (ML_ANOMALY_DETECTION.TAG_NAME =DATA_CONFIG.TAG_NAME) 
 WHERE (ML_ANOMALY_DETECTION.DATETIME BETWEEN '2017-11-25 06:57:00' 
        AND '2017-11-25 07:36:00') 
   AND (ML_ANOMALY_DETECTION.MLAD_METRIC='ANOMALY_INDEX' 
        AND PARENT.MLAD_METRIC='ANOMALY_SCORE')
   AND (ML_ANOMALY_DETECTION.TAG_NAME='VAR1' 
        OR ML_ANOMALY_DETECTION.TAG_NAME='VAR2')
  1. 所以为了解释它,我有三张桌子。一个包含变量名称,日期,类型和值。在这个表中,我有两种不同的类型(ANOMALY_INDEX / SCORE)。我想首先加入具有相同DATETIME和TAG_NAME但具有不同类型的两行的值。
  2. 然后我想加入上面的第二个表中一行的值,其中DATETIME和TAG_NAME应该是相同的。
  3. 在此之后,我想检索有关每个标记(UNITS和TAG_DESCRIPTION)的信息,因此我需要从包含相同TAG_NAME的表中加入一行。
  4. 上表应在特定日期之间过滤,并使用我选择的代码。
  5. 希望我解释得足够好。是否有可能提高效率?

1 个答案:

答案 0 :(得分:3)

首先,您需要用于加入的列的索引。

其次,这是你的where条款:

WHERE (ad.DATETIME BETWEEN '2017-11-25 06:57:00' AND '2017-11-25 07:36:00') AND 
      ad.MLAD_METRIC = 'ANOMALY_INDEX' AND
      p.MLAD_METRIC = 'ANOMALY_SCORE' AND 
      ad.TAG_NAME IN ('VAR1', 'VAR2')

(为了便于阅读,我添加了表别名并使用IN而不是OR。)

对于这些条件,我建议在ML_ANOMALY_DETECTION(mlad_metric, datetime, tag_name)上添加一个附加索引。