我正在开发一个数据库,在我通过保存和检索已知的GUID添加它之后检索我的记录的ID。我的应用程序在SQL Server和Oracle上运行,所以我不能使用@@ IDENTITY *。
比如说,我添加一个新地址:
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列上没有索引,它会显示以下路径:
以及以下路径,如果我在GUID列上有索引:
我的问题是:我意识到第一张图片中显示的扫描不如第二张图片中显示的搜索效果好,但是GUID列基本上是空的这一事实99.999%的时间意味着我不应该这样做不要将该字段编入索引,因为它会一直分散,会浪费资源吗?或者索引是否仍然有用,因为它可以很容易地向我显示我刚才添加的唯一GUID,而不是必须对其进行整体扫描?
总结:鉴于GUID已添加然后立即删除,GUID列的索引是否有任何意义?
*实际上,设计不是我自己的,所以我无法使用不同的方法;但是,您应该看到我的特定数据库的设计不会影响我的整体问题。
答案 0 :(得分:2)
是的,您绝对需要为您的列做索引。在SQL Server中使用过滤索引(不确定Oracle等价物是什么):
create index AddressGuid on ADDRESS(GUID) where GUID is not NULL;
但是有更好的方法:使用INSERT的OUTPUT / RETURNING子句。 SQL Server和Oracle都支持它(每个都有自己的风格),您不再需要GUID解决方法。
答案 1 :(得分:0)
如果您没有为该列编制索引,则每个SELECT
和UPDATE
语句都必须扫描整个表以查找您的行。如果这不是你想要的,你将不得不索引。不过,我不打算将GUID
列设置为NULL。