首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法让SQL Server自动对nvarchar字段的哈希值进行选择?

问有没有办法让SQL Server自动对nvarchar字段的哈希值进行选择?
EN

Stack Overflow用户
提问于 2010-10-21 09:15:16
回答 3查看 450关注 0票数 2

我不确定如何更好地表达这个问题,所以我可能遗漏了之前提出的一个问题。请随时关闭此链接,如果存在,请告诉我正确的链接。

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-21 13:08:05

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

如果不是这样:是的,你绝对可以自动获得这个功能--这个神奇的词是:computed column。

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

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

因此,执行以下操作:

代码语言:javascript
复制
ALTER TABLE dbo.YourTable
  ADD HashValue AS CAST(HASHBYTES('SHA1', CAST(ID AS VARCHAR(36)) + Url) AS VARBINARY(20)) PERSISTED

现在,您的表有了一个新的HashValue列(您喜欢怎么叫它都行),您可以选择该值并检查它。

接下来,在该新列上建立索引

代码语言:javascript
复制
CREATE NONCLUSTERED INDEX IX_Hash_YourTable
  ON dbo.YourTable(HashValue)

现在你的查找应该会飞起来了!

票数 3
EN

Stack Overflow用户

发布于 2010-10-21 09:35:07

您是否可以在表上为这两列设置一个唯一约束,并在try / catch块中执行插入操作?

它将节省计算散列的额外工作和存储散列的额外空间

票数 0
EN

Stack Overflow用户

发布于 2010-10-21 10:32:56

您可以使用触发器来计算insert和update时的散列,并在需要时将其放入。

就停止插入而言,只需在其上添加唯一索引

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3983580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档