分區表的查詢

来源:http://www.cnblogs.com/double-K/archive/2016/05/17/5503379.html
-Advertisement-
Play Games

前一篇文章提到了在2014下分區表引起的奇葩問題,最近也在苦苦研究問題的原因。這篇文章主要講述在分區表下,查詢是怎麼樣的一個情況。由於2014的新功能“參數估計”下是如何運轉的目前無從得知,所以只能分享下2008下的原理了... 在 SQL Server 2008 中,已分區表的內部表示形式已發生變 ...


  前一篇文章提到了在2014下分區表引起的奇葩問題,最近也在苦苦研究問題的原因。這篇文章主要講述在分區表下,查詢是怎麼樣的一個情況。由於2014的新功能“參數估計”下是如何運轉的目前無從得知,所以只能分享下2008下的原理了...

  在 SQL Server 2008 中,已分區表的內部表示形式已發生變化,即已分區表將作為一個多列索引呈現給查詢處理器,其中 PartitionID是第一列。PartitionID 是一個隱藏的計算列,用於在內部表示包含特定行的分區的 ID。例如,假設一個定義為 T(a, b, c) 的表 T 在 a列進行了分區,併在 b 列的聚集索引。在 SQL Server 2008 中,此分區表在內部被視為一個具有架構 T(PartitionID, a, b, c) 的未分區表,並具有組合鍵 (PartitionID, b) 的聚集索引。這樣查詢優化器便可以基於 PartitionID 對任何已分區表或索引執行查找操作。

  此外,查詢優化器的功能也得以擴展,可以針對 PartitionID(作為邏輯首列)以及其他可能的索引鍵列執行某一條件下的查找或掃描操作,然後,對於符合第一級查找操作的條件的每個不同值,再針對一個或多個其他列執行不同條件下的二級查找。也就是說,這種稱為“skip-scan”的操作允許查詢優化器基於某一條件來執行查找或掃描操作以確定要訪問的分區,然後在該運算符內執行一個二級索引查找操作以返回這些分區中符合另一個不同條件的行。例如,請考慮以下查詢。

  SELECT * FROM T WHERE a < 10 and b = 2;

對於本示例,假設定義為 T(a, b, c) 的表 T 對 a 列進行了分區,並具有 b 的聚集索引。表 T 的分區邊界由以下分區函數定義:

  CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE LEFT FOR VALUES (3, 7, 10);

  為求解該查詢,查詢處理器將執行第一級查找操作以查找包含符合條件 T.a < 10 的行的每個分區。這將標識要訪問的分區。然後,在所標識的每個分區內,處理器將針對 b 列的聚集索引執行一個二級查找以查找符合條件 T.b = 2 和 T.a < 10 的行。

下圖所示為跳躍掃描操作的邏輯表示形式,其中顯示了在 a 列和 b 列中包含數據的表 T。分區編號為 1 到 4,分區邊界由垂直虛線表示。對分區執行的第一級查找操作(圖中未顯示)已確定分區 1、2 和 3 符合查找條件(由為該表定義的分區和 a 列的謂詞指示),即T.a < 10。曲線指示了跳躍掃描操作的二級查找部分所遍歷的路徑。實際上,跳躍掃描操作將在這些分區的每個分區中查找符合條件 b = 2 的行。跳躍掃描操作的總開銷等於三個單獨索引查找之和。

顯示跳過掃描操作。

 

 

-------已分區堆的執行計劃------------------------------------------------------

  

  已分區堆被視為分區 ID 的邏輯索引。已分區堆的分區排除在執行計劃中表示為一個 Table Scan 運算符,其中對分區 ID 使用了 SEEK 謂詞。下麵的示例顯示了所提供的顯示計劃信息:

|-- Table Scan (OBJECT: ([db].[dbo].[T]), SEEK: ([PtnId1001]=[Expr1011]) ORDERED FORWARD)

 

 

------歸置聯接的執行計劃--------------------------------------------------------

  使用相同或等效的分區函數對兩個表進行分區並且在查詢的聯接條件中指定了來自聯接兩側的分區依據列時就會發生聯接歸置。查詢優化器可以生成一個計劃,其中具有相等分區 ID 的每個表的分區將分別聯接在一起。歸置聯接可能比非歸置聯接的執行速度快,因為前者可以只需較少的記憶體和處理時間。優化器會基於成本估計來選擇非歸置計劃或歸置計劃。

在歸置計劃中,Nested Loops 聯接從內側讀取一個或多個聯接表或索引分區。Constant Scan 運算符內的數字表示分區號。

為已分區表或索引生成歸置聯接的並行計劃時,在 Constant Scan 和 Nested Loops 聯接運算符之間會出現一個 Parallelism 運算符。在此情況下,在聯接外側的多個線程會各自在不同的分區上進行讀取和操作。

下圖顯示了一個歸置聯接的並行查詢計劃。

歸置聯接的執行計劃

 

 

------並行查詢執行策略--------------------------------------------------------

  查詢處理器對從已分區對象選擇的查詢使用查詢執行策略。作為執行策略的一部分,查詢處理器會確定查詢所需的表分區,以及要分配給每個分區的線程比例。在大多數情況下,查詢處理器會為每個分區分配數量相等或幾乎相等的線程,然後在這些分區中並行地執行查詢。以下幾段更詳細地介紹了線程分配情況。

如果線程數小於分區數,則查詢處理器會將每個線程分配給一個不同的分區,最初會有一個或多個分區沒有獲得分配的線程。當線程完成在一個分區上的執行時,查詢處理器會將它分配給下一個分區,直到每個分區都分配有一個線程。這是查詢處理器將線程重新分配給其他分區的唯一情況。

顯示在完成後重新分配的線程

如果線程數與分區數相等,則查詢處理器會為每個分區分配一個線程。當線程完成時,不會重新分配給另一個分區。

顯示給每個分區分配一個線程

如果線程數大於分區數,則查詢處理器會為每個分區分配相等數量的線程。如果線程數並非恰好是分區數的倍數,則查詢處理器會為某些分區額外分配一個線程,以使用所有可用線程。請註意,如果只有一個分區,則會將所有線程都分配給該分區。在下圖中,有四個分區和 14 個線程。每個分區都分配有 3 個線程,兩個分區具有一個額外的線程,總共分配了 14 個線程。當線程完成時,不會重新分配給另一個分區。

顯示給分區分配多個線程

儘管以上示例指出了一種分配線程的簡單方式,但實際策略要複雜一些,並需要考慮在查詢執行過程中出現的其他變化因素。例如,如果表已分區,併在 A 列上有一個聚集索引,並且查詢有謂詞子句 WHERE A IN (13, 17, 25),則查詢處理器將為這三個查找值(A=13、A=17 和 A=25))各分配一個或多個線程,而不是為每個表分區分配一個或多個線程。只需在包含這些值的分區中執行查詢,並且如果所有這些查找謂詞都恰好在同一個表分區中,則所有線程都將分配給同一個表分區。

為了舉出另一個示例,假定表在 A 列上有四個分區(邊界點為 (10, 20, 30)),在 B 列上有一個索引,並且查詢有一個謂詞子句WHERE B IN (50, 100, 150)。因為表分區是基於值 A,所以值 B 可以出現在任何表分區中。這樣,查詢處理器將分別在四個表分區中查找三個 B 值 (50, 100, 150) 中的每一個值。查詢處理器將按比例分配線程,以便它可以並行執行 12 個查詢掃描中的每一個掃描。

 

基於 A 列的表分區

在每個表分區中查找 B 列

表分區 1:A < 10

B=50, B=100, B=150

表分區 2:A >= 10 AND A < 20

B=50, B=100, B=150

表分區 3:A >= 20 AND A < 30

B=50, B=100, B=150

表分區 4:A >= 30

B=50, B=100, B=150


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

-Advertisement-
Play Games
更多相關文章
  • FFMPEG編譯成Android庫已經有很多案例了,編譯優化neon的也很多,以下是我通過實踐成功的案例,這裡主要講編譯的配置文件,其他設置可結合Linux下使用NDK編譯FFMPEG(libstagefright)進行配置。 config_android.sh 關鍵的幾個參數是 有一篇博客的參數" ...
  • [實踐] Android5.1.1源碼 - 讓某個APP以解釋執行模式運行 作者:尋禹@阿裡聚安全 前言 本文的實踐修改了Android5.1.1的源碼。 本文只簡單的講了一下原理。在“實踐”一節講了具體做法。 ​ 本文的內容涉及Art模式下dex載入的知識,想要詳細瞭解這部分知識可以去看老羅的文章 ...
  • Genymotion - Android 模擬器 ...
  • 仿照Mac上的截圖編輯功能做的一個圖片編輯的Demo,功能有畫矩形,圓形,箭頭,手寫,輸入文字和分享. 做的時候看到一個大神的帖子寫的一個文字動畫的教程,故順帶學習做了一個類似的文字下落動畫. 有興趣的可以看看,github 鏈接如下: https://github.com/xl20071926/L ...
  • 1、連接Mysql 格式: mysql -h主機地址 -u用戶名 -p用戶密碼1、連接到本機上的MYSQL。 首先打開DOS視窗,然後進入目錄mysql\bin,再鍵入命令mysql -u root -p,回車後提示你輸密碼.註意用戶名前可以有空格也可以沒有空格,但是密碼前必須沒有空格,否則讓你重新 ...
  • http://timmurphy.org/tag/mysql/ http://timmurphy.org/2009/11/17/use-schema_name-in-postgresql/ For those moving from MySQL to PostgreSQL, there are a ...
  • mysql防止重覆插入記錄方法總結 防止mysql重覆插入記錄的方法有很多種,常用的是ignore,Replace,ON DUPLICATE KEY UPDATE,當然我們也可以在php中加以判斷了。 方案一:使用ignore關鍵字 如果是用主鍵primary或者唯一索引unique區分了記錄的唯一 ...
  • MyEclipse連接Mysql資料庫 準備工作:MyEclipse使用的是2013版,mysql Ver 14.14 Distrib 5.6.28 1.jar包的下載(jdbc驅動) 我下載的是:mysql-connector-java-5.1.7-bin.jar 2.打開MyEclipse >選 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...