• 查询优化(2)


    继续查询优化(1)中的讨论,这次我们来看一下统计数据的管理。

    统计信息管理

    SQL Server会为索引列和数据列维护统计信息。一般情况下这些统计信息能被自动维护地很好,但在某些情况下我们需要手动来维护这些信息。

    索引统计信息

    --在Northwind库中创建索引,并查看该索引的统计信息
    CREATE INDEX cust_date_indx ON Orders(CustomerID, OrderDate)
    
    DBCC SHOW_STATISTICS('Orders', 'cust_date_indx')

     

    数据列(非索引列)统计信息

    当一个查询运行后,SQL Server会自动为出现在查询语句where中的数据列创建统计信息。

    exec sp_helpstats Customers;
    --第一次运行上述语句,我们不会得到任何统计信息。
    select * from Customers where ContactName = 'Hanna Moos';
    go
    exec sp_helpstats Customers;

    通过CREATE STATISTICS命令,我们可以手工创建统计信息。

    计算列上的统计信息

    对于where子句中的计算表达式,SQL Server无法根据数据列统计信息来估计其选择性。

    WHERE UnitPrice * Quantity > 1000

    上述语句,SQL Server无法准确估计其选择性。我们可以创建计算列,这样SQL Server就能为其创建统计信息。

    ALTER TABLE [Order Details]
    ADD TotalSale AS UnitPrice * Quantity;

    手动统计信息刷新

    我们可以使用UPDATE STATISTICS命令来手动更新统计信息或改变默认的采样率。SQL Server默认分析一些行来生成统计信息。

    我们可以增大采样率,或对表进行全扫描来手工生成统计信息。当调试一个低效的执行计划时,通过对表进行全扫描来更新统计信息是一个好主意。

    --对Orders表进行全扫描来更新其所有统计信息 
    UPDATE STATISTICS Orders WITH FULLSCAN;

    SQL Server 2005还提供了一个数据库选项:AUTO_UPDATE_STATISTICS_ASYNC。

    打开此选项后,更新统计信息将不会影响到此刻正在运行的语句。

  • 相关阅读:
    两道关于算法的面试题
    MySQL连接数过多程序报错"too many connections"
    Mysql中类似于Oracle中connect by ... start with的查询语句(木大看懂)
    获取当前div中的文本(只获取当前div的, 子元素不要, 基于layui)
    同一张地区表中根据汉字查询地区的代码
    HttpURLConnection getInputStream异常的解决
    IDEA报错No Spring WebApplicationInitializer types detected on classpath
    mybatis出现无效的列类型
    hibernate NUMBER 精度
    jmeter汉化或英化
  • 原文地址:https://www.cnblogs.com/DBFocus/p/1756683.html
Copyright © 2020-2023  润新知