2015-11-06 198 views
-4

我有一個巨大的表(在Oracle 12c中),當然這需要索引。 這張表也經常更新,所以如果我學到的東西是正確的,那麼我在這個表上的索引越少,表示DML操作的性能就越好。索引,索引,索引

當然,我想擁有正確數量的索引,以便對它的查詢不受影響。

我把這個小例子作爲一種創建索引的指南。這看起來準確嗎?

CREATE INDEX FOO ON FOO.BAR ("COL1", "COL2", "COL3"); -- COL1 should be the column which is most frequently queried 

SELECT * FROM FOO WHERE COL1 = 'FOO'; -- uses index FOO 

SELECT * FROM FOO WHERE COL1 = 'FOO' AND COL2 = 'BAR'; -- uses index FOO 

SELECT * FROM FOO WHERE COL1 = 'FOO' AND COL2 = 'BAR' AND COL3 = 'BAZ' -- uses index FOO 

所以就沒有必要在col1或COL2單個索引..如果COL3由本身查詢

(其中,COL3 =「等等」)

我需要一個col3上的索引。

如果COL2和COL3是一起查詢

(其中COL2 = '嗒嗒' 和COL3 = 'blahblah')

然後我需要col2上,COL3指數...但如果我有一個查詢在哪裏col2和col3一起使用比我不需要在任何一個單一的索引。 這一切聽起來如何?

+0

「巨​​大的桌子」是一個術語,對不同的人意味着不同的事物。告訴我們您有多少行,多少列,您的操作系統,分配了多少內存,您注意到了哪些性能問題,這是一個新表格或現有表格,生產數據庫還是測試? – kevinsky

+0

我有一個200GB的表,其中200GB的索引每秒更新〜170次...上下文就是一切,你應該做你所需要的。 – Ben

+0

該表格的大小爲5 GiB,並將增長...它有24列...我意識到事情通常是針對具體情況而定的,但我只是在尋找一些一般的見解。 OS是SuSE,內存爲4 GiB。測試數據庫所以會有更多的資源來生產... – benjamin

回答

1

你的理解是正確的。如果在where子句中包含索引的前導列,「正常」btree組合索引通常僅用於加快查詢速度。

因此,如果您在c1,c2和c3上有一個索引,併發出只在c2上過濾的查詢,則索引可能無用。我之所以說可能是因爲有些情況下Oracle可以使用該索引。一個是它可以進行跳躍掃描的地方(但是在使用類似的東西的時候,我沒有很好的表現)。另一種情況是,如果表中的行數很大會使表變大,但c1,c2和c3列的值很小,那麼索引的大小可能會比表的大小小得多,Oracle可以使用索引(通過快速全面掃描)來回答查詢。

如果您經常需要用c1或者c2或者c3查詢,那麼您可能需要3個索引。一如既往,這取決於您的數據和要求,最重要的是什麼。