SQL Server On Linux(27)——SQL Server on Linux 性能(11)——列存儲索引案例

本人新書上市,請多多關照:《SQL Server On Linux運維實戰 2017版從入門到精通》

在這裏插入圖片描述

接上文:SQL Server On Linux(26)——SQL Server on Linux 性能(10)——列存儲索引簡介這次來做一個簡單的實操演示

  這次我們使用WideWorldImportersDW庫來演示。

  首先查一下哪些表用了聚集列存儲索引:

USE [wideworldimportersdw]
GO
SELECT OBJECT_NAME(object_id) as table_name, name, type_desc
FROM sys.indexes
WHERE type = 5 -- type = 5 指的是聚集列存儲索引
GO

  這個庫有6個表用了聚集列存儲索引。我們挑一個常見的Sale表,全名Fact.Sales。
在這裏插入圖片描述

  接下來我們跑一個查詢,看一下聚集列存儲索引的工作原理,這裏使用Fact.Sale表,包含了228265行數據,這個表有兩個時間列,但是數據按“Delivery Date Key”來排序,所以我們接下來的Where條件會使用這個列來做篩選。
  SQL Server有元數據來存儲元組中每個片段的範圍值,如果數據按照某個列排序,SQL Server會基於查詢的條件跳過特定行組。

在這裏插入圖片描述

USE [wideworldimportersdw]
GO
SET STATISTICS IO ON
GO
SET STATISTICS XML ON
GO
SELECT * FROM Fact.Sale
WHERE [Delivery Date Key] >= '2016-01-01'
GO

  執行時間和I/O統計信息如下:

Table ‘Sale’. Scan count 1, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 644, lob physical reads 39, lob page server reads 0, lob read-ahead reads 627, lob page server read-ahead reads 0.
Table ‘Sale’. Segment reads 2, segment skipped 2.

  lob logical reads是指SQL Server通過聚集列存儲索引在內存的cache中查詢所需數據的讀取次數。SQL Server把列存儲索引存儲在LOB中,所以我們這裏用的是lob的值而不是前面的logical reads。
  第二部分的Segment reads是指片段的讀取次數,segment skipped是片段消除數量,這裏有點誤導,實際上應該是rowgroups read和rowgroups skipped。這裏的解讀是聚集列存儲索引有4(2+2)個rowgroups,由於片段消除導致可以跳過2個,也就是說只需要讀取4個裏面的2個即可。

在這裏插入圖片描述

  再看另外一個查詢:

USE [wideworldimportersdw]
GO
SET STATISTICS IO ON
GO
SET STATISTICS XML ON
GO
SELECT [Customer Key], Quantity
FROM Fact.Sale
WHERE [Delivery Date Key] >= '2016-01-01'
GO

Table ‘Sale’. Scan count 1, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 49, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table ‘Sale’. Segment reads 2, segment skipped 2.

  這個查詢相對於前面的來說就是列少了,可以看到lob logical reads從644降到49,因爲列少,所以所需的片段更少,當數據量非常大的時候,這種降幅是很明顯的。

總結

  從這個演示中得到幾點:

  1. 不管是行存儲索引還是列存儲索引,對於關係型數據庫,總是使用表的所有列並不是最佳實踐。
  2. 用SET STATISTICS IO 來獲取I/O信息的過程中,對於列存儲索引,要看Lob logical reads和Lob physical reads。對於行存儲索引,我們一般看logical reads/physical reads即可。
  3. 演示裏面沒有說明,但是額外說一下,對於聚集列存儲索引,截至目前版本2019,都沒有查找操作,也就是說只能看到聚集列存儲索引掃描操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章