7R903 发表于 2022-4-20 10:20

sqlserver语句优化

这条查询语句太慢了,查询结果约16w,recode表数据约20w(持续增长),查询速度约6分钟
如何去优化这个,最终要得出字段CDRID
想用with as去写,但没有思路                                       
SELECT t1.CDRID FROM t1
LEFT JOIN
(
        SELECT * FROM
        WHERE
        CALLED_CODE NOT IN ( '0', '1', '2', '3', '4' )
        AND STARTTIME BETWEEN CONVERT ( VARCHAR ( 10 ), STARTTIME, 120 ) + ' 09:00:00' AND CONVERT ( VARCHAR ( 10 ), STARTTIME, 120 ) + ' 18:00:00' --时间范围
        AND DATEPART( weekday, STARTTIME +@@DATEFIRST - 1 ) NOT IN ( 6, 7 ) --不是周末
) t2
ON t1.VISITORID = t2.VISITORID
WHERE
        1 = 1
        AND
        (
                ( t1.STARTTIME BETWEEN t2.STARTTIME AND t2.ENDTIME )
        OR
                ( t2.STARTTIME BETWEEN t1.STARTTIME AND t1.ENDTIME )
        )

cxb2468 发表于 2022-4-20 10:54

不用not in和or 时间至少能缩短50%!!!

7R903 发表于 2022-4-20 10:58

cxb2468 发表于 2022-4-20 10:54
不用not in和or 时间至少能缩短50%!!!

是的,减去可以缩短时间
但是替代方案呢?

时光稀释 发表于 2022-4-20 14:08

内外操作引用的都是同一张表,内层已经对数据进行了筛选,外层操作有什么意义?

VISITORID 是唯一的吗?允不允许重复

icysky0605 发表于 2022-4-20 14:23

看你这语法,应该是MSSQL,至少给出你这几个列的数据类型或是给个表结构,纯看这个,除了NOT IN 以及 OR 可优化,没什么可能帮到你的。

7R903 发表于 2022-4-20 20:08

时光稀释 发表于 2022-4-20 14:08
内外操作引用的都是同一张表,内层已经对数据进行了筛选,外层操作有什么意义?

VISITORID 是唯 ...

意义在where这,我如果把or去掉,基本是秒查

封心棒棒糖 发表于 2022-4-21 07:28

拆分两条Sql,用union all
页: [1]
查看完整版本: sqlserver语句优化