以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  为什么数据少了累计查询速度还会更慢?  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=144235)

--  作者:happyft
--  发布时间:2019/12/14 16:49:00
--  为什么数据少了累计查询速度还会更慢?
有两个表要模糊连接查询,为了提高速度,先将第一个表汇总后存储临时表,这样数据量从2万行变成了1千多行, 要连接的那个表#temp3只有4千行,不变
SELECT  a.*
INTO    #temp2
FROM    ( SELECT    a.子件 ,
                    a.品名 ,
                    a.到期日 ,
                    SUM(a.毛需求量) AS 毛需求量
          FROM      订单 a
          WHERE     订单状态 = \'新增\'  这里已经按条件筛选了
          GROUP BY  子件 ,
                    品名 ,
                    a.到期日
        ) a

--用上面临时表为左表开始累计查询(速度很慢)
SELECT  a.子件 ,
        a.品名 ,
        a.到期日 AS 交货日期 ,
        a.毛需求量 ,
        c预计入库 = ( SELECT    SUM(预计入库)
                  FROM      #temp3 b
                  WHERE     CHARINDEX(a.子件, b.规格) > 0
                            AND b.交货日期 <= a.到期日
                )
FROM    #temp2 a

--从原表开始累计查询(速度快)
SELECT  a.子件 ,
        a.品名 ,
        a.到期日 AS 交货日期 ,
        a.毛需求量 ,
        c预计入库 = ( SELECT    SUM(预计入库)
                  FROM      #temp3 b
                  WHERE     CHARINDEX(a.子件, b.规格) > 0
                            AND b.交货日期 <= a.到期日
                )
FROM    订单 a
WHERE   a.订单状态 = \'新增\'
结果是下面这个用原始表有近2万行数据做为左表的只用了2表,但上面那个左表只有1千多行的却用了13秒
实在不解,特意请教,
谢谢!

--  作者:有点蓝
--  发布时间:2019/12/14 17:09:00
--  
具体道理我也不懂,如果结果一样,哪个快就用哪个。

估计是临时表是没有索引的,全部都是全表扫描查询,而物理表是支持索引查询的

--  作者:HappyFt
--  发布时间:2019/12/14 17:11:00
--  
都没有索引啊,我还专门增加了一个物理表,将汇总后的临时表数据插入到那个物料表还专门加了索引结果还是一样慢,好吧,不管它了,谢谢!
--  作者:有点蓝
--  发布时间:2019/12/14 17:29:00
--  
可以自己分析一下查询计划,看慢在什么地方:https://www.cnblogs.com/knowledgesea/p/5005163.html