SQL,试图去掉大的 IN 子句
SQL, trying to get rid of large IN cluase
我有一个table,
Contacts:
Contact_ID (int)
ContactName (nvarchar)
我收到了 select 的联系人 ID 列表。通常,我会做
SELECT *
FROM Contacts
WHERE IN (List of contact ID)
问题是,联系人 ID 列表可能会变得非常大,例如 50k 或更多。
所以我的问题是,有没有一种方法可以在不使用 IN 子句的情况下处理大量联系人 ID?
编辑:我正在使用 Microsoft sql 服务器。查询和联系人 ID 在运行时构建并传递给要执行的 sql 命令 class (c#)。
如果你想要性能,我会使用 EXISTS 子句。
SELECT c.Contact_ID, c.ContactName
FROM Contacts c
WHERE EXISTS (List of contact ID)
我会创建一个 table 类型,其中包含一个列和一个聚集主键。
CREATE TYPE dbo.ContactId AS TABLE
(
ContactId INT NOT NULL PRIMARY KEY
);
使用 table 值参数将值传递到查询中。
将您的查询更改为
SELECT *
FROM Contacts
WHERE contactID IN (SELECT y.contactID FROM @yourtablevaluedparameter y)
OPTION (RECOMPILE)
OPTION (RECOMPILE)
用于计算行数,因为 50K 的最佳计划可能与 1 的不同。
You can find some example C# code for populating a TVP here
创建一个临时文件 table 并以行的形式填充您的联系人 ID。
在您的 table 和临时 table 之间进行内部连接,如下所示。
SELECT c.*
FROM Contacts c
join #temptable t
on c.id=t.id
如果您在临时 table 的 Join 列上引入索引,那么您的查询会更快。
我有一个table,
Contacts:
Contact_ID (int)
ContactName (nvarchar)
我收到了 select 的联系人 ID 列表。通常,我会做
SELECT *
FROM Contacts
WHERE IN (List of contact ID)
问题是,联系人 ID 列表可能会变得非常大,例如 50k 或更多。
所以我的问题是,有没有一种方法可以在不使用 IN 子句的情况下处理大量联系人 ID?
编辑:我正在使用 Microsoft sql 服务器。查询和联系人 ID 在运行时构建并传递给要执行的 sql 命令 class (c#)。
如果你想要性能,我会使用 EXISTS 子句。
SELECT c.Contact_ID, c.ContactName
FROM Contacts c
WHERE EXISTS (List of contact ID)
我会创建一个 table 类型,其中包含一个列和一个聚集主键。
CREATE TYPE dbo.ContactId AS TABLE
(
ContactId INT NOT NULL PRIMARY KEY
);
使用 table 值参数将值传递到查询中。
将您的查询更改为
SELECT *
FROM Contacts
WHERE contactID IN (SELECT y.contactID FROM @yourtablevaluedparameter y)
OPTION (RECOMPILE)
OPTION (RECOMPILE)
用于计算行数,因为 50K 的最佳计划可能与 1 的不同。
You can find some example C# code for populating a TVP here
创建一个临时文件 table 并以行的形式填充您的联系人 ID。 在您的 table 和临时 table 之间进行内部连接,如下所示。
SELECT c.*
FROM Contacts c
join #temptable t
on c.id=t.id
如果您在临时 table 的 Join 列上引入索引,那么您的查询会更快。