2

我不确定如何更好地表达这个问题,所以我可能错过了之前提出的问题。随意关闭它并指出正确的一个(如果存在)。

我有一个包含两个重要列的表(也就是说它有更多但只有两个与这个问题有关)。第一列是一个 GUID(一个 id),第二列是一个 nvarchar(存储一个 URL)。ID 和 URL 的组合必须是唯一的(因此可以重复相同的 guid,但每行具有不同的 URL,反之亦然,但不能有超过一行相同的 guid 和 URL)。

目前,在每次 INSERT 之前,我都会执行 SELECT 以查看是否存在具有相同 id 和 URL 的行。但是,看起来 nvarchar 上的查找速度很慢。因此,我想我会更新表以存储一个额外的列,该列在插入时用 URL 的哈希 (SHA1) 填充。现在我们只查找较小的哈希(varbinary?),我认为它会比以前快得多。

有没有办法让 SQL Server 2008 自动存储散列并针对该散列值而不是实际文本进行查找?我假设这些指标是 b 树,所以我要求的是 SQL Server 使用 nvarchar 字段中文本的哈希值创建 b 树,并且当运行选择时,它应该计算哈希并使用哈希值在树中查找。这可能吗?

4

3 回答 3

3

如果你对你的(id, url)字段进行查找 - 你对这两列有索引吗?如果没有 - 添加一个,看看这是否足以加快您的查找速度。

如果不是:是的,您绝对可以自动获得此功能 - 神奇的词是:计算列

在 SQL Server 中,您可以让列根据您提供的公式自动计算其值。这可以只是一个简单的算术公式,也可以调用存储函数来计算值。

为了使您的检查更快,您必须确保可以使该计算列持久化 - 然后您也可以对其进行索引。这不包括更大规模的计算——公式必须清晰、简洁和确定。

所以,这样做:

ALTER TABLE dbo.YourTable
  ADD HashValue AS CAST(HASHBYTES('SHA1', CAST(ID AS VARCHAR(36)) + Url) AS VARBINARY(20)) PERSISTED

现在您的表有一个新HashValue列(您可以随意命名),您可以选择该值并检查它。

接下来在该新列上放置一个索引

CREATE NONCLUSTERED INDEX IX_Hash_YourTable
  ON dbo.YourTable(HashValue)

现在你的查找应该是飞行的!

于 2010-10-21T05:08:05.443 回答
0

你能在表上为这两列设置一个唯一约束并在 try / catch 块内执行插入吗?

它将使您免于计算哈希的额外工作以及存储它的额外空间

于 2010-10-21T01:35:07.490 回答
0

您可以有一个触发器来计算插入和更新的哈希值,并在需要时将其放入。

在停止插入方面,只需在它们上添加一个唯一索引

于 2010-10-21T02:32:55.733 回答