2012-08-17 50 views
1

我有一個表(可能會增長很多,幾百萬行),我經常在其上執行查詢SELECT * from table WHERE somefield = 20,我希望這個查詢能夠快速運行。在任何時候,我希望這個查詢返回最多10行,可能的數百萬,對於這個特定的值20(沒有任何其他值的保證)。什麼是適當的方式來索引這個?僅僅在某個領域放置索引就足夠了,並且確保統計數據大致是最新的?或者,那麼我可以嘗試優化這個技巧嗎?針對特定查詢優化的索引

+0

我已投票將此舉移至dba.stackexchange.com – cjk 2012-08-17 08:23:31

+0

合理移動該聲音 – Martijn 2012-08-17 12:04:31

回答

1

此查詢在隔離理想的索引將與鍵列somefield索引,並且包括在表中的所有其他列的列(或者通過使聚簇索引或與INCLUDE選項的NCI)。

這將允許直接查找值並避免需要書籤查找。

但是一個NCI的與所有那些包含的列會影響數據修改操作的維護開銷,你可能更喜歡CI在不同的鍵列定義爲因此,對於這個原因,你受益的其他查詢或避免碎片反正

可能更願意單獨在somefield上定義NCI並與10個書籤查找一起生活。這是一個平衡的行爲。

編輯。其實如果你是只有有興趣在優化查詢,其中somefield = 20那麼你可以創建一個filtered index該值。那麼我可能會在該索引定義中使用include所有列。

+0

已過濾索引,這看起來正是我一直在尋找的內容 – Martijn 2012-08-17 12:03:23

1

只需在某個字段上放置索引並確保統計信息大致是最新的就足夠了嗎?

是的,很簡單。確保某個字段是正確的類型(即。int)。如果某個字段需要包含文本,則可以執行更多操作,但否則,正常索引將會很好。

你可以得到小幅增加(我的意思是)如果您並不需要通過不使用SELECT *(你不需要somefield,據推測,因爲你已經知道它是什麼)返回的每一個領域。

0

是的,你會想在某些領域添加索引。

如果您沒有進行其他查詢,那麼您可能希望將其作爲聚集索引,但如果沒有上下文,很難說得出確切結論。