我的查询是这样的。如果我只是在没有明确的情况下运行查询,则只需要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
答案 0 :(得分:3)
如果编写的示例是您的实际代码,则差异由您对查询的LIMIT进行说明。当您在没有DISTINCT的情况下运行它时,查询引擎可以只占用前200行。但是使用DISTINCT,它必须首先在整个表上运行才能找到不同的行,然后选择前200行。
答案 1 :(得分:1)
DISTINCT价格昂贵,ORDER BY ... UPPER()......成本高昂
在给出的查询中,似乎我可能不必要地使用DISTINCT或修复不应该存在的重复项。如果数据不好,请考虑修复它而不是解决它。
确保您构建了不区分大小写的索引 在mytable UPPER(LAST_NAME)上创建索引myindex