出于同步目的,我试图获取表中现有对象的子集。
该表格有两个字段[Group]
和Member
,它们都是字符串化的Guids。
所有行可能都很大,以适应数据表;我已经遇到了OutOfMemory
异常。但是我必须检查我现在需要的所有东西都在数据表中。所以我选择了我要检查的Guids(它们以1000块为单位),并仅查询相关对象。
所以,而不是用所有
填充我的数据表一次SELECT * FROM Group_Membership
我正在对我的SQL数据库运行以下SQL查询,以便一次获取一千个Guids的相关对象:
SELECT *
FROM Group_Membership
WHERE
[Group] IN (@Guid0, @Guid1, @Guid2, @Guid3, @Guid4, @Guid5, ..., @Guid999)
现在,该表共包含142个条目,查询已经超时(CommandTimeout
= 30秒)。在其他表格中,这些表格没有人工填充,类似的查询也不会超时。
有人能否阐明SQL Server的逻辑以及是否/如何将其提示到正确的方向?
我已经尝试在列Group
上添加非聚集索引,但它没有帮助。
答案 0 :(得分:1)
我不确定WHERE IN
是否能够最大限度地使用[Group]
上的索引,或者根本不使用索引。但是,如果您有第二个包含GUID值的表,而且如果该列具有索引,则连接可能会执行得非常快。
为GUID创建一个临时表并填充它:
CREATE TABLE #Guids (
Guid varchar(255)
)
INSERT INTO #Guids (Guid)
VALUES
(@Guid0, @Guid1, @Guid2, @Guid3, @Guid4, ...)
CREATE INDEX Idx_Guid ON #Guids (Guid);
现在尝试使用联接而不是WHERE IN (...)
重新编写当前查询:
SELECT *
FROM Group_Membership t1
INNER JOIN #Guids t2
ON t1.[Group] = t2.Guid;
作为免责声明,如果这不能提高性能,可能是因为您的表格基数较低。在这种情况下,索引可能不是很有效。