Sql 对于2行和2000行,查询同时返回的是什么?

Sql 对于2行和2000行,查询同时返回的是什么?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个查询,当在子句中有一个变量时:在('123','456') 如果我在in()子句中放入两项,查询将在4秒钟后返回 如果我在in()子句中放入200个项目,查询仍然会在4秒内返回 该查询是一个嵌套查询 我尝试过调整、索引和向查询中添加选项(FAST x)。将ARITHABORT打开和其他一些,没有区别 SET NOCOUNT ON; SET ARITHABORT ON; SET QUOTED_IDENTIFIER OFF; SELECT columns FROM (SELEC

我有一个查询,当在子句中有一个
变量时:
在('123','456')

  • 如果我在
    in()
    子句中放入两项,查询将在4秒钟后返回
  • 如果我在
    in()
    子句中放入200个项目,查询仍然会在4秒内返回
该查询是一个嵌套查询

我尝试过调整、索引和向查询中添加选项(FAST x)。将
ARITHABORT打开
和其他一些,没有区别

SET NOCOUNT ON;
SET ARITHABORT ON;
SET QUOTED_IDENTIFIER OFF;

SELECT columns
FROM
    (SELECT columns 
     FROM
         (SELECT columns 
          FROM 
              (SELECT columns 
               FROM sometable 
               CROSS JOIN xyz_table) Level1
         ) Level2
    ) Level3
WHERE
    items IN ('123', '456'));

我希望结果能够更快地返回,只需过滤较少的项目。

我建议的解决方案如下:将
中的where in
条件替换为
内部联接(嵌套查询),以存储要查找的值的临时表

剧本应该是这样的

  • 首先,在
    mytentable

  • 然后运行这样的脚本

    select t1.* 
    from myTable t1 
    inner join myTemTable t2 on t1.items = t2.items
    

  • 对于Sql Server,4秒是很长的时间,无论您使用的是2项还是200项。我也看到了这一点:

    该查询是一个嵌套查询

    我建议,除了()中的
    IN
    子句之外,还有其他因素在驱动这里的性能


    但是
    in()
    子句中的200项既不是典型的,也不是特别好的实践。通常,您最好找到一种方法来编写定义这些项的
    SELECT
    语句,然后编写
    JOIN
    APPLY
    ,以应对
    SELECT

    这样的深度嵌套查询可能是真正的性能杀手。您可能希望向我们展示实际的SQL或问题,以防我们能想出更好的方法。如果in不起作用,我建议您将您的项检入临时表并生成一个内部表join@KemalALGAZZAH也许内部连接更合适?@SeanLange,绝对合适!出于某种原因,我认为条件是“不在”,在这种情况下是“在”,最好使用内部连接如果没有索引,两个查询都可以进行完整的表扫描,在这种情况下,唯一的时间差异将是输出IO(在大多数情况下可以忽略不计)