如何產生必要的資料庫中繼資料,以在 SQL Server 中建立僅限統計資料的資料庫的指令碼

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:914288
簡介
Microsoft SQL Server 查詢最佳化器會使用下列類型的資訊來決定最佳的查詢計劃:
  • 資料庫中繼資料
  • 硬體環境
  • 資料庫工作階段狀態
一般而言,您必須模擬所有這些相同類型的資訊,如果您想要重現的測試系統上,查詢最佳化器的行為。

Microsoft 客戶支援服務可能會要求您產生的資料庫中繼資料的指令碼。Microsoft 客戶支援服務會使用這個指令碼的資料庫中繼資料來調查最佳化器問題。本文說明的步驟,以產生統計資料指令碼。本文也說明如何查詢最佳化器使用的資訊。
其他相關資訊
如果您使用 SQL Server 2005,再依照下列步驟來產生指令碼,請確定 SQL Server Management Studio SQL Server 2005 Service Pack 2 版或更新的版本。如果您使用較早版本的 SQL Server Management Studio SQL Server 2005 中,指令碼精靈不包含所有必要選項的這份文件中的步驟才能正常運作。

整個資料庫的指令碼

當您產生僅限統計資料的複製資料庫時,它可能會更容易且更可靠的整個資料庫,而非指令碼的個別物件的指令碼。當您撰寫指令碼整個資料庫時,您會收到下列優點:
  • 您要避免遺失重現問題所需的相依物件的問題。
  • 您需要大幅較少的步驟,以選取所需的物件。
注意如果產生指令碼,為資料庫中,且資料庫的中繼資料包含數千個物件時,指令碼的處理程序會耗用大量 CPU 資源。我們建議您在離峰產生指令碼。或者,您可以使用第二個選項來產生的指令碼的個別物件。

指令碼之查詢所參考的每個資料庫,請依照下列步驟執行:
  1. 開啟 SQL Server Management Studio。
  2. 物件總管中,展開資料庫,,然後尋找您要編寫指令碼的資料庫。
  3. 資料庫上按一下滑鼠右鍵,指向 [工作],然後按一下產生指令碼
  4. 在指令碼精靈] 中,確認已選取正確的資料庫。按一下以選取所有的指令碼中選取的資料庫物件] 核取方塊,,然後按一下 [下一步]
  5. 選擇指令碼選項] 對話方塊中,變更下列設定值從預設值為下表所列的值。
    指令碼選項若要選取的值
    Ansi 填補則為 true
    繼續編寫指令碼錯誤則為 true
    產生相依物件的指令碼則為 true
    包含系統的條件約束名稱則為 true
    編寫定序則為 true
    編寫資料庫指令碼建立則為 true
    指令碼登入則為 true
    指令碼物件層級權限則為 true
    編寫統計資料統計資料和長條圖的指令碼
    編寫索引指令碼則為 true
    編寫觸發程序則為 true
    注意指令碼登入選項和指令碼物件層級權限] 選項可能不需要除非結構描述包含除了dbo之外的登入所擁有的物件。
  6. 按一下 [下一步]
  7. 按一下 [指令碼至檔案] 選項,然後輸入 [檔案名稱。
  8. 按一下 [完成]。

指令碼的個別物件

您可能僅指令碼參考特定的查詢,而不是完整的資料庫指令碼處理的個別物件。不過,除非由使用與 SCHEMABINDING 子句所建立所有資料庫物件,在sys.depends系統資料表中的相依性資訊不一定精確。這個不精確度可能會造成下列問題之一:
  • 指令碼的處理程序沒有指令碼相依的物件。
  • 指令碼的處理程序可能會撰寫指令碼不正確的順序中的物件。若要成功地執行指令碼,您必須手動編輯產生的指令碼。
因此,我們不建議您撰寫指令碼的個別物件,除非資料庫中有大量的物件和指令碼會耗費太長。如果您必須使用指令碼的個別物件,請依照下列步驟執行:
  1. 在 SQL Server Management Studio,展開 [資料庫],然後尋找您要編寫指令碼的資料庫。
  2. 資料庫上按一下滑鼠右鍵,指向 [指令碼資料庫為、 指向 [建立],然後按一下檔案
  3. 輸入檔案名稱,然後再按一下 [儲存

    核心資料庫容器會編寫指令碼。此容器包含檔案、 檔案群組、 資料庫及屬性。
  4. 資料庫上按一下滑鼠右鍵,指向 [工作],然後按一下產生指令碼
  5. 請確定已選取正確的資料庫,,然後按一下 [下一步]
  6. 選擇指令碼選項] 對話方塊中,變更下列設定值從預設值為下表所列的值。
    指令碼選項若要選取的值
    Ansi 填補則為 true
    繼續編寫指令碼錯誤則為 true
    包含系統的條件約束名稱則為 true
    產生相依物件的指令碼則為 true
    編寫定序則為 true
    指令碼登入則為 true
    指令碼物件層級權限則為 true
    編寫統計資料統計資料和長條圖的指令碼
    指令碼使用資料庫則為 true
    編寫索引指令碼則為 true
    編寫觸發程序則為 true
    注意指令碼登入選項和指令碼物件層級權限] 選項可能不需要除非結構描述包含除了dbo之外的登入所擁有的物件。
  7. 在 [選擇物件類型] 對話方塊中,選取有問題的查詢引用的所有資料庫物件類型。

    例如,如果查詢只會參考資料表,請選取 資料表。如果查詢參考檢視表,請選取 [檢視和資料表]。如果有問題的查詢使用的使用者定義函式,請選取函式
  8. 當您選取查詢所參考的所有物件類型時,請按一下 [下一步]。
  9. 此時會顯示對話方塊,讓您在步驟 7 中選取每個資料庫物件型別。在每個對話方塊中,選取特定的資料表、 檢視、 函數或其他資料庫物件,然後按一下 [下一步]
  10. 按一下 [指令碼至檔案] 選項,然後指定您在步驟 3 中輸入的相同檔案名稱。
  11. 按一下 [完成] 以啟動指令碼。
當指令碼完成時,將指令碼檔案傳送到 Microsoft 技術支援工程師。Microsoft 技術支援工程師可能也會要求下列資訊:
  • 硬體設定,包括處理器數目及多少實體記憶體存在
  • 當您執行查詢時所使用中設定選項
注意您可能已經提供此資訊傳送 SQLDiag 報表或一個 SQL Profiler 追蹤。您可能也使用另一種方法來提供這項資訊。

如何使用資訊

下列表格解釋如何查詢最佳化器會使用此資訊來選取查詢計劃。

中繼資料

條件約束查詢最佳化器通常會使用條件約束來偵測查詢和基礎結構描述之間的矛盾。例如,如果查詢"WHERE col = 5" 子句和 「 檢查 (資料欄< 5)"="" check="" constraint="" exists,="" the="" query="" optimizer="" knows="" that="" no="" rows="" will="">

查詢最佳化器可讓類似類型的空值屬性有關的扣除。例如,"col 所在 NULL] 子句已知為 true 或 false,根據資料行的 null 屬性和資料行是否是從外部資料表的外部聯結。外部索引鍵條件約束的存在是很有幫助判斷基數和適當的聯結順序。查詢最佳化器可以用於消除聯結或簡化述詞的條件約束資訊。這些變更可能會移除需求以存取基底資料表。
統計資料統計資訊包含密度及顯示前置的索引和統計資料索引鍵的資料行的散發長條圖。依據述詞的性質,查詢最佳化器可能會用密度、 長條圖或兩者來評估述詞的基數。最新的統計資料所需的精確的基數估計。基數評估會用來做為輸入估算運算子的成本。因此,您必須擁有良好的基數的評估,以取得最佳的查詢計劃。
資料表大小 (資料列與分頁的數目)查詢最佳化器使用長條圖和密度,計算指定的述詞為 true 或 false 的可能性。最終的基數估計的計算方式是機率乘以子運算子所傳回的資料列數目。在資料表或索引的頁數是估計 IO 成本的因素。表格大小用來計算成本的掃描,而且當您估計索引搜尋期間存取的分頁數目有助益。
資料庫選項數個資料庫選項可以影響最佳化的結果。AUTO_CREATE_STATISTICSAUTO_UPDATE_STATISTICS選項會影響是否查詢最佳化器會建立新的統計資料或已過期的更新統計資料。參數化的層級會影響如何輸入的查詢之前輸入的查詢就交給查詢最佳化器參數化。參數化會影響基數估計,也可以防止比對索引檢視表和其他類型的最佳化。DATE_CORRELATION_OPTIMIZATION設定會讓最佳化器搜尋資料行之間的關聯性。這個設定會影響基數及成本估計。

環境

工作階段設定選項ANSI_NULLS是否設定值會影響 「 NULL = null,則 「 運算式評估為 true。外部聯結的基數評估可能會根據目前的設定變更。此外,也會變更模稜兩可的運算式。例如,"col = null,則 「 運算式會評估以不同方式根據設定。不過,"col IS NULL 」 運算式一律會評估相同的方式。
硬體資源排序和雜湊運算子的成本取決於相對的 SQL Server 可用的記憶體數量。例如,如果資料的大小大於快取,查詢最佳化器知道的資料必須永遠多工緩衝處理到磁碟。不過,如果資料的大小是快取比小很多,作業可能會在記憶體中完成。如果伺服器有一個以上的處理器和平行處理原則已經不被停用使用"MAXDOP"提示] 或 [最大平行度] 組態選項,SQL Server 也會考慮不同的最佳化。
複製資料庫

警告:本文為自動翻譯

內容

文章識別碼:914288 - 最後檢閱時間:01/27/2015 21:09:00 - 修訂: 1.0

Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Standard, Microsoft SQL Server 2014 Web, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Enterprise, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Web, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2008 R2 Web, Microsoft SQL Server 2008 R2 Workgroup, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Web, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Enterprise X64 Edition, Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Standard X64 Edition, Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems

  • kbexpertiseinter kbexpertiseadvanced kbsql2005engine kbhowto kbinfo kbmt KB914288 KbMtzh
意見反應