學習筆記(十二)-----統計信息

一、統計信息數據庫

SQL SERVER是根據表中的統計信息進行行數估計,按照腳本語義來肯定物理操做步驟生成執行計劃,再按照該執行計劃訪問數據。表和視圖都有統計信息,統計信息對象是根據索引或表列的列表建立的。當某列第一次最爲條件查詢時,將建立單列的統計信息。當建立索引時,將建立同名的統計信息。索引中,統計信息只統計首列,所以索引除了按首列排序存儲數據外,其統計信息也是按首列計算統計的,因此索引設置時定義的第一列很是重要。每一個統計信息對象都在包含一個或多個表列的列表上建立,而且包括顯示值在第一列中的分佈的直方圖。如下狀況適用時,考慮使用 CREATE STATISTICS 語句建立統計信息:
① 數據庫引擎優化顧問建議建立統計信息。
② 查詢謂詞包含尚不位於相同索引中的多個相關列。
③ 查詢從數據的子集中選擇數據。
④ 查詢缺乏統計信息。優化

二、查看統計信息spa

select * from sys.stats where object_id=OBJECT_ID(N'[Sales].[SalesOrderDetail]')

  

三、查看一張表的某個索引的統計信息3d

先查看整個數據庫的索引code

SELECT * FROM sys.sysindexes

查看錶的索引的統計信息對象

DBCC SHOW_STATISTICS     
        ('tb_medicine'
        ,'pk_medic_3124D5480BC6C34E');

四、先建立一個彙集索引blog

DROP INDEX pk_medic_3124D5480BC6C34E ON tb_medicine
CREATE CLUSTERED INDEX ci_name                
        ON tb_medicine            
            (藥品名稱 ASC);

查看統計信息排序

DBCC SHOW_STATISTICS     
    ('tb_DrugsRegistration'
    ,'ci_name');

 

在執行一次查詢語句索引

select d.*from tb_DrugsRegistration as d
    where d.name ='硝苯地平'

 

注意:查看估計行數,系統會在創建索引以後自動創建一個統計的信息,進行一個摸底的排查,對比真正查詢出來的一個統計行數,能夠看出估計出的行數較爲準確,可是也存在誤差不少的由於查詢是系統會隱藏某些藥品的名字,在查詢這些被隱藏的名字的時候,系統就會用隱藏的總行數除以隱藏的種類,獲得一個估計的結果,只是取一個均值。ci

 

5、刪除多餘的tb_medicine表的某個相同行數的藥品行數,查看藥品名稱爲依替米星的估計行數,再執行查詢語句

DELETE TOP(3) tb_medicine
    
    SELECT         
            O.* 
        FROM     
            tb_medicine  AS O 
        WHERE     
            o.name like '依替米星%';

 

 

注意:由上面的查詢結果能夠看得出來,刪除記錄以後系統就能夠進行一個樣本的採集,但這個採集只是隨意的,短暫的,所以存在偏差。

下面就要對索引進行一個手動的更新(使用完整掃描)

UPDATE STATISTICS tb_medicne  ci_name    
        WITH FULLSCAN;

再次查詢統計信息

DBCC SHOW_STATISTICS     
    ('tb_DrugsRegistration'
    ,'ci_name');

六、總結:對於改天查詢中的一個參數或多個參數值致使查詢執行時間差別很大的語句,多半是Statistics沒有及時跟上,咱們須要手動更新一下。在以後咱們觀察這個索引的自動更新統計是否爲ON,若是配置正常可是Statistics還不能及時跟上的建議創建一個job按期檢查統計信息更新狀況並處理。 

SQL Server基於開銷(Cost)評估執行計劃,選擇開銷最小的做爲「最優化」的執行計劃,因爲SQL Server根據索引及其統計信息來計算開銷,因此,對查詢優化來講,索引和統計數據是很是重要的,查詢優化器(Query Optimizer)使用統計信息對查詢的開銷進行評估(Estimate),選擇開銷小的查詢計劃,做爲最終的、「最優的」的執行計劃。

相關文章
相關標籤/搜索