我必须为此创建唯一索引吗?

时间:2012-02-05 16:06:32

标签: sql sql-server indexing duplicates unique

我正在制作自己的抓取工具。现在我的问题是关于索引。

我有2列关于索引。

一个是pageurl,另一个是hashcode列。

pageurl列为VARCHARhashcode列为64位int

这是我正在执行的主要查询:

SELECT PageId FROM tblPages WHERE HashCode=biginthashcode AND PageUrl='pageurl'

PageId是身份主键。

现在我用它作为索引:

CREATE nonclustered INDEX indexHashCode ON tblpages (hashcode)
INCLUDE (pageurl,pageid)

但是由于软件的多线程特性,上面的索引会导致重复行太多。可能是由SQL延迟引起的。

所以我必须要像下面那样

CREATE UNIQUE nonclustered INDEX indexHashCode ON tblpages (hashcode,pageurl)
INCLUDE (pageid)

或以某种方式使它不添加重复值。哪些是重复值?

重复值意味着hashcode和pageurl都相同。如果不使用我的第一个索引创建像上面这样的唯一索引,这是可能的吗?

我正在使用Microsoft SQL Server 2008。

2 个答案:

答案 0 :(得分:3)

正如Jonathan Leffler的评论指出的那样,你可能在这个过程中试图解决这个问题。为什么你的多线程代码首先会产生重复?

也就是说,如果重复行创建是不可避免的,那么使用唯一索引可能是合理的。您仍然希望在插入行之前检查行是否存在,但通常会使用存储过程。无论哪种方式,包含检查和插入的事务都应该防止重复。

最后,对于它的价值,哈希码通常不存储在数据库中。它们不是唯一的,因此两个URL可能具有相同的哈希码。

答案 1 :(得分:2)

看起来你只想更新if(hashcode,pageurl)已经存在。在这种情况下,请查看here以获取选项。

如果您不想更新,但您只是不想插入新值,那么您还有很多选项(查询并检查它是否存在,或者从给定链接修改解决方案......或其他内容),但很可能你在线程中做了一些不好的事情,因为许多线程正在做同样的工作,并且对于所有线程(除了一个),你只会丢弃结果。