共用方式為


如何產生統計數據腳本,以在 SQL Server 中建立僅限統計數據的資料庫

在本文中,您將瞭解如何使用資料庫元數據來產生統計數據腳本,以在 SQL Server 中建立僅限統計數據的資料庫。

原始產品版本: SQL S
原始 KB 編號: 914288

簡介

DBCC CLONEDATABASE 是產生資料庫僅限架構複製的慣用方法,以調查效能問題。 只有在您無法使用 時,才使用 DBCC CLONEDATABASE本文中的程式。

Microsoft SQL Server 中的查詢優化器會使用下列類型的信息來判斷最佳查詢計劃:

  • 資料庫元數據
  • 硬體環境
  • 資料庫工作階段狀態

一般而言,您必須模擬所有這些相同的資訊類型,以重現測試系統上查詢優化器的行為。

Microsoft客戶支援服務可能會要求您產生資料庫元數據的腳本,以調查查詢優化器問題。 本文說明產生統計數據腳本的步驟,也說明查詢優化器如何使用資訊。

注意

儲存在此數據中的金鑰可能包含 PII 資訊。 例如,如果您的數據表包含 具有統計數據的電話號碼 數據行,則每個步驟的高索引鍵值都會在產生的統計數據腳本中。

編寫整個資料庫的腳本

當您產生僅限統計數據的複製資料庫時,撰寫整個資料庫的腳本可能會比較容易且更可靠,而不是編寫個別物件的腳本。 當您編寫整個資料庫的腳本時,您會收到下列優點:

  • 您可以避免遺漏重現問題所需的相依對象問題。
  • 您需要較少的步驟來選取必要的物件。

請注意,如果您為資料庫產生腳本,而資料庫的元數據包含數千個物件,腳本程式會耗用大量的 CPU 資源。 建議您在離峰時段產生腳本,或使用第二個選項 [編寫個別物件 腳本] 來產生個別物件的腳本。

若要編寫查詢所參考的每個資料庫文稿,請遵循下列步驟:

  1. 開啟 SQL Server Management Studio。

  2. 物件總管 中,展開 [資料庫],然後找出您要編寫腳本的資料庫。

  3. 以滑鼠右鍵按兩下資料庫,指向 [工作],然後選取 [產生腳本]。

  4. 在腳本精靈中,確認已選取正確的資料庫。 按兩下即可選取 [ 編寫整個資料庫和所有資料庫物件的腳本],然後選取 [ 下一步]。

  5. 在 [ 選擇文稿選項 ] 對話框中,選取 [進階 ] 按鈕,將下列設定從預設值變更為下表所列的值。

    文本選項 要選取的值
    Ansi 填補
    發生錯誤時繼續編寫腳本
    產生相依物件的腳本
    包含系統條件約束名稱
    腳本定序
    腳本登入
    腳本物件層級許可權
    指令碼統計資料 編寫統計數據和直方圖的腳本
    腳本索引
    腳本觸發程式

    注意

    請注意,除非架構包含 dbo 以外的登入所擁有的對象,否則可能不需要 [腳本登入] 選項和 [腳本物件層級許可權] 選項。

  6. 選取 [ 確定 ] 以儲存變更,然後關閉 [ 進階腳本選項 ] 頁面。

  7. 選取 [ 儲存至檔案 ],然後選取 [ 單一檔案 ] 選項。

  8. 檢閱您的選取專案,然後選取 [ 下一步]。

  9. 選取 [完成]

編寫個別物件的腳本

您只能編寫特定查詢所參考的個別物件腳本,而不是編寫完整資料庫的腳本。 不過,除非使用 子句建立 WITH SCHEMABINDING 所有資料庫對象,否則系統數據表中的 sys.depends 相依性資訊可能不一定正確。 這個不透明度可能會導致下列其中一個問題:

  • 腳本程式不會編寫相依物件的腳本。

  • 腳本程式可能會以不正確的順序編寫物件的腳本。 若要成功執行文稿,您必須手動編輯產生的腳本。

因此,建議您不要編寫個別物件的腳本,除非資料庫有許多對象,否則腳本會花費太長的時間。 如果您必須使用文稿個別物件,請遵循下列步驟:

  1. 在 SQL Server Management Studio 中,展開 [ 資料庫],然後找出您要編寫腳本的資料庫。

  2. 以滑鼠右鍵按兩下資料庫,指向 [ 編寫資料庫為腳本],然後指向 [ 建立至],然後選取 [ 檔案]。

  3. 輸入檔名,然後選取 [ 儲存]。

    核心資料庫容器將會編寫腳本。 此容器包含檔案、檔案群組、資料庫和屬性。

  4. 以滑鼠右鍵按兩下資料庫,指向 [工作],然後選取 [產生腳本]。

  5. 請確定已選取正確的資料庫,然後選取 [ 下一步]。

  6. 在 [ 選擇物件類型 ] 對話框中,選擇 [ 選取特定資料庫物件],然後選取有問題查詢參考的所有資料庫物件類型。

    例如,如果查詢只參考數據表,請選取 [ 數據表]。 如果查詢參考檢視,請選取 [檢視和數據表]。 如果有問題的查詢使用使用者定義的函數,請選取 [函式]。

  7. 當您選取查詢所參考的所有物件類型時,請選取 [ 下一步]。

  8. 在 [ 設定文本選項 ] 對話框中,選取 [進階 ] 按鈕,並將下列設定從預設值變更為下表 的 [進階腳本選項 ] 頁面上所列的值。

    文本選項 要選取的值
    Ansi Padding
    發生錯誤時繼續編寫腳本
    包含系統條件約束名稱
    產生相依物件的腳本
    腳本定序
    腳本登入
    腳本物件層級許可權
    指令碼統計資料 編寫統計數據和直方圖的腳本
    編寫USE DATABASE腳本
    腳本索引
    腳本觸發程式

    注意

    請注意,除非架構包含 dbo 以外的登入所擁有的對象,否則可能不需要 [腳本登入] 和 [腳本物件層級許可權] 選項。

  9. 選取 [ 確定 ] 以儲存並關閉 [ 進階腳本選項 ] 頁面。

    針對您在步驟 7 中選取的每個資料庫物件類型,會出現一個對話方塊。

  10. 在每個對話框中,選取特定的數據表、檢視、函式或其他資料庫物件,然後選取 [ 下一步]。

  11. 選取 [ 腳稿到檔案 ] 選項,然後指定您在步驟 3 中輸入的相同檔名。

  12. 選取 [完成] 以啟動腳本。

    當腳本完成時,請將腳本檔案傳送至 Microsoft 支援服務 工程師。 Microsoft 支援服務 工程師也可能要求下列資訊:

    • 硬體組態,包括處理器數目,以及有多少物理記憶體存在。

    • 執行查詢時作用中的SET選項。

    請注意,您可能已經藉由傳送 SQLDiag 報表或 SQL Profiler 追蹤來提供這項資訊。 您可能也已使用另一種方法來提供這項資訊。

如何使用資訊

下表說明查詢優化器如何使用這項資訊來選取查詢計劃。

中繼資料

選項 說明
限制 查詢優化器經常使用條件約束來偵測查詢與基礎架構之間的矛盾。 例如,如果查詢包含 WHERE col = 5 子句,而且 CHECK (col < 5) 基礎表上有條件約束,則查詢優化器知道不會比對任何數據列。 查詢優化器會針對可為 Null 性進行類似的推算類型。 例如, WHERE col IS NULL 子句已知為 true 或 false,取決於數據行的 Null 性,以及數據行是否來自外部聯結的外部數據表。 FOREIGN KEY 條件約束的存在有助於判斷基數和適當的聯結順序。 查詢優化器可以使用條件約束資訊來消除聯結或簡化述詞。 這些變更可能會移除存取基表的需求。
統計資料 統計數據資訊包含密度和直方圖,顯示索引和統計數據索引鍵前置數據行的分佈。 根據述詞的性質,查詢優化器可能會使用密度、直方圖或兩者來估計述詞的基數。 準確的基數估計需要最新的統計數據。 基數估計值會作為估計運算元成本的輸入。 因此,您必須有良好的基數估計值,才能取得最佳的查詢計劃。
資料表大小(欄數與頁面數 ) 查詢優化器會使用直方圖和密度來計算給定述詞為 true 或 false 的機率。 最終基數估計值是乘以子運算符傳回的數據列數目來計算。 數據表或索引中的頁數是估計 IO 成本的因素。 數據表大小可用來計算掃描的成本,而且當您估計索引搜尋期間要存取的頁面數目時,會很有用。
資料庫選項 數個資料庫選項可能會影響優化。 和 AUTO_CREATE_STATISTICSAUTO_UPDATE_STATISTICS 選項會影響查詢優化器是否會建立新的統計數據或更新過期的統計數據。 參數化層級會影響將輸入查詢參數化的方式,再將輸入查詢交給查詢優化器。 參數化可能會影響基數估計,也可以防止比對索引檢視表和其他優化類型。 此 DATE_CORRELATION_OPTIMIZATION 設定會導致優化器搜尋數據行之間的相互關聯。 此設定會影響基數和成本估計。

環境

選項 說明
會話 SET 選項 ANSI_NULLS 設定會影響表達式是否 NULL = NULL 評估為 true。 外部聯接的基數估計可能會根據目前的設定而變更。 此外,模棱兩可的表達式也可能變更。 例如,表達式會 col = NULL 根據設定以不同的方式進行評估。 不過, col IS NULL 表達式一律會以相同的方式進行評估。
硬體資源 排序和哈希運算子的成本取決於 SQL Server 可用的相對記憶體數量。 例如,如果數據的大小大於快取,查詢優化器就會知道數據必須一律多任務緩衝處理至磁碟。 不過,如果數據的大小遠小於快取,則作業很可能在記憶體中完成。 如果伺服器有多個處理器,而且使用 MAXDOP 提示或平行處理原則組態選項未停用平行處理原則,SQL Server 也會考慮不同的優化。

另請參閱