none
请教一个查询优化的问题,谢谢! RRS feed

  • 问题

  • 有个查询看到表扫描和逻辑读取很多,我想改造一下,但是改造后表扫描和逻辑读取减少很多,但是为啥CPU用时为啥却多了,不理解。

    详细情况如下,我描述详细点,比较长。

    表的基本情况:

    name rows           reserved     data         index_size unused
    tbA  32419302    10279424 KB 8367104 KB 1893768 KB 18552 KB

    index_name index_description index_keys
    cw_ix_id nonclustered  id
    IX_FG_1 clustered 时间, id
    时间_colBINCLUDEcola nonclustered  时间, colB
    时间INCLUDEidcolAcolB nonclustered时间

    原始查询

    select a.id,
     CASE WHEN sum(colB) = 0  THEN 0
        else   sum(colA)/sum(colB) END  as aaa
        FROM tbA a
     where 时间 between @早8点 and @早10点 or 时间 between @晚8点 and @@晚10点
     group by a.id
     
     返回的消息如下:

    (22777 行受影响)
    表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'tbA'。扫描计数 366,逻辑读取 1130 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    (14 行受影响)

    (1 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 187 毫秒,占用时间 = 383 毫秒。

    修改后的查询:

     select a.id,
     CASE WHEN sum(colB) = 0  THEN 0
        else   sum(colA)/sum(colB) END  as aaa
     
     from
     (
     select id,
     colA,colB
        FROM tbA
     where 时间 between @早8点 and @早10点
     Union all
     select id,
     colA,colB
        FROM tbA
        where 时间 between @晚8点 and @@晚10点
        ) a
        group by a.id

     返回的消息如下:

     

    (22777 行受影响)
    表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'tbA'。扫描计数 2,逻辑读取 346 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    (7 行受影响)

    (1 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 235 毫秒,占用时间 = 609 毫秒。

    为啥表扫描和逻辑读取减少很多,但是为啥CPU用时为啥却多了?

    数据库为SQLServer2008withSP2

    2012年12月7日 8:02

答案

全部回复