使用统计为什么能优化查询?或者说他是怎么优化查询的?大家能帮我讲讲吗?先谢谢了。

解决方案 »

  1.   

    USE tempdb
    GO-- 建立演示环境
    CREATE TABLE Dept(
     id int PRIMARY KEY, 
     parent_id int,
     name nvarchar(20))
    INSERT Dept
    SELECT 0, 0, N'<全部>' UNION ALL
    SELECT 1, 0, N'财务部' UNION ALL
    SELECT 2, 0, N'行政部' UNION ALL
    SELECT 3, 0, N'业务部' UNION ALL
    SELECT 4, 0, N'业务部' UNION ALL
    SELECT 5, 4, N'销售部' UNION ALL
    SELECT 6, 4, N'MIS' UNION ALL
    SELECT 7, 6, N'UI' UNION ALL
    SELECT 8, 6, N'软件开发' UNION ALL
    SELECT 9, 8, N'内部开发'
    GO-- 查询指定部门下面的所有部门
    DECLARE @Dept_name nvarchar(20)
    SET @Dept_name = N'MIS'
    ;WITH
    DEPTS AS(
     -- 定位点成员
     SELECT * FROM Dept
     WHERE name = @Dept_name
     UNION ALL
     -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
     SELECT A.*
     FROM Dept A, DEPTS B
     WHERE A.parent_id = B.id
    )
    SELECT * FROM DEPTS
    GO-- 删除演示环境
    DROP TABLE Dept
      

  2.   

    这个问题说起来真的很长,很费事。只能简单说一下,详细信息应该看一看 inside sql server 中的描述。执行计划优化的主要任务就是选择合适的索引来辅助查询。
    查询优化器通过索引的统计信息估计查询语句需要检索的行数,以及检索这些行需要的代价(逻辑 I/O 的次数),从而评估代价,选择代价最小的执行计划。
    统计信息中包含有索引码的密度信息——索引码的重复度,即在表中每个不同的索引码平均可以与多少行相关联。索引码的密度代表了索引的选择性,即使用索引可以将多少行排除出查询,显然索引码的密度越低,可排除的行数便越多,索引的选择性越强,执行计划便越有可能选择此索引。