加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 此SELECT查询需要180秒才能完成

发布时间:2020-12-12 16:35:03 所属栏目:MsSql教程 来源:网络整理
导读:更新: 只是在更明显的地方提及它.当我更改IN为=时,查询执行时间从180下降到0.00008秒.可笑的速度差 这个SQL查询需要180秒才能完成!怎么可能?有没有办法优化它来更快? SELECT IdLawVersionValidFrom FROM question_law_version WHERE IdQuestionLawVersion
更新:

只是在更明显的地方提及它.当我更改IN为=时,查询执行时间从180下降到0.00008秒.可笑的速度差

这个SQL查询需要180秒才能完成!怎么可能?有没有办法优化它来更快?

SELECT IdLawVersionValidFrom 
FROM question_law_version 
WHERE IdQuestionLawVersion IN 
  (
  SELECT MAX(IdQuestionLawVersion) 
  FROM question_law_version 
  WHERE IdQuestionLaw IN 
    (
    SELECT MIN(IdQuestionLaw) 
    FROM question_law 
    WHERE IdQuestion=236 AND IdQuestionLaw>63
    )
  )

每张表中只有约5000行,所以不应该这么慢.

解决方法

(发表我的评论作为一个答案,显然这样做有所作为!)

Any difference if you change the IN
to =?

如果有人想进一步调查,我刚刚做了一个测试,发现它很容易复制.

创建表

CREATE TABLE `filler` (
  `id` int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
)

创建过程

CREATE PROCEDURE `prc_filler`(cnt INT)
BEGIN
        DECLARE _cnt INT;
        SET _cnt = 1;
        WHILE _cnt <= cnt DO
                INSERT
                INTO    filler
                SELECT  _cnt;
                SET _cnt = _cnt + 1;
        END WHILE;
END

填充表

call prc_filler(5000)

查询1

SELECT id 
FROM filler 
WHERE id =  (SELECT MAX(id) FROM filler  WHERE id =   
 ( SELECT MIN(id) 
    FROM filler
    WHERE id between 2000 and 3000
    )
  )

Equals Explain Output http://img689.imageshack.us/img689/5592/equals.png

查询2(同样的问题)

SELECT id 
FROM filler 
WHERE id in  (SELECT MAX(id) FROM filler  WHERE id in   
 ( SELECT MIN(id) 
    FROM filler
    WHERE id between 2000 and 3000
    )
  )

In Explain Output http://img291.imageshack.us/img291/8129/52037513.png

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读