在 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/