在 mssql 中,如何有效地运行此查询:
select id from table where field in (gigantic list of ordered longs)
Run Code Online (Sandbox Code Playgroud)
表架构:
table:
{
id primary key
field long
} index findex (field)
Run Code Online (Sandbox Code Playgroud)
我认为这应该非常快(因为它基本上只是遍历两个有序的 long 列表)。有没有办法连续输入 ID?
我可以从控制台或使用 Linqpad/SSMS 来完成。
当前(慢)解决方案:构建许多长查询的控制台应用程序,每个查询都有 3k fieldId 参数。参数数量的限制是问题所在;如何解决它?
select id from table where field in(巨大的有序长列表)
带有长IN列表的查询很慢,因为它们在每次调用时都会被解析和编译。
要么将列表作为 JSON 数组传递:
select id from table where field in (select value from openjson(@values))
Run Code Online (Sandbox Code Playgroud)
或者使用表值参数或批量加载带有值的临时表。确保有索引或主键。该OPENJSON方法可能会更慢,但好处是它适用于所有客户端驱动程序。除 .NET 和 Java 外,TVP 和批量插入并不总是可用。