2012-08-30 34 views
0

假設我有一個列有重複的表格,例如:大桌子上的不同表現

Column1 
--------- 
    a 
    a 
    a 
    a 
    b 
    a 
    c 
    d 
    e 
    ... so on 

也許它有成千上萬的行。然後說,我需要從這個列中提取不同的值。我可以在SELECTDISTINCT之間輕鬆完成,但是我想知道性能嗎?

我也可以給Column1中的每個項目一個id,然後創建一個由Column1引用的新表(以更適當地規範化)。儘管如此,這增加了插入的複雜性,並且爲其他可能的查詢添加了joins

有什麼方法可以索引列中的不同值,還是標準化的唯一方法嗎?

回答

1

column1上的索引將顯着加快處理的截然不同,但如果您願意在插入/更新/刪除期間交易一些空間和一些(短)時間,則可以使用materialized view。這是索引視圖,您可以將其視爲按照視圖定義生成和維護的動態表。

create view view1 
with schemabinding 
as 
    select column1, 
      count_big(*) cnt 
    from theTable 
    group by column1 
-- create unique clustered index ix_view1 on view1(column1) 

(不要忘了要執行評論create index命令。我通常做這種方式使視圖定義包含索引定義,提醒我,如果我需要更改視圖應用它。)

當你想使用它時,一定要添加noexpand hint以強制使用物化數據(這部分對我來說仍然很難受 - 這是因爲性能增強沒有默認打開,而是現場激活)。

select * 
    from view1 (noexpand) 
+0

這很好,謝謝你的建議。 – user17753

+0

不客氣:-) –