【发布时间】:2012-07-30 02:00:53
【问题描述】:
我有一个表,其中包含例如我想在数据库中设置唯一的两个字段。例如:
create table Subscriber (
ID int not null,
DataSetId int not null,
Email nvarchar(100) not null,
...
)
ID列为主键,DataSetId和Email都被索引了。
我想要做的是防止相同的 Email 和 DataSetId 组合出现在表中,或者换句话说,对于给定的 DataSetId,Email 值必须是唯一的。
我尝试在列上创建唯一索引
CREATE UNIQUE NONCLUSTERED INDEX IX_Subscriber_Email
ON Subscriber (DataSetId, Email)
但我发现这对搜索时间有相当大的影响(例如,在搜索电子邮件地址时 - 表中有 150 万行)。
有没有更有效的方法来实现这种类型的约束?
【问题讨论】:
-
你是说没有索引的搜索比有索引的搜索要快得多吗?这对我来说是个新闻,据我所知,创建索引总是为了加快搜索速度,而不是减慢搜索速度。
-
不,仅此而已,但它应该不会对您的搜索时间产生任何重大影响?!我们谈论的影响有多大?你能展示一下执行计划吗?您是否更新了统计信息?
-
在 Email 和 DataSetId 上使用“简单”索引搜索电子邮件地址大约需要 1 秒。通过添加额外的复合索引,这增加到大约 9 秒。
-
我整个早上都在玩这个,实际上我认为我有一个不同的问题......我看到的性能下降是从 UI(我知道,我知道)一个 MVC 网络测量的使用 LINQ 的页面。添加索引时,它确实显示出显着的性能下降。如果我从 LINQ 中获取 SQL 表达式并直接在 SQL Server Management Studio 中运行它,那么我实际上会看到性能提升(使用索引)。所以,很抱歉误导了大家。但我不明白的是,为什么 LINQ 表达式在从网页运行时,实际上运行速度要慢 10 倍。
标签: sql-server indexing duplicates