2015-04-03 51 views
4

我試圖看到列表存儲索引可以提供的性能增益。該表大約有370萬行,11列,並作爲堆存儲(即沒有主鍵)。我在表上創建一個列存儲索引和運行以下查詢:爲什麼表上主鍵的存在顯着提高了列存儲索引的性能?

SELECT 
    [Area], [Family], 
    AVG([Global Sales Value]) AS [Average GlobalSalesValue], 
    COUNT([Projected Sales]) 
FROM 
    dbo.copy_Global_Previous5FullYearSales 
WHERE 
    [Year] > 2012 
GROUP BY 
    [Area], [Family] 

create table語句如下:

CREATE TABLE [dbo].[copy_Global_Previous5FullYearSales] 
(
    [SBU] [NVARCHAR](10) NULL, 
    [Year] [INT] NULL, 
    [Global Sales Value] [MONEY] NULL, 
    [Area] [NVARCHAR](50) NULL, 
    [Sub Area] [NVARCHAR](50) NULL, 
    [Projected Sales] [MONEY] NULL, 
    [Family] [NVARCHAR](50) NULL, 
    [Sub Family 1] [NVARCHAR](50) NULL, 
    [Sub Family 2] [NVARCHAR](50) NULL, 
    [Manufacturer] [NVARCHAR](40) NULL, 
    [rowguid] [UNIQUEIDENTIFIER] NOT NULL, 
    [ID] [INT] IDENTITY(1,1) NOT NULL, 

    PRIMARY KEY CLUSTERED ([ID] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
       ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

的性能提升,我從列存儲索引獲得本情況可以忽略不計。帶有列存儲索引的查詢幾乎與沒有索引的原始查詢一樣慢,在某些情況下甚至更慢,即使使用批處理模式也是如此。令人驚訝的是,當我在現有表上創建一個不斷增加的主鍵 - ID並重建列存儲索引時,CPU時間得到了15倍的提高,並且經過的時間得到了3倍的提高。

我不明白如何添加主鍵可能會影響以壓縮格式存儲數據的列存儲索引的查詢性能。此外,主鍵只會改變頁面的排列順序,在這種情況下,頁面排序無效。

下面是執行計劃Execution Plan

+3

附註:堆表並不意味着沒有主鍵。你可以創建一個沒有問題的非集羣主鍵(並且對於某些類型的主鍵實際上是有意義的) – 2015-04-03 13:22:57

+0

@Martin - 嗨,我已經添加了create table語句。計劃完成後,它只是單獨剪輯。所以,排序後,有一個流聚合。 – user2673722 2015-04-03 13:25:28

+0

@ user2673722謝謝,是的,我意識到了這一點。堆和CI情況下的計劃是否相同?在這兩種情況下,您是否看過兩種情況下的讀數數量和指數佔用的大小? – 2015-04-03 13:27:36

回答

3

的一個重要變化,列存儲是如何內置存在。由於構建器獲得其輸入以便產生的段更適合用於段消除。閱讀更多信息:Ensuring Your Data is Sorted or Nearly Sorted by Date to Benefit from Date Range Elimination

數據倉庫查詢中最常見的過濾器類型是按日期排列的。如果系統可以通過查看段中列的最小值和最大值來確定沒有行符合條件,則列存儲段消除可幫助您跳過整個一百萬行段。因此,您通常會希望確保您的細分受到按日期排序或幾乎排序,因此可以儘可能快地執行日期篩選。

你的訂單是ID但我敢肯定,這會導致功能依賴副作用。

+0

嗨,我命令它的ID,但我怎麼會改變頁面的排列方式,因爲ID列只是爲每列添加一個唯一的編號......另外,我甚至在創建列時不使用ID列存儲索引。 – user2673722 2015-04-03 13:47:00

+0

@ user2673722如果您仍然擁有表格的兩個副本,則可以在此查看段邊界和段消除http://www.sqlskills.com/blogs/joe/exploring-columnstore-index-metadata- segment-distribution-and-elimination-behaviour/ – 2015-04-03 13:49:08

+0

@ user2673722閱讀鏈接的文章,他們解釋了爲什麼使用ID很重要,*即使您從不使用它*。 – 2015-04-03 14:10:10

相關問題