我試圖看到列表存儲索引可以提供的性能增益。該表大約有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倍的提高。
我不明白如何添加主鍵可能會影響以壓縮格式存儲數據的列存儲索引的查詢性能。此外,主鍵只會改變頁面的排列順序,在這種情況下,頁面排序無效。
下面是執行計劃
附註:堆表並不意味着沒有主鍵。你可以創建一個沒有問題的非集羣主鍵(並且對於某些類型的主鍵實際上是有意義的) – 2015-04-03 13:22:57
@Martin - 嗨,我已經添加了create table語句。計劃完成後,它只是單獨剪輯。所以,排序後,有一個流聚合。 – user2673722 2015-04-03 13:25:28
@ user2673722謝謝,是的,我意識到了這一點。堆和CI情況下的計劃是否相同?在這兩種情況下,您是否看過兩種情況下的讀數數量和指數佔用的大小? – 2015-04-03 13:27:36