很正常,sql查询引擎会分析不通的执行计划,然后选择预计时间最短的执行计划

解决方案 »

  1.   

    cat_childid会不会是一个计算字段?
      

  2.   

    情况不明,
    请提供:
    1、索引情况
    2、cnsb_product记录量,cat_childid= 5889的记录量,数据密度、分布情况怀疑因索引只得执行全表扫描,计划只能执行嵌套迭代,而一旦发生嵌套迭代时联结的表内层或外层的顺序对磁盘I/O开销及顶部输入的行数影响匹配次数
      

  3.   

    刚才试了一下,有点奇怪
    1、索引不合理
    2、重建索引试试查询优化器会首先考虑Nested Loop和Sort-Merge的,而且只有两个集合量量大且没有合适的索引或无序时,才会考虑使用Hash Join。
      

  4.   


    把cat_childid上面的索引去掉然後再帖一次执行计划.
    (文字形式)
      

  5.   

    childid=5889的记录数是多少
    parentid=9的记录是多少
    聚集索引是哪个?
      

  6.   

    以上查询返回count(*)是多少?
      

  7.   


    product表:50万记录
    cat表:8千记录
      

  8.   


    product表聚集索引:info_id
    cat表聚集索引:catid
      

  9.   

    大致的分析了一下sqlserver是基于成本的,一般的连接它都会将量小的表每行去连接量大的表,但这样不是任何时候都适用的。
    比如说在有排序字段的时候,查询条件阻止了根据排序字段的扫描,这样会更加额外的排序操作,从而大大降低了查询效率而你的环境中也出现了类似这种情况。
      

  10.   


    去掉cat_childid上的索引执行计划图:
      

  11.   

    1.根据提供的查询和执行计划可以推断出:
    表cat的catid字段上建有UNIQUE的索引,因此的你的查询可以简化成:SELECT d.catid,d.catname,COUNT(a.info_id) AS info_count
    FROM cnsb_product a WITH(NOLOCK)
      --LEFT JOIN cat b WITH(NOLOCK) ON a.cat_parentid = b.catid
      --LEFT JOIN cat c WITH(NOLOCK) ON a.cat_childid = c.catid
    LEFT JOIN cat d WITH(NOLOCK) ON a.cat_rootid = d.catid
      --LEFT JOIN cat e WITH(NOLOCK) ON a.order4 = e.catid
    WHERE ......
    GROUP BY d.catid,d.catname2.你说的慢n倍,是如何比较的,只是单纯的比较完成查询所需要的时间嘛?
    比较的环境是否一致?热缓存还是冷缓存?3.开启 SET STATISTICS IO ON 对比分析一下两个查询的输出4.sp_helpindex cnsb_product 提供该结果集,进一步分析5.并对所使用的关键索引输出DBCC SHOW_STATISTICS结果
      

  12.   

    将全文索引查询条件and contains((a.keyword,a.info_content),' "铸铁" ')去掉,两个查询的执行计划完全一样,完全利用索引检索,效率也非常高。问题应该是出在全文索引和表索引不能同时被使用。原理不是很明白。
      

  13.   

    查询计划里索引类型是SQL自己分析的,但是你也可以制定 with