使用定時任務優化SQL查詢
SQL Server查詢性能調優被視為主要問題,因為數據庫管理人員一直在不斷努力以實現其托管系統的最高性能和最低資源使用率。
在競爭激烈的IT行業中,主要挑戰是使產品在市場上可供用戶使用,以便他們不選擇任何其他選擇。產品的開發旨在以出色的性能和最新技術使客戶受益。開發的產品及其性能足以使用戶充分利用技術。當然,大多數產品/應用程序可能正在處理后端服務和數據庫服務器之間的大量數據流。
一個理想且負責任的敬業軟件開發團隊認為,編寫高效的查詢以提供更快,更優化的結果為己任。除此之外,我們還必須優化執行緩慢且無法給出更快結果的SQL查詢。
SQL Server查詢性能調優被視為主要問題,因為數據庫管理人員一直在不斷努力以實現其托管系統的最高性能和最低資源使用率。
使用SQL執行計劃作為任何數據庫管理員的首要方法,我們可以調出查詢輸出調優。這就是該策略如何建議我們進行調整的方式。我們演示了如何通過執行路線圖演示在內部完成任務。查詢最昂貴的方面是最好的寫查詢和推薦的索引。
1.在SQL查詢中獲得高性能的最佳實踐
在進入執行計劃之前,讓我們通過一些最佳實踐來編寫高級SQL查詢。在這里,我們假設您具有如何編寫SQL查詢的基本知識,并且以下幾點是按照最佳實踐實現高性能的要點。
僅對必需列執行此查詢,這將確保針對必需列觸發db查詢,并且不會獲取任何不必要的列,從而確保更好地滿足效率和規范。除非它完全符合目的,否則請勿回復查詢。
應該避免子查詢。根據需要執行加入或編寫的功能。
利用適當的索引(以獲得更快的搜索結果)。
經常注意結果中的NULL事件。
通常在SQL語句涉及多個源的情況下使用表別名。它提高了可讀性,維護性,并確保收集了正確的色譜柱。
在ORDER BY子句中,不要包括列號。使用此功能的主要目的是為了可用性和可伸縮性,而不僅僅是性能。創建數據庫時可能不必擔心,但是隨著時間的流逝,新列將應用于SELECT語句,或者無論您是否使用了ColumnNumber,原始表都將重新排序。當您使用ColumnNumber時,結果將是不可預測的,并且在ORDERBY方面是錯誤的。
在列列表中使用INSERT語句很重要。我們建議這樣做,以幫助軟件開發人員避免對添加到列的NULL值進行表修改。因此,可以容易地確定影響。
對于T-SQL代碼,切勿使用雙引號。
您不應該對以“ sp_”開頭的存儲過程使用前綴。這是SQL為我們提供的系統語法。建議遵循一種獨特的模式來命名易于區分的書面程序。
2.什么是SQL執行計劃?
如所討論的,執行計劃是SQL查詢處理器執行的不同操作的圖形表示。當您執行任何查詢時,查詢處理器將生成一個執行計劃以及要啟動的查詢?;旧?,它提供了兩個主要的執行計劃。
估計執行計劃
這種類型的計劃是在查詢執行之前生成的,或者可以說是在編譯期間生成的。
這只是查詢處理器的估計。
與此不提供任何運行時信息。
實際執行計劃
這種類型的計劃是在執行查詢后生成的,或者可以說是在運行時間之后生成的。
它由查詢處理器提供實際信息。
它提供了所有信息,例如執行該查詢時涉及的步驟。
3.如何創建一個SQL執行計劃?
當您執行任何查詢時,會生成一個執行計劃,該查詢必然包含該查詢以及該計劃。還有許多其他方式可以執行此計劃。就像您可以使用“菜單”按鈕,工具欄按鈕和快捷鍵一樣。有關更多詳細信息,讓我們深入了解以下過程。
快捷鍵:有一個快捷鍵可用于檢查“估計執行”計劃。在“查詢”窗口中編寫查詢后,可以按Ctrl + L。
在查詢窗口的上下文菜單中,您將找到一個名為“顯示估計的執行計劃”的菜單。它的工作方式與上述步驟相同。它將顯示“估計執行計劃”。另外,在“查詢”菜單中,有一個選項可用,名為“顯示估計的執行計劃”。
在工具欄中,有一個帶有此圖像的按鈕。圖像這就是“實際執行”計劃的確切功能,這里有一個快捷鍵,即Ctrl +M。
(注意:如果該按鈕不存在,請選中“添加或刪除按鈕”。此外,在“查詢”菜單中,有一個名為“包括實際執行計劃”的選項。
估計執行計劃示例
實際執行計劃示例
正如您在示例中看到的那樣,它顯示了實際執行計劃。我們已經執行了查詢,并且有3個選項卡可用。如果您檢查差異,它將顯示您花費的掃描時間。我們可以將執行計劃分為三個部分。
聚集索引掃描(聚集)
排序操作
選擇操作
4. SQL執行計劃的組成部分是什么?
由于表中沒有可用的數據,它是一個簡單的查詢,因此估算的執行計劃和實際的執行計劃將是相同的,但是如果您使用大型查詢,則會發現兩者之間的差異。您可以使用它來優化查詢。
當您將鼠標懸停在“聚集索引掃描”上時,將提供詳細的結果??纯聪旅娴慕貓D。
如果您在上圖中看到,SQL提供了不同的詳細信息。我們將詳細討論所有內容。
物理操作:物理操作員是執行此類操作的對象。其中一些示例是“索引查找”,“聚簇索引掃描”等。邏輯運算符正在指導此類運算符執行已定義的操作。
邏輯操作:在物理操作中,我們的軟件開發人員使用邏輯操作員的工作。它還清楚地說明了必須進行哪些查詢以及如何執行查詢。
實際執行模式:本節將描述要執行的實際計劃。處理引擎使用它,并執行查詢。
估計執行模式:與上述計劃類似,但唯一的不同是它顯示了估計值。
存儲:查詢觸發的輸出就像從查詢中提取的優化程序一樣。
所有執行的合法事實和數字-實際計劃將顯示執行計劃中的所有實際數字和數字。根據這種情況,我們將不會獲得任何記錄,也不會獲得任何回報。
實際批次數:僅在實際執行計劃中存在。如果是批處理查詢,則將返回“無批處理”。
估計的運營成本:如果查詢中涉及其他任何運營成本,則將對此進行計算并顯示在此處。
估計的I / O成本:它顯示輸入和輸出成本的準確數量。
估計的CPU成本:它估計使用CPU執行操作的成本。
估計的子樹成本:生成執行計劃時,它將生成樹。從現在開始,您將可以計算
執行次數:僅在實際執行計劃中存在。在單個批處理中,優化程序可以處理的執行次數。
估算的執行次數:與上述估算的執行次數相似,但唯一的區別在于它將為您提供估算的值。
每次執行的估計行數:這只是來自Optimizer的估計,即將返回多少行。
預計要讀取的行數:這只是來自Optimizer的估計,即將讀取多少行。
估計行大?。侯櫭剂x,它向您顯示存儲的估計行大小。
實際重新綁定-在實際執行計劃期間將處于活動狀態。它提供了信息,例如必須重新評估對象處理多少次。
倒退實際編號:這部分將在實際執行計劃中再次重復。
在關聯操作中,通過重復使用內部結果數據集來執行總行數。
已排序:確定執行操作的數據集是否已實現排序。如果您在上面的示例中簽入,則會給您False,因為到目前為止尚未進行排序。一旦排序完成,那就是正確的。
節點ID:這是從右到左,然后是通常的從上到下的唯一編號類型。因此,我們可以說,基于執行計劃樹,右下角將具有NodeID = 1,左上角將具有最大節點數。
在“添加”中,還有另外兩個組件。我們可以在下面查看其信息。
對象:定義我們對其執行查詢或操作的表。
輸出列表:定義選定的列,這些列將顯示在數據集或結果中。
在表格中搜索數據
現在,我們將通過一個示例來更深入地研究這個問題,因此在開始之前,讓我們梳理一下有關索引以及索引之間的比較的知識。
表格掃描:在這種類型的掃描中,無論其是否符合給定的搜索結果,都以觸及表格的每一行的方式全面執行掃描。這種類型的掃描是檢查小型表的有效方法,在該表中,大多數行都符合謂詞的條件。估計成本將與表中的總行數成比例。
索引掃描:如果表具有聚集索引,則執行的查詢應覆蓋所有行和列。因此,建議觸發一個查詢,該查詢將覆蓋表的大多數行或幾乎所有行。即沒有WHERE或Getting子句的查詢,將使用索引搜索。在數據庫優化的過程中,查詢優化器從可用索引中選擇最佳的索引。并且基于該信息,在掃描整個表時會清楚地定義子句功能。
此子句保留數據庫的統計信息。
選擇正確的索引的那一刻。下一步是將樹結構導航到所有匹配的數據點,并使用SQL查詢處理器或引擎提取確切的記錄。
全表搜索和索引掃描之間的主要區別之一是,當數據在索引樹中排序時,數據庫引擎會了解何時達到極限并仍在尋找極限。然后,它可以提交問題,或者在適當時傳遞到下一個數據集。
尋求索引:成本與表中符合條件的行和頁面的數量成正比,而不是與表中的總行數成正比,因為只有符合條件的行和包含這些符合條件的行的頁面受搜索這三者的影響,因此最快的一個。
5.執行計劃如何提高查詢性能?
根據執行計劃中顯示的上圖,有4個不同的查詢,但有一些細微的變化。讓我們一一看一下,并嘗試了解執行計劃可以帶來哪些改進。
查詢1:從Department WHERE DepartmentName ='HR'中選擇DepartmentID,DepartmentName
該表沒有定義任何主鍵,因此沒有創建任何聚集索引。這將執行完整的表掃描,這在第一個執行計劃中可見。如果表中的記錄數為百萬,則此查詢將花費最長時間。
查詢2: SELECT EmployeeID,EmployeeName,DepartmentID,BirthDate FROM Employee WHERE DepartmentID = 3
該查詢正在執行索引掃描,這比表掃描快一點,因為它將以通過聚簇索引存儲數據的方式將數據排序。如果表中包含大量數據,速度仍然會較慢。
查詢3: SELECT * FROM Employee WHERE BirthDate ='1982-08-07'我在BirthDate列上創建了一個非聚集索引,如上圖所示。請注意,這些列顯示在下圖中的包含選項卡中。這意味著,只有在select子句中選擇了很多列并且WHERE子句位于Birthdate列上時,才能執行索引查找。
第三個執行計劃仍在顯示索引掃描。使困惑!請參考最佳做法部分中的第一個要點,以獲得高性能。您可以在SELECT子句中編寫*,而不是特定的列。這阻止了索引查找功能,并且我們沒有收到預期的期望性能。盡管在數據庫中創建了非集群?,F在,讓我們檢查最終查詢。
查詢4:從員工WHERE BirthDate ='1982-08-07'中選擇EmployeeID,EmployeeName,DepartmentID,BirthDate
您會注意到,由于我們遵循了最佳實踐,并且已準確創建了非聚集索引,因此該查詢已使用了索引查找。
為了確定性能改進,應該了解最佳實踐和有關SQL Server的深入知識。執行計劃通過其圖形表示幫助查找丟失的內容,因此人們可以輕松地找到操作項以提高特定查詢的性能。我希望這個例子能對如何找出查詢中的改進有所啟發。
6.結論
在本文中,我們進行了廣泛的研究,并獲得了有關執行計劃的見解。關于如何生成執行計劃,計劃的執行計劃與實際執行計劃之間的差異以及執行計劃節點的各個組成部分,一些秘密策略是已知的。我們還了解了執行計劃如何幫助查找查詢中的改進。該工具對于DBA應對日常挑戰以及涉及大數據的問題非常有用,因此您可以再次檢查執行計劃并在需要時優化查詢。