SQL查询在稀疏数据集

时间:2017-08-23 13:31:33

标签: sql-server datatable

出于同步目的,我试图获取表中现有对象的子集。

该表格有两个字段[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上添加非聚集索引,但它没有帮助。

1 个答案:

答案 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;

作为免责声明,如果这不能提高性能,可能是因为您的表格基数较低。在这种情况下,索引可能不是很有效。