查詢最佳化器在 Microsoft SQL Server 2005 或 Microsoft SQL Server 2008 中使用下列類型的資訊來決定最佳的查詢計劃:
通常,您必須模擬所有這些相同類型的資訊,如果您想要重現查詢最佳化器在測試系統上的行為。
Microsoft 客戶支援服務可能會要求您產生指令碼的資料庫中繼資料。Microsoft 客戶支援服務會使用這個指令碼的資料庫中繼資料來調查最佳化器的問題。本文將告訴您,產生統計資料指令碼的步驟。本文也將告訴查詢最佳化器使用資訊的方式。
如果您使用 SQL Server 2005 之前請遵循步驟來產生指令碼,請確定,SQL Server 管理 Studio 是 SQL Server 2005 Service Pack 2 版或更新版本。 如果您在 SQL Server 2005 中使用較早版本的 SQL Server 管理 Studio,指令碼精靈不會包含所有必要選項本文中的步驟才能正常運作。
指令碼整個資料庫
當您產生僅限統計資料的複製品資料庫時,可能更容易且更可靠,若要編寫指令碼的個別物件的整個資料庫。當您撰寫指令碼整個資料庫時您會收到下列好處:
- 避免遺漏重現問題所需的相依物件的問題。
- 您需要大幅較少的步驟,以選取所需的物件。
附註如果產生為資料庫指令碼,而且資料庫的中繼資料包含數千個物件,指令碼的處理程序會消耗大量的 CPU 資源。 我們建議您在離峰產生指令碼。或者若要產生指令碼的個別物件使用第二個選項。
若要編寫指令碼由您的查詢所參考的每個資料庫,請依照下列步驟執行:
- 開啟 SQL Server 管理 Studio。
- 在 物件總管 中展開 [資料庫],並再找出您要編寫指令碼的資料庫。
- 在資料庫上按一下滑鼠右鍵,指向 [工作],然後再按一下 [產生指令碼。
- 「 指令碼精靈 」 中確認 [已選取正確的資料庫]。 按一下以選取 [選取的資料庫中的所有指令碼物件] 核取方塊,然後按一下 [下一步]。
- 在 [選取的指令碼選項] 對話方塊變更下列設定從預設值為下列表格中列的值。
摺疊此表格展開此表格
| 指令碼選項 | 要選取值 |
|---|
| Ansi 與邊框距離 | 則為 True |
| 繼續執行指令碼上錯誤 | 則為 True |
| 產生相依物件的指令碼 | 則為 True |
| 包括系統限制式名稱 | 則為 True |
| 定序的指令碼 | 則為 True |
| 指令碼資料庫建立 | 則為 True |
| 指令碼登入 | 則為 True |
| 指令碼物件層級權限 | 則為 True |
| 指令碼統計資料 | 指令碼統計資料和長條圖 |
| 編寫索引的指令碼 | 則為 True |
| 指令碼引動程序 | 則為 True |
附註指令碼登入 選項和 指令碼物件層級權限] 選項可能不需要除非結構描述中包含由 dbo 以外的登入所擁有的物件。 - 按一下 [下一步]。
- 按一下 [指令碼至檔案] 選項,然後輸入檔案名稱。
- 按一下 [完成]。
指令碼的個別物件
您可能僅指令碼參考特定的查詢,而非完整的資料庫指令碼處理的個別物件。不過,除非藉由使用 WITH SCHEMABINDING 子句所建立所有資料庫物件,
sys.depends 系統資料表中的 [相依性] 資訊不一定精確。 這個 inaccuracy 可能會造成下列問題之一:
- 指令碼的處理程序並不指令碼相依的物件。
- 指令碼的處理程序可能會撰寫指令碼不正確的順序中的物件。若要成功地執行指令碼,您必須手動編輯產生的指令碼。
因此,我們不建議您除非資料庫中有大量的物件,而且指令碼會否則花太長的時間,指令碼個別物件。 如果您必須使用指令碼的個別物件,請依照下列步驟執行:
- 在 SQL Server 管理 Studio 展開 [資料庫],然後再找出您要編寫指令碼的資料庫]。
- 在資料庫上按一下滑鼠右鍵],指向 [指令碼資料庫為]、 指向 要 CREATE,然後再按一下 [檔案]。
- 輸入檔案名稱,然後按一下 [儲存檔案。
核心資料庫容器將編寫指令碼。這個容器包含檔案、 檔案群組、 資料庫和屬性。 - 在資料庫上按一下滑鼠右鍵,指向 [工作],然後再按一下 [產生指令碼。
- 請確定已選取正確的資料庫,然後再按 [下一步]。
- 在 [選取的指令碼選項] 對話方塊變更下列設定從預設值為下列表格中列的值。
摺疊此表格展開此表格
| 指令碼選項 | 要選取值 |
|---|
| Ansi 與邊框距離 | 則為 True |
| 繼續執行指令碼上錯誤 | 則為 True |
| 包括系統限制式名稱 | 則為 True |
| 產生相依物件的指令碼 | 則為 True |
| 定序的指令碼 | 則為 True |
| 指令碼登入 | 則為 True |
| 指令碼物件層級權限 | 則為 True |
| 指令碼統計資料 | 指令碼統計資料和長條圖 |
| 指令碼 USE 資料庫 | 則為 True |
| 編寫索引的指令碼 | 則為 True |
| 指令碼引動程序 | 則為 True |
附註指令碼登入 選項和 指令碼物件層級權限] 選項可能不需要除非結構描述中包含由 dbo 以外的登入所擁有的物件。 - 在 [選擇物件類型] 對話方塊選取 [有問題的查詢引用的所有資料庫物件類型]。
比方說如果查詢只會參考資料表,選取 資料表。 如果查詢參考檢視,選取 檢視及目錄]。 如果有問題的查詢使用使用者定義函式,選取 函式。 - 在選取查詢所參考的所有物件類型按一下 [下一步]。
- 您在步驟 7 中選取每個資料庫物件類型會出現一個對話方塊。 在每個對話方塊中選取特定的資料表、 檢視、 函數或其他的資料庫物件,然後按一下 [下一步]。
- 按一下 [指令碼至檔案] 選項,然後指定相同您在步驟 3 中所輸入的檔案名稱。
- 按一下 [完成] 啟動指令碼]。
當指令碼已完成,將指令碼檔案傳送給 Microsoft 技術支援工程師。 Microsoft 支援工程師也可能會要求下列資訊:
- 硬體組態包括處理器和實體記憶體數量存在數目
- 執行查詢時所使用中的 SET 選項
附註您可能已經提供此資訊由傳送 SQLDiag 報表或 SQL Profiler 追蹤。您可能有也用另一種方法來提供這項資訊。
如何使用資訊
下表協助說明如何查詢最佳化器會使用此資訊來選取查詢計劃。
中繼資料
摺疊此表格展開此表格
| 條件約束 | 查詢最佳化器經常用來偵測矛盾查詢和基礎結構描述之間的條件約束。範例如果查詢有一個"WHERE col = 5"子句和一個 「 CHECK (col < 5) 」 檢查限制式存在,查詢最佳化器知道會符合沒有資料列。
查詢最佳化器會使類似扣除額) 有關空值屬性的類型。比方說"Col 其中位 NULL"子句是已知為 true 或為 False,則取決於資料行的 Null 屬性,以及資料行是從外部資料表的外部聯結。FOREIGN KEY 條件約束的存在是有助於決定基數和適當的聯結順序。查詢最佳化器可以使用條件約束資訊來消除聯結或簡化述詞。這些變更可能會移除需求以存取基底資料表。 |
| 統計資料 | 統計資料資訊包含密度] 及 [顯示索引與統計資料索引鍵的前置字元的資料行的散發的長條圖。依據述詞性質查詢最佳化器可能使用密度、 長條圖或兩者來評估述詞的基數。最新的統計資料所需的精確的基數估計。基數估計是用來作為在估計成本的運算子的輸入。因此,您必須擁有良好的基數估計值,以取得最佳的查詢計劃。 |
| 資料表大小 (資料列和頁面的數目) | 查詢最佳化器使用 [長條圖] 和 [密度計算給定的述詞是,則為 True 或 False 的可能性。 最終的基數估計的計算方式是將機率乘以子運算子所傳回的資料列數目。 在資料表或索引的分頁數目是在估計 IO 成本因數。 資料表大小用來計算一掃描成本並估計將索引搜尋期間存取的分頁數目時很有用。 |
| 資料庫選項 | 數個資料庫選項會影響最佳化。[AUTO_CREATE_STATISTICS] 和 [AUTO_UPDATE_STATISTICS] 選項會影響是否查詢最佳化器會建立新的統計資料或已過期的更新統計資料。參數化 層級會影響參數方式輸入的查詢化之前輸入的查詢交給查詢最佳化器。參數化可以影響基數估計,並且也可以防止對索引檢視表與其他類型的最佳化比對。DATE_CORRELATION_OPTIMIZATION 設定會造成最佳化工具搜尋的資料行之間的相互關聯。此設定會影響基數及成本估計。 |
環境
摺疊此表格展開此表格
| 工作階段的 SET 選項 | ANSI_NULLS 是否設定會影響"NULL = NULL"的運算式評估為 True。外部聯結的基數估計可能會根據目前的設定變更。此外,模稜兩可的運算式也可能會變更。比方說"col = NULL"的運算式評估以不同方式根據設定。不過,"col IS NULL"永遠運算式評估相同的方式。 |
| 硬體資源 | 排序和雜湊運算子的成本取決於相對的 SQL Server 可以使用的記憶體量。比方說如果資料的大小大於快取,查詢最佳化器知道多工緩衝處理的資料必須永遠完到磁碟。不過,如果資料的大小會比快取小很多,作業很可能在記憶體中完成。如果伺服器有一個以上的處理器,而且平行處理原則尚未使用 MAXDOP 」 提示] 或 [最大平行度] 組態選項來停用,SQL Server 也會視為不同的最佳化。 |
| SQL Server 內建保持單元 (SKU) | 在特定版本的 SQL Server 2005 或的 SQL Server 2008 上只啟用某些功能。比方說符合對索引檢視表查詢只發生在 SQL Server 2005 企業版。同樣地,符合對計劃輔助線是限制為 SQL Server 2000 標準版和 SQL Server 2005 企業版。 |