【问题标题】:Sql Server - Index on nvarchar fieldSql Server - nvarchar 字段上的索引
【发布时间】:2014-03-04 15:57:49
【问题描述】:

保持nvarchar 字段唯一性的好方法是什么。我有一个存储 MP3 文件 URL 的字段。 URL 长度可以是 10 个字符到 4000 个字符之间的任何值。我尝试创建一个索引,它说它无法创建索引,因为总长度超过了 900 个字节。

如果该字段未编入索引,则搜索任何内容都会很慢。我在前端使用 C#、ASP.net MVC。

【问题讨论】:

  • 在数据库中可能不容易解决,因为 URL 的 部分可以区分大小写,而其他部分不区分大小写。跨度>

标签: sql sql-server nvarchar


【解决方案1】:

您可以使用 CHECKSUM 命令并将索引放在带有校验和的列上。

--*** Add extra column to your table that will hold checksum
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO

--*** Create index on new column
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO

然后您可以使用以下查询快速检索数据:

SELECT * 
FROM Production.Product
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
AND Name = N'Bearing Ball';

这是文档:http://technet.microsoft.com/en-us/library/ms189788.aspx

【讨论】:

  • 文档中的以下行不是问题吗? CHECKSUM () does not guarantee unique results.
  • @Bertvan 这就是为什么检查校验和是不够的,人们仍然需要查看感兴趣的字段以进行精确匹配。校验和只是有助于缩小行选择范围,因此只有校验和冲突的行需要检查是否完全匹配。
【解决方案2】:

您可以使用散列函数(虽然理论上它不能保证两个不同的标题会有不同的散列,但应该足够好:MD5 Collisions)然后在该列上应用索引。

MD5 in SQL Server

【讨论】:

    【解决方案3】:

    您可以创建 url 的哈希码并将此整数用作数据库上的唯一索引。请注意先将所有字符转换为小写,以确保所有 url 格式相同。相同的 url 将生成相同的哈希码。

    【讨论】:

    • 呃,URI 是区分大小写的……
    • @binki 不是真的.. 这取决于后备服务器。 RFC 声明“..当比较两个 URI 以决定它们是否匹配时,客户端应该对整个 URI 使用区分大小写的八位字节比较”,但应该只是一个建议,因此 IIS 不区分大小写,阿帕奇确实如此。看到这个线程:stackoverflow.com/questions/15641694/are-uris-case-insensitive
    • 那么您就不能移植到具有区分大小写文件系统或支持区分大小写文件服务器上的远程存储的操作系统。 RFC 推荐一些东西是有原因的……如果 MP3 存储在 imgur 或 YouTube 之类的服务上,其中密钥是区分大小写的 base64 哈希,该怎么办?
    • @binki 我不是说你不对,但这与实际问题无关,只要此哈希用于私有实现和索引,而不是暴露在其他地方。
    猜你喜欢
    • 2011-11-28
    • 2018-05-22
    • 2017-09-22
    • 1970-01-01
    • 2011-12-03
    • 2015-06-13
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多