• λ我爱Aspx >> C#.Net >> 用共享游标提升 SQL 性能
  • 用共享游标提升 SQL 性能

  • :aspxer  Դ:5iaspx  :2007-7-30 6:10:19  ؼ:sql
  • SELECT * FROM T1, T2 WHERE (T1.N <= 500) AND (T1.N1 = T2.N2)

    根据(N<=100)和(N<=500)的行数,值在字段N中的分布,在N, N1或N2上索引的可用性等情况,可能有不同的最优计划。例如,第一个语句可能使用一个在T1上的索引,而第二个语句可能是在T1上做全表扫描。或者第一个语句可能是作一个哈希连接而第二个语句可能是做一个嵌套循环连接。这些语句响应地可以当作是非最优化共享语句,因此:

    非最优化共享语句是可能具有不同最优计划的相似语句。

    同样也意味着如果非最优化共享语句共享同样的游标,那么在执行效率上可能会存在损失。

    最优共享与非最优共享语句

    最优共享和非最优共享语句的区别并不纯粹是在语义上的。它依赖于下面的因素:

    l 文字标量在语句中的位置(例如,是在VALUES子句中还是在WHERE子句中)

    l 可用的访问路径(例如,索引的存在)

    l 如果一个文字标量出现在一个包含字段的谓词中(如,N<=100用到了在字段N上的统计值的可用性),则取决于数据分布(统计值)和它的可用性

    l 优化器的算法使用

    非共享语句

    因为使用同样的游标会产生不正确的结果,会出现相似语句不能共享同一个游标的情况。这些相似语句意味着不同的事情,或者在执行期间做了完全不同的事。下面的语句描述了这一点:

    SELECT * FROM T ORDER BY 1,4

    SELECT * FROM T ORDER BY 2,3

    在这个例子中,文字标量1,2,3和4指的是选择表项中的项目。这些语句叫做非共享语句。因此有:

    非共享语句是不能共享同样的执行计划的相似语句。

    这里最重要的一点就是:如果两个非共享语句共享同样的游标,它们其中一个就会得到错误的结果。

    解决方案

    这一节描述通过cursor_sharing参数所提供的解决方案

    Ҷƪл˵?
  • һƪC#网络应用编程基础练习题与答案(六)
    һƪC#图像放大问题解决方法