高效的键/值表

时间:2012-04-27 16:29:21

标签: sql-server-2008 sql-server-2005 database-design

我需要一个用于存储键/值对的表(如Windows注册表)。这就是我所拥有的:

CREATE TABLE REG         
(                       
    ID VARCHAR(255) NOT NULL,
    DATA VARCHAR(1024),  
    PRIMARY KEY(ID)          
);                       

我正在使用SQL Server 2008 R2,2008和2005。

任何人都可以提供更有效的存储键/值对的想法。

我正在存储这样的密钥:

/ USER / REX / AUTO_LOGIN =“T”

/ USER / REX / MESSAGE / 1 =“这是一条较长的消息”

在大约10000条记录中,我已经看到了性能问题。

2 个答案:

答案 0 :(得分:2)

您可以引入一个附加列,该列是键名的哈希值;例如“/ USER / REX / AUTO_LOGIN”可能会散列到102454.然后,您可以在散列列上添加索引(或散列列和键名列上的复合索引),并将其包含在任何查询的where子句中; e.g

SELECT DATA
FROM REG
WHERE HASH = 102454 and ID = '/USER/REX/AUTO_LOGIN'

int列上搜索应该比查询varchar ID列更有效,并且应该具有缩小到具有相同哈希值的几行的效果,然后将检查其是否匹配ID值。

答案 1 :(得分:1)

我会避免使用varchar(255)作为我的主键,而是选择一个唯一索引:

CREATE TABLE REG (
    id bigint identity not null,
    key VARCHAR(256) NOT NULL,
    DATA VARCHAR(1024),
    PRIMARY KEY(ID)
);

create unique index reg_key on REG(key);