2011-10-12 87 views
24

我不是db傢伙。但我需要創建表格並對它們執行CRUD操作。如果我在默認情況下在所有列上創建索引 ,我是否會感到困惑?這是我在創建索引時考慮的理解。決定何時在數據庫的表列創建索引?

索引基本上包含內存位置範圍(第一個值存儲到結束內存位置的起始內存位置,最後一個值爲 )。所以當我們在表索引中插入任何值時,需要更新列,因爲它有更多值,但更新列 值不會對索引值產生任何影響。 對不對?因此,底線是當我的列用於兩個表之間的連接時,我們應該考慮 在連接中使用的列上創建索引,但所有其他列可以跳過,因爲如果我們在它們上創建索引,則會涉及額外成本 更新索引值在列中插入新值時。 對不對?

考慮這種情況,其中表mytable包含兩列三列,即col1col2,col3。現在我們啓動此查詢

select col1,col2 from mytable 

現在有兩種情況。在第一種情況下,我們在col1col2上創建索引。在第二種情況下,我們不創建任何索引**根據我的理解, 情況1將比情況2更快,因爲在情況1中,oracle可以快速找到列存儲器位置。所以在這裏我沒有使用任何連接列,但 仍然索引在這裏幫助。所以,我應該考慮在這裏或不創建索引?**

如果在相同的情況下上述,如果我們火

select * from mytable 

代替

select col1,col2 from mytable 

將索引幫助這裏是什麼?

+8

索引對SELECT子句中的值不做任何操作。重要的是ON子句或WHERE子句中的字段列表。 – Bill

+0

@ Bill - Oracle是否可以使用覆蓋索引?我是一個SQL Server的人,我知道Oracle處理索引有點不同,但我認爲在某些情況下它仍然使用覆蓋索引。 –

+0

@Tom:呵呵。每天學些新東西。我也是一個MSSQL的傢伙,並不知道這一點。儘管如此,覆蓋索引似乎只有在你處理大量R而不是CUD時纔有用。 – Bill

回答

12

但更新列值不會對索引值產生任何影響。對?

否。更新索引列會產生影響。該的Oracle 11g performance manual指出:

該修改索引列和插入和刪除 語句修改索引的表需要比如果有 沒有索引不再

UPDATE語句。這些SQL語句必須修改 表中的索引和數據中的數據。他們還創建了額外的撤消和重做。


那麼底線是在我的專欄是用來在兩個表之間的連接,我們應該考慮建立用於連接的列索引,而是因爲如果我們在其上創建索引的所有其他列可以忽略它將涉及在列中插入新值時更新索引值的額外成本。對?

不只是插入,而是任何其他數據操作語言語句。

請考慮這種情況。 。 。索引會在這裏幫助嗎?

關於這最後一段,爲什麼不建立一些具有代表性數據量的測試用例,以便證明或反駁關於應該索引哪些列的假設?

25

不要在每一列中創建索引!它會降低插入/刪除/更新操作的速度。

作爲一個簡單的提醒,您可以在WHEREORDER BYGROUP BY子句中通用的列中創建索引。您可以考慮在用於涉及其他表colums添加索引(通過JOIN,例如)

例子:

SELECT col1,col2,col3 FROM my_table WHERE col2=1 

這裏,創建於col2上的索引,將有助於這個查詢了很多。

另外,考慮指數選擇性。簡單地說,創建具有「大領域」的值的索引,即ID,名稱等。不要在男性/女性專欄上創建它們。

1

我希望甲骨文可直接得到單排的所有領域,而不需要額外的指標(這確實不是爲此而設計)。

此外,索引會佔用大量的磁盤空間和內存以及cpu使用量。

感謝這篇文章,我瞭解了涵蓋索引(酷!),但從我的理解,它允許快速獲得其他字段一旦通過索引找到該行。這並不意味着你已經把索引放在所有列上了!只是在PK上,或者你在其中創造條件的領域。

我在這最後一點嗎?

(如果你火了SELECT *,因爲對我來說這是完全一樣的,數據的,將經過網絡的量是安全的。)

2

在你給特定的情況下,有沒有WHERE子句,因此將使用表掃描或使用索引掃描,但只刪除一列,所以性能可能沒有那麼大。在第二種情況下,不應該使用索引,因爲它沒有覆蓋,也沒有WHERE子句。如果存在WHERE子句,則索引可以允許篩選減少需要查找以獲取缺失列的行數。

Oracle有許多不同的表,包括堆或索引組織的表。

如果索引覆蓋,則更有可能被使用,特別是在選擇性時。但是請注意,當WHERE子句中存在約束且覆蓋索引中的列數少於基表中的索引時,組織好的表並不比堆中的覆蓋索引更好。

創建比實際使用的列多的索引僅有助於更有可能使索引覆蓋,但添加所有列與索引組織表類似。請注意,Oracle沒有等同於SQL Server的INCLUDE(COLUMN),它可用於使索引更加覆蓋(它實際上僅爲列的一個子集創建了額外的聚集索引 - 如果您希望某個索引是唯一的,還添加了一些你不希望被認爲是唯一性的數據,但有助於使它涵蓋更多的查詢)

你需要看看你的計劃,然後確定索引是否會有所幫助。然後看看計劃,看看他們是否有所作爲。

相關問題