Sql server 计算SQL Server数据库中字符串的哈希值-值得付出努力吗?

Sql server 计算SQL Server数据库中字符串的哈希值-值得付出努力吗?,sql-server,database,performance,hash,Sql Server,Database,Performance,Hash,假设我的SQL Server 2005数据库中有一个百万行表[mytable],其中有列: 身份证 某地 另一个领域 网址 本系统中一个非常常见的查询是: 从[mytable]中选择*其中url='' 哪一个会给我带来更好的性能: a) 向Url列添加索引 或 b) 添加一个额外的“url\U哈希”列,该列包含与url对应的数字哈希,然后计算该哈希以在my where子句中使用,例如: 从[mytable]中选择*,其中url_hash=一些计算出的哈希,url='' (b)值得额外的复杂性

假设我的SQL Server 2005数据库中有一个百万行表[mytable],其中有列:

  • 身份证
  • 某地
  • 另一个领域
  • 网址
本系统中一个非常常见的查询是:

从[mytable]中选择*其中url=''

哪一个会给我带来更好的性能:

a) 向Url列添加索引

b) 添加一个额外的“url\U哈希”列,该列包含与url对应的数字哈希,然后计算该哈希以在my where子句中使用,例如:

从[mytable]中选择*,其中url_hash=一些计算出的哈希,url=''

(b)值得额外的复杂性吗?我需要在insert和select上计算哈希值

更新03-30-2009

ID是主键

此外,上面的查询不应该有“*”。相反,选择列表应该是表中的所有字段

“*”只是一个简写,很抱歉给你带来了困惑

更新03-31-2009


此外,忘了提及,url_散列字段上会有一个索引。

如果您只选择所需的列(与“*”相反),并且您在“url”和所选列上创建一个覆盖非聚集索引,您将获得非常高效的查找。

即使您为URL计算哈希代码,除非为哈希代码列添加索引,否则您也不会获得非常好的性能,因此最好只在URL列上添加索引。

简单地说,字符串越长,两个字符串越相似,比较它们所需的时间越长(考虑一个1000个字符长的字符串,其中唯一的差异是最后一个字符,您可以看到例程发现差异所需的时间)

但是,让我们对比一下比较长字符串的成本和在磁盘上定位它们的成本

索引存储在B+树中,B+树是具有可变节点数的平衡树,每个节点彼此链接(a->B->c)。这为我们提供了两种功能:通过遍历树快速查找,然后以树顺序快速访问其他节点(一旦找到“a”,很容易找到“b”,然后找到“c”,等等)

索引以磁盘页的形式排列,通常,索引页中可以填充的节点越多,索引B+树的总体高度就越低。树的高度越低,找到特定行的速度就越快,因为通常会遍历树的高度(因为它是平衡的)以到达任何一个叶节点

高度越低,磁盘点击次数就越少。若你们有一个4高的树,那个么到达任意一个随机节点需要在RAM中加载4个索引页,也就是4个磁盘点击。因此,一棵4高的树的效率是一棵8高的树的两倍

此外,在索引页中输入的内容越多,如果开始沿着节点进行迭代,所需的点击次数就越少。如果您的节点拥有10个键值,加载100行将花费您10次索引页点击,而如果每个节点只拥有5次,您将获得索引磁盘点击的两倍

请注意,根据需要向树添加新层的记录数,可以获得几何级数。(即,5键节点和10键节点之间的差异不是记录的两倍。)

所以,这就是索引树中有很多扇形键的值

记住,使用散列,您仍然必须执行“where hash=and url=”…”

但老实说,这实际上取决于您的数据访问模式。数据库有多忙,进行什么样的查询,缓存索引页需要多少RAM,等等

用来定位初始行的索引可能甚至不在查询时间的雷达上


关键在于记录的数量并不重要,但索引树的扇出却很重要。例如,如果您有一个1K索引节点和一个4字节索引(long int),那么每个索引可以有250个节点(这里非常简单),而一个3层树可以在一个3深的树中获得16M行——3个磁盘命中中的16M行中的任意一行。

这是在描述实际应用程序中使用实际表时遇到的实际问题吗,或者你正在寻找一个你不知道是否需要的优化


如果不是#1,那么我建议您为url编制索引,并处理应用程序的其余部分,直到出现问题为止(这不太可能)。

因此,您似乎在说So有一个合理的问题,因为他们的关键字字段很长,所以应该花时间研究此策略,因为它可能会缩短查询时间?换句话说,你是在鼓励这种设计吗?我只是指出他的决定的后果。我认为他应该尝试两种方法,看看一种方法是否比另一种方法更有效,从而获得更多的数据。和其他所有东西一样,“视情况而定”。这可能需要半个小时来构建和测试。