SQL Server 並行操作優化,避免並行操作被抑制而影響SQL的執行效率

来源:http://www.cnblogs.com/wy123/archive/2016/07/12/5661848.html
-Advertisement-
Play Games

為什麼我也要說SQL Server的並行: 這幾天園子里寫關於SQL Server並行的文章很多,不管怎麼樣,都讓人對並行操作有了更深刻的認識。 我想說的是:儘管並行操作可能(並不是一定)存在這樣或者那樣的問題,但是我們不能否認並行,仍然要利用好並行。 但是,實際開發中,某些SQL語句的寫法會導致用 ...


 

為什麼我也要說SQL Server的並行:

這幾天園子里寫關於SQL Server並行的文章很多,不管怎麼樣,都讓人對並行操作有了更深刻的認識。

我想說的是:儘管並行操作可能(並不是一定)存在這樣或者那樣的問題,但是我們不能否認並行,仍然要利用好並行。

但是,實際開發中,某些SQL語句的寫法會導致用不到並行,從而影響到SQL的執行效率

所以,本文要表達的是:我們要利用好並行,不要讓一些SQL的寫法問題“抑制”了並行,讓我們享受不了並行帶來的快感

 

關於SQL Server的並行:

所謂的並行,指SQL Server對於那些執行代價相對較大(這個相對跟你的設置有關)的SQL時,如果資料庫伺服器存在多顆CPU,

SQL Server查詢引擎會採用並行的方式,也即採用多顆CPU參與整個運算過程,每顆CPU“分擔”一部分計算任務,最後彙總合併各個CPU的計算的一種行為

有時候,不當的並行查詢不但不會加快查詢的速度,想反會拖慢查詢的效率,如果採用不當的並行操作,甚至會影響到整個伺服器的穩定性。

所以SQL Server 究竟在多大代價下啟用並行,是由配置的,這個配置可根據具體的情況做修改,有人說這個值的單位是“秒”,貌似沒見過權威的資料說過到底單位是什麼,這裡暫不追究

有清楚這個閾值單位的園友情不惜賜教,謝了

 

 

儘管並行操作可能存在這樣活著那樣的問題,但是我們不能因噎廢食,利用好並行,往往總是利大於弊。

但是並不是所有的執行代價較大SQL都能用到並行操作,實際開發中,有一些SQL的寫法會抑制到並行操作,結果,導致整個SQL語句(存儲過程)的效率上不去。

下麵來舉例說明。

 

並行查詢是如何變成了串列的:

  如下是一個非常簡單的查詢操作,這些寫法下,預設情況下開啟了並行,可以看到,一共開啟了8個線程來對SQL語句做計算。

  

 

  當然這SQL的執行效率還算不錯,CPU時間是622毫秒,執行總時間是130毫秒,

  這裡不要弄混淆了,CPU時間的633毫秒,是8個CPU一共消耗的CPU時間,大於總的執行130毫秒很正常的

  

 

  下麵創建一個非常簡單的函數,

CREATE function [dbo].[fn_justFunction](@p_date date)
returns date
as
begin
    return @p_date
end

  這個函數並沒有什麼實際意義,執行也非常簡單,傳入一個時間,返回這個時間,

  

  

  當然這裡只是為了下麵的操作演示,你完全可以說我蛋疼,我只是為了演示並行被抑制的現象

  翻翻你的SQL代碼,有沒有類似這種寫法?

 

 

  然後我們這麼寫這個查詢,就是在查詢條件上這麼處理CreateDate>dbo.fn_justFunction('2015-1-1')(註意不是表的列,而是函數作用在查詢條件上),

  註意這個函數並不影響任何查詢結果,傳入的2015-1-1,返回位依舊是2015-1-1,但是這麼一變化,並行就變成串列的了,

  SQL執行期間只有一個CPU飈了起來,使用了到達80%左右,,與此同時其他CPU跟沒事人一樣,也不上來幫忙,還是很閑

  還記得上面並行操作方式執行時間是多少麽?130毫秒,現在粗看起來是多少,這裡是4S,也就是4000毫秒了。差了多少倍,我數學不好算不出來

 

  

  

 

  可以看到,並行操作和串列操作的效率差別還是很大的,對於CPU的利用也不充分(當然我不是強調一定要用滿所有的CPU才算合理)

  再次強調一點,這裡並不是在表的欄位上加函數抑制了索引什麼的,純粹的影響到的是並行操作。

  當然,抑制並行的寫法不單單是在查詢條件在使用函數,實際開發中,影響會更大,

  因為實際業務中數據有可能會更大,SQL也可能更加複雜,這種情況可能更加難以甄別。

  比如連接條件上,如下,連接條件上使用函數導致無法使用並行的情況,也是實際開發中遇到的

  select * from TableA a inner join TableB b on a.id=b.id and a.Column=dbo.function(@Variable)  where ***

  當然抑制到並行操作的不單單隻有這兩種寫法,還有可能潛在其他類似的寫法也會影響到並行查詢。

  這就要求我們在寫SQL的時候,不但要註意不能再欄位上使用函數(無法使用該欄位上的索引),同樣,查詢條件上也儘可能不要使用函數,有可能影響到並行操作。

 

 

如果處理並行操作被抑制的情況: 

  如果要解決類似這些個問題,該怎麼辦?其實也很簡單,建議查詢條件通過函數運算之後賦值給一個變數,用變數去作為查詢條件進行查詢。

  再次開始了愉快的並行,享受並行帶來的快感。

  

 

  對於連接條件上的函數處理也類似,將結果計算出來之後,保存在一個變數中,把變數寫在連接條件中,

  當然可能有其他辦法,我暫時還沒有想到。

 

 

總結:

  本文通過一個簡單的例子演示了並行操作被抑制的現象,說明瞭並行和串列在執行一個代價較大的SQL上的性能的巨大的差別

  其中提到的查詢方式是查詢條件上因為函數的原因抑制了並行,完全區別於在查詢列上使用函數抑制索引的情況。

  並行查詢可以充分調動CPU資源,以高效的方式完成查詢,合理的利用並行會很大程度上提高SQL的執行效率。

  為了利用好並行,在寫SQL的時候,一定要註意,防止並行操作遭到抑制,給性能帶來影響。

 

 

  SQL優化是一個艱難而又反覆的過程,即便如此,也樂在其中。

  面對繁複SQL,不但要有過硬的技術,也要有足夠的耐心,才能看清事物的本質。

  對並行的理解還不夠充分,有不對的地方希望各位看官指出,謝謝。

 

出處:http://www.cnblogs.com/wy123/p/5661848.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • select count(1) as nums, sd.name from [Master].[dbo].[SYSPROCESSES] spinner join [Master].[dbo].[SYSDATABASES] sd on sp.dbid=sd.dbid--where --sd.name ...
  • 問題 我們經常遇到一種情況,在SSMS中運行很慢的一個查詢,當把查詢轉化成從源到目的資料庫的SSIS數據流以後,需要花費幾倍的時間!源和數據源都沒有任何軟硬體瓶頸,並且沒有大量的格式轉換。之前看了很多關於這種情況的優化方案,例如擴大緩存大小等。雖然也能快一點,但是仍然遠遠比直接在SSMS中查詢的速度 ...
  • 在Sql server 2012裡面,開窗函數豐富了許多,其中帶出了2個新的函數 First_Value 和 Last Value .現在來介紹一下這2個函數的應用場景. 首先分析一下First_Value(),用法是根據Partition By對數據進行分區,如果忽略Partition By ,那 ...
  • 生成1到300個數字的方法 方法一 cross join 方法二 while迴圈 方法三 CTE遞歸 ...
  • PLAN_TABLE PLAN_TABLE is automatically created as a global temporary table to hold(保存) the output of an EXPLAIN PLAN statement for all users.PLAN_TABL ...
  • 數據的插入(INSERT語句的使用方法) 原則上,執行一次INSERT語句會插入一行數據。 對錶進行全列INSERT時,可以省略表名後的列清單。 省略INSERT語句中的列名,就會自動設定為該列的預設值(沒有預設值時會設定為NULL)。 從其他表中複製數據:INSERT …SELECT。 INSER ...
  • 1,很奇怪,控制面板找不到SQL的卸載程式,後來在網上查知需要修複windows卸載/安裝程式,官網下載網址: 1.1 下載雙擊打開後,直接選next 1.2 根據你的情況選擇,我這裡選擇“卸載” 1.3 這裡可以看到你電腦中所有安裝程式,選中你所需要修複的卸載程式,點擊next(我這圖是卸載完再截 ...
  • 第一招、mysql服務的啟動和停止 net stop mysql net start mysql 第二招、登陸mysql 語法如下: mysql -u用戶名 -p用戶密碼 鍵入命令mysql -uroot -p, 回車後提示你輸入密碼,輸入12345,然後回車即可進入到mysql中了,mysql的提 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...