sql-server - SQL Server 2005 中的索引 URL

标签 sql-server performance

在 SQL Server 2005 中处理 URL 存储和索引的最佳方法是什么?

我有一个 WebPage 表,用于存储有关网页的元数据和内容。我还有许多与 WebPage 表相关的其他表。它们都使用 URL 作为键。

问题是 URL 可能非常大,使用它们作为键会使索引变得更大和更慢。多少我不知道,但我读过很多次使用大字段进行索引是要避免的。假设 URL 是 nvarchar(400),它们是用作主键的巨大字段。

有哪些选择?

使用 URL 作为键而不是较小的字段可能会带来多大的痛苦。

我查看了具有标识列的网页表,然后将其用作网页的主键。这使所有关联的索引更小、更高效,但它使导入数据有点痛苦。关联表的每次导入都必须先查找 url 的 id,然后再将数据插入表中。

我也试过在 URL 上使用散列来创建较小的索引,但我仍然不确定这是否是最好的做事方式。它不会是唯一索引,并且会受到少量冲突的影响。所以我不确定在这种情况下会使用什么外键...

数据库中将存储数百万条关于网页的记录,并且会有大量的批量更新。此外,还会有大量读取和汇总数据的事件。

有什么想法吗?

最佳答案

我会使用普通标识列作为主键。你说:

This keeps all the associated indexes smaller and more efficient but it makes importing data a bit of a pain. Each import for the associated tables has to first lookup what the id of a url is before inserting data in the tables.

是的,但这种痛苦可能是值得的,您在此过程中学到的技术对 future 的项目来说将是无价的。

在 SQL Server 2005 上,您可以创建一个用户定义的函数 GetUrlId,类似于

CREATE FUNCTION GetUrlId (@Url nvarchar(400)) 
RETURNS int
AS BEGIN
  DECLARE @UrlId int
  SELECT @UrlId = Id FROM Url WHERE Url = @Url
  RETURN @UrlId
END

这将为您的 URL 表中已有的 url 返回 ID,并为任何尚未记录的 URL 返回 NULL。然后您可以调用此函数内联您的导入语句 - 类似于

INSERT INTO 
  UrlHistory(UrlId, Visited, RemoteIp) 
VALUES 
  (dbo.GetUrlId('http://www.stackoverflow.com/'), @Visited, @RemoteIp)

这可能比正确的连接语句慢,但对于一次性或偶尔的导入例程,它可能会使事情变得更容易。

关于sql-server - SQL Server 2005 中的索引 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/172176/

相关文章:

sql-server - 我可以在没有游标的 SQL 函数中执行此操作吗?

c - 测量我的 C 程序循环次数的最可靠方法是什么?

c# - 处理此字符串的效率更高

python - SQLAlchemy ORM 是大型数据的正确选择吗?

sql-server - 针对全文索引的混合查询

sql - 执行计划引用溢出级别 1

sql-server - 编写用户到特定数据库的脚本?

java - 最有效地合并 2 个文本文件。

java - 静态上下文警告

sql-server - SQL Server 中的 ALL 与 ANY 评估