兄弟,我的這個語句不一樣的,可能因為環境不同; 但是sql為什麼會采用如此差的查詢計劃,另外想知道如何強行按照某個索引執行?

解决方案 »

  1.   

    SELECT * FROM T1 (INDEX = IX_ProcessID)
      

  2.   

    可以这样试一下:
    exec('select a.* from a left join b on a.id=b.id left join on c on a.t1=c.t1
    where a.d>='''+@start+''' and a.d<='''+@end+'''')
      

  3.   

    先用点废话回答楼主的标题:
    说: 為什麼一樣的語句,查詢策略卻不一樣?
    答: sql是一种声明性语言,一个sql语句指定的是所要求的结果,而不是如何读取它们,具体如何读取由sql在生成执行计划时决定,这样的话,几个等价的sql语句可以得到一个特定的结果集,而每一条语句执行时都会有不同的成本和消耗时间。
      

  4.   

    说: 我如何按照我的預期按索引查詢?
    答: 索引是由一系列存储在磁盘上的索引项组成的。一个索引项对应于磁盘上的一行,我们可以将索引项看作一个由两列组成的数据表。其中一列是索引键,由行中某些列的值串接组成,第二列是行指针,指向行所在的磁盘位置。
          优化器决定查询所采用的策略,当它判定没有合适的索引来执行一个sql语句以满足优化器目标时,将进行全表扫描以执行该sql语句,一般而言,表扫描将涉及很多的物理I/O。当表中数据相对较多时,会严重影响查询的速度。
      

  5.   

    問題就在這裡了,sql優化器會決定選擇那種查詢策略,但是它的選擇不一定是最好的,在已經知道某種查詢策略 A 最好的情況下,我如何讓sql按照策略 A 來查詢; 
      采用上面的指定索引沒有用,
    -----------
    我如何讓sql按照策略 A 來查詢呢?
      

  6.   

    --强制索引:
    SELECT *
    FROM tablename  with (index(indexname))
    where 条件