在包含几十个表的数据库中更改和查找内容,其中包含大约五十万行,我经常遇到超时。
其中一些超时我不明白。例如,我得到了这张表:
CREATE TABLE dbo.[VPI_APO]
(
[Key] bigint IDENTITY(1,1) NOT NULL CONSTRAINT [PK_VPI_APO] PRIMARY KEY,
[PZN] nvarchar(7) NOT NULL,
[Key_INB] nvarchar(5) NOT NULL,
) ON [PRIMARY]
GO
ALTER TABLE dbo.[VPI_APO] ADD CONSTRAINT [IX_VPI_APOKey_INB] UNIQUE NONCLUSTERED
(
[PZN],
[Key_INB]
) ON [PRIMARY]
GO
当我在此表中搜索此项目时(在插入大量项目期间),我经常会遇到超时:
SELECT [Key] FROM dbo.[VPI_APO] WHERE ([PZN] = @Search1) AND ([Key_INB] = @Search2)
搜索唯一约束时的这些超时经常发生。我期望独特的约束与指数具有相同的好处,我错了吗?我是否也需要这些字段的索引?
或者我是否必须以不同的方式搜索约束的好处?
我正在使用SQL Server 2008 R2。
答案 0 :(得分:2)
我的第一个想法是参数嗅探。
如果您使用的是SQL Server 2008,请尝试“OPTIMIZE FOR UNKNOWN”而不是参数屏蔽
第二个想法是将唯一的constrant更改为索引并明确地INCLUDE Key列。在内部它们是相同的,但作为索引,你有更多的灵活性(例如过滤器,包括等)
答案 1 :(得分:2)
唯一约束会创建索引。基于查询和定义的约束,您应该处于覆盖状态,这意味着索引提供了查询所需的所有内容,而无需返回到群集或堆来检索数据。我怀疑您的索引选择性不足或您的统计信息已过期。首先尝试使用sp_updatestats更新统计信息。如果这不会改变行为,请尝试使用UPDATE STATISTICS VPI_APO WITH FULL SCAN。如果这些都不起作用,则需要使用DBCC SHOW_STATISTICS检查索引的选择性。