【发布时间】:2012-02-27 08:54:05
【问题描述】:
我正在制作自己的爬虫。现在我的问题是关于索引的。
我有 2 列是关于索引的。
一个是pageurl,另一个是hashcode 列。
pageurl 列是 VARCHAR 和 hashcode 列是 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。
【问题讨论】:
-
如果你因为多线程而得到重复的行,这是否表明你的多个线程都在做同样的工作,这相当浪费精力?你的设置不清楚。例如,散列码是显示的页面的散列,还是 URL 的散列?如果您不想在表格中重复 URL 和哈希的组合,请创建一个索引以防止这种情况发生 - 哈希和 URL 的唯一索引。
-
想象一下有 10 个进程一直在爬取页面。他们都从页面中找到数百个网址。所以他们中的大多数都是一样的。显然 sql server 延迟导致我的软件控制该 url 是否存在失败。所以我必须制作 sql server 以防止多次添加相同的 url。
-
另外,标识列不一定是主键。如果您愿意(如果唯一),可以使用 URL 作为主键。
-
它会导致 CPU 使用率过高。因此,我使用的是 64 位散列。我试过了。
标签: sql sql-server indexing duplicates unique