2011-08-16 39 views
0

我正在處理一個數據庫,在我通過保存和檢索已知GUID添加記錄後,檢索我的記錄的ID。我的應用程序在SQL Server和Oracle上運行,所以我不能使用@@ IDENTITY *。用於更新表的GUID列 - 是否應該編入索引?

說,例如,我添加了一個新的地址:

ID (identity column in SQL Server;sequenced/trigger column in Oracle) 
... address data... (street, town, postcode, etc.) 
GUID 

我得到的ID後面通過執行以下操作:

1. INSERT INTO ADDRESS (... address details, GUID = {some new GUID value}) 
2. SELECT ID FROM ADDRESS WHERE GUID = {my GUID value} 
3. UPDATE ADDRESS SET GUID = NULL WHERE GUID = {my GUID value} 

在第1部分,我添加的詳細地址和在數據庫中設置GUID值;在第2部分中,我得到了自己的ID,在第3部分中,我從數據庫中刪除了GUID值(以避免極少發生重複GUID的事件)。

當我看到第三位的SQL Server 2008的估計的執行計劃,它顯示了以下路徑,如果我對GUID列上沒有索引:

Image shows the estimated execution plan where there's no index on the GUID column

,如果我下面的路徑對GUID列的索引:

Image shows the estimated execution plan where there's an index on the GUID column

我的問題是:我認識到,第一個圖像顯示的掃描是不如的第二圖像中顯示查找,但如果GUID列基本上是空的,那麼99.999%的時間意味着我不應該對該字段進行索引,因爲它始終是分段的並會浪費資源?或者索引仍然有幫助,因爲它可以很容易地向我顯示我剛剛添加的唯一GUID的位置,而不必對其進行全面掃描。

總結:鑑於GUID被添加並立即刪除的事實,是否有索引GUID列的任何一點?

*事實上,設計不是我自己的,所以我無法使用不同的方法;但是,您應該看到我的特定數據庫的設計不會影響我的整體問題。

+0

在SQL中,您可以使用NEWID來選擇一個新的不同的GUID。 NEWID和索引有問題,因爲NEWID是隨機的,所以它可以出現在索引的二叉樹的任何位置。 http://msdn.microsoft.com/en-us/library/ms190348.aspx – David

+0

什麼是你使用這種技術接收身份列值?在MS SQL中,我也相信Oracle有更方便快捷的方式來獲取ID。使用存儲過程添加不同的技術用於Oracle和MS SQL – elevener

回答

2

是的,你絕對需要索引你的專欄。使用SQL Server中的過濾指數(不知道什麼是Oracle當量):

create index AddressGuid on ADDRESS(GUID) where GUID is not NULL; 

但有一個更好的方法:使用輸出/回INSERT的條款。 SQL ServerOracle都支持它(每個都有自己的風格),並且不再需要GUID解決方法。

+0

太好了,謝謝你的快速回復!我一定會檢查輸出/返回子句;我確實有一定的影響力,所以也許這就是我們未來可以採取的方向。 – LordScree

+0

嗨Ramus,在進一步閱讀之後,似乎Oracle中的RETURNING INTO子句僅受Oracle 10g及以上版本支持,這就是爲什麼我們不能使用它= =(不管怎樣,儘管如此;絕對要考慮什麼時候我們的最後一點客戶從Oracle 9i遷移 – LordScree

+0

實際上,在對Oracle 9i數據庫進行一些自己的研究之後,RETURNING INTO正常工作......現在我非常困惑,哈哈! – LordScree

0

如果您不索引該列,那麼每個SELECTUPDATE語句將不得不掃描整個表以查找您的行。如果這不是你想要的,你必須索引。儘管如此,我不打擾將GUID列設置爲NULL。

+0

感謝Gabe。有趣的是,我與我的技術主管討論了爲什麼我們在發佈我的問題前將GUID列設置爲null。我得說,我對此表示同意,但希望我們會最終轉向使用Remus的輸出/返回建議。 – LordScree

相關問題