2015-04-03 50 views
1

下面的鏈接解釋我的桌子的情況:物理與列存儲讀取更重要的是在堆

Why does the presence of primary key on the table significantly enhance the performance of column-store indexes?

當比較兩種情況,一是在查詢使用運行列存儲索引,另一個是查詢在簡單堆上運行的地方。當我比較這兩個結果時,我發現即使使用列存儲的查詢比其他情況下的查詢執行得更好,只需在堆上運行即可。 但是,使用列存儲索引的查詢涉及物理讀取(1),而原始讀取沒有。

這兩個查詢具有相同的執行計劃。另外,我在兩種情況下在熱和冷的緩衝區中運行查詢。在冷緩衝區中,原始查詢需要4次物理讀取,而在警告緩衝區中,則需要0次物理讀取。 但是,使用列存儲索引的查詢的行爲保持不變。這背後有什麼特別的原因嗎?

+0

請參閱[「應該在其標題中包含」標籤「嗎?」](http://meta.stackexchange.com/questions/ 19190/should-questions-include-tags-in-titles),其中共識是「不,他們不應該」! – 2015-04-03 18:26:26

+0

@AndreasNiedermair - 感謝您的編輯。我的錯,我錯過了。 – user2673722 2015-04-03 18:29:00

+0

不用擔心 - 沒問題:) – 2015-04-03 18:29:37

回答

1

SQL Server 2012中發生了很多變化,包括新的DMV,新的內存管理和COLUMNSTORE索引的添加。

問題:使用列存儲索引進行查詢會導致物理讀取(數據緩存未命中)。

假設:SQL Server 2012中,聚集列存儲索引

免責聲明:這不是一個答案,但試圖進一步討論。

列存儲(SQL Server 2012中的新增功能)高速緩存列存儲索引對象(壓縮),並且此內存與緩衝池分離。

SQLOS中的新任意頁分配器簡化了內存分配,取代了單頁8 KB和多頁分配器(對於> 8 KB請求)。

緩衝池和列存儲緩存均通過any-page分配器分配內存。但是,緩衝池緩存數據頁和列存儲緩存壓縮的列存儲索引對象。

數據高速緩存未命中的一種可能的解釋是從列存儲器內存分配的緩衝池上的內存壓力可能導致「頁面刷新」。

我使用本書作爲參考SQL Server 2012內部件。另外,這篇文章解釋了COLOMNSTORE索引如何在SQL Server 2012中使用內存: Clustered Columnstore Indexes – part 38 (「Memory Structures」)

+0

很好的回答!感謝您的解釋和文章。 – user2673722 2015-04-04 21:54:03

相關問題