使用DISTINCT优化​​选择查询

时间:2014-12-23 05:50:49

标签: sql db2

我的查询是这样的。如果我只是在没有明确的情况下运行查询,则只需要11秒。虽然运行时需要46秒才能完成。关于如何优化它的任何建议?

SELECT * FROM ( 
SELECT DISTINCT   ELIGIBLE_TO_SIGN_DT 
 , LAST_NAME 
 , FIRST_NAME 
 , EXTENDED_LAST_NAME 
 , DT_OF_BIRTH 
 , BIRTH_COUNTRY_ID 
 , REG_BY 
 , LAST_UPDATED_BY 
 , REVIEW_STATUS_1 
 , REVIEW_STATUS_2 
 , REVIEW_STATUS_3 
 , MLSB_MATCH_FILTER 
 , REG_STATUS_ID 
 , REG_STATUS 
 , HAS_TRAVELED 
 , PLAYER_ID_SHOW 
 , MLSB_MATCH 
 , TRAINER_AGENT_NAME 
 , NATIONAL_ID 
 , RES_FOLLOW_UP 
 , ATTACHMENT 
 , COMMENTS 
 , PLAYER_ID 
 , CHECKBOX 
 , INTL_AMA_ENTRY_ID 
 , ALSO_REG_BY 
 , MIDDLE_NAME 
 , BIRTH_COUNTRY_NAME 
  FROM AS_INTL_ADMIN_REG_VIEW 
  where VARCHAR_FORMAT(ELIGIBLE_TO_SIGN_DT, 'YYYY-MM-DD') >= date('07/02/2015') AND VARCHAR_FORMAT(ELIGIBLE_TO_SIGN_DT, 'YYYY-MM-DD') <= date('08/31/2015') 
 )  order by  case when UPPER(LAST_NAME) is null or trim(UPPER(LAST_NAME)) = '' then 'ZZZZZZ' else UPPER(LAST_NAME) end ASC,  case when FIRST_NAME is null or trim(FIRST_NAME) = '' then 'ZZZZZZ' else FIRST_NAME end ASC
 limit 200 offset 0     

2 个答案:

答案 0 :(得分:3)

如果编写的示例是您的实际代码,则差异由您对查询的LIMIT进行说明。当您在没有DISTINCT的情况下运行它时,查询引擎可以只占用前200行。但是使用DISTINCT,它必须首先在整个表上运行才能找到不同的行,然后选择前200行。

答案 1 :(得分:1)

DISTINCT价格昂贵,ORDER BY ... UPPER()......成本高昂

在给出的查询中,似乎我可能不必要地使用DISTINCT或修复不应该存在的重复项。如果数据不好,请考虑修复它而不是解决它。

确保您构建了不区分大小写的索引 在mytable UPPER(LAST_NAME)上创建索引myindex