【问题标题】:SQL Server: The total size of an index or primary key cannot exceed 900 bytesSQL Server:索引或主键的总大小不能超过 900 字节
【发布时间】:2011-10-19 07:49:30
【问题描述】:

我正在尝试将索引放在将包含 URL 的列上。由于 URL 的最大长度超过 2000 个字符,因此我将数据类型设置为 NVARCHAR(3000)。当我这样做时,我得到了错误The total size of an index or primary key cannot exceed 900 bytes。由于我可能需要按 URL 搜索记录,因此我需要在我的 URL 列上建立一个索引。有没有办法绕过这个限制?

【问题讨论】:

  • 这对我来说真的不是很有效。事实上,这听起来像是数据库引擎管理的一场彻头彻尾的噩梦。您是否确定您确实需要按 URL 搜索,并且此搜索会很慢?你知道,文本搜索可以很快。您还可以将 URL 分解为位,仅索引其中一个位(变化最大的位),然后将索引部分与整个 url 相关联。总之,这里有很多可能的策略。

标签: sql-server-2008


【解决方案1】:

您可以为 URL 的校验和创建一个计算列,然后在查询中使用校验和。校验和不会是唯一的,但它会迅速缩小可能匹配的数量。

首先,向表中添加一个计算列,如下所示:

Alter Table YourTableName Add URL_HASH As CheckSum(URL)

现在像这样索引列:

Create Index idx_YourTableName_URL_HASH On YourTableName(URL_HASH)

现在您可以编写一个查询,该查询将执行索引搜索以找到您要查找的行:

Select URL
From   YourTableName
Where  URL_HASH = CheckSum(N'google.com')
       And URL = 'google.com'

这种方法应该非常适合精确匹配。如果您想要部分匹配,最好使用全文搜索功能。

【讨论】:

  • 感谢我们决定实施。
  • 嗨 G Mastros。感谢您的回答。我有包含大量数据的 Varbinary 列。此列可以为空,我有查询查找此列不为空的记录。在这种情况下,您的校验和方法似乎也非常有用。我检查了可空列的校验和是 2147483647。虽然它可能有效,但在查询中硬编码这个数字似乎很奇怪。当我们迁移到其他版本的 SqlServer 时,这个数字会不会一样?在 C# 中使用 GetHashCode 方法时,我确实在脚上开了一枪,最终它返回不同的值,具体取决于操作系统。
  • 我不太确定。但是,您可以使用“checksum(Convert(varbinary, null))”来代替对数字进行硬编码。然后,如果值随 db 版本而变化,您仍然会受到保护。
【解决方案2】:

SQL Server 全文搜索可能是您想要的。

http://msdn.microsoft.com/en-us/library/ms142571.aspx

在设置它而不是简单的索引时,您必须跳过一些小麻烦,但这应该不会太难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2017-06-29
    • 2011-04-20
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多