2017-08-30 119 views
1

我要執行的下一個刪除查詢:一列索引對2列索引

delete from MyTable where userId = 5 

什麼下面索引會對這個查詢更好的性能,或者將它們都執行相同的?

所有在這裏提到的字段是BigInt有

  1. CREATE INDEX MyTable_UserId_UserBalance_index ON Main.dbo.MyTable (UserId, UserBalance);
  2. CREATE INDEX MyTable_UserId_index ON Main.dbo.MyTable (UserId);
+0

更好地問上dba.stackexchange.com,也許? – GrandMasterFlush

+0

第一個索引具有較大的條目,每個頁面的條目數會更少,並且可能需要更多的讀取次數。更重要的是系統的整體性能。如果您在索引中嘗試優化每個單獨的查詢,那麼您將影響必須更新所有這些索引的查詢。參見[過早優化](http://xkcd.com/1691/)。 – HABO

+0

@GrandMasterFlush這是其中一個重疊這兩個堆棧論壇 – Eli

回答

2

對於他們應該執行大致相同的特定查詢。由於您正在查找複合索引中的第一項,因此查找記錄應該與單列上有另一個索引相同。

0
CREATE INDEX MyTable_UserId_index ON Main.dbo.MyTable (UserId); 
+2

的區域之一請提供解釋爲什麼你認爲它會更好地執行 –

+0

如果UserId每行不是唯一的,那麼可能有多個索引項要搜索。如果它是唯一的,那麼在(UserId)處將只有一個索引條目進行搜索,但如果有多個餘額可用,則使用(UserId,UserBalance)可能會使條目發生多重化。但即使是唯一的,(UserId,UserBalance)索引每個條目的尺寸也會更大,因此需要更多時間來刪除(並插入)更多的磁盤I/O。 –

+0

Plus更新(實際上是刪除+插入),如果餘額發生變化,則需要更改2字段索引。更多磁盤I/O。如果UserBalance不是索引的一部分,所有這些都不會發生。 –

0

這兩個指數都會以相同的方式工作,除非訂單在下面的指數中被顛倒。

來自:

CREATE INDEX MyTable_UserId_UserBalance_index ON Main.dbo.MyTable (UserId, UserBalance); 

到:

CREATE INDEX MyTable_UserId_UserBalance_index ON Main.dbo.MyTable (UserBalance, UserId); 

在第二種情況下,服務器可能看不到這個指數作爲可用作用戶ID是在第二級。

另外,爲什麼你會創建兩個索引在同一列呢?如果你知道你的表將經常與UserId和UserBalance一起被查詢,那麼最好的做法是創建一個包含兩列的索引。

再次,只要確定哪一列得到最多利用。

1

我很驚訝在許多問題的答案在這裏 - 爲刪除的目的,也不會有使用任何利益或者這些指標比其他的一個。因爲如果記錄存在於任一索引中,則需要找到它並將其刪除。

索引的用途是讀取,而不是刪除數據。如果你想讀取數據,你會問這樣一個問題,因爲一個索引有可能比另一個更快地返回數據。對於刪除,您需要從刪除所有索引,包括NC索引。

看起來好像是對索引世界的一些啓示正在被呼籲。

知名DBA一些偉大的(免費)的文件 - 布倫特奧扎爾:https://www.brentozar.com/archive/2016/10/think-like-engine-class-now-free-open-source/

+0

此外,這種形式的所有問題的答案是:測試。 –

+0

@ DavidBrowne-您打賭的微軟!並沒有看到執行計劃,從而知道引擎是什麼領域的問題等等,幾乎沒有人可以回答 - 因爲這將是一個在黑暗中拍攝 – Eli