复杂静态 SQL IN 与 EXIST 的当前服务器性能 select

Current SQL Server performance of IN vs EXIST for a complex static select

我想知道 IN 是否会缓存静态复杂查询的结果,还是会针对每一行执行?

样本

SELECT a.id, a.name
FROM customer a
WHERE a.id IN (SELECT b.customerId 
               FROM orders b 
               JOIN aricle c ON c.orderId = b.id 
               WHERE b.date = '20160910' and c.costcenter > 1000)

现在,子查询的结果会暂时存储还是 EXIST 会更快?

我们假设结果只有几行 < 100,但查询可能要复杂得多!

我知道在那种情况下我也可以加入表格,但这不是重点。

我对当前 SQL 服务器

的行为特别感兴趣

谢谢大家:)

如果您对 SQR 的行为特别感兴趣,那么您可以在 SQL 语句之前通过 运行 以下命令验证并查看数据是从内存还是从磁盘读取的。

SET STATISTICS IO ON

它将return逻辑和物理读取。

逻辑读取: 逻辑读取表示需要从数据缓存访问以处理查询的数据页总数。逻辑读很可能会多次访问相同的数据页,所以逻辑读值的计数可能会高于table中的实际页数。通常减少逻辑读取的最好方法是应用正确的索引或重写查询。

物理读取 物理读取表示从磁盘读取的数据页总数。如果数据缓存中没有数据,则物理读取将等于逻辑读取的数量。通常它发生在第一个查询请求中。并且对于后续相同的查询请求,数量将大大减少,因为数据页已经在数据缓存中。

要比较两个查询,您可以使用执行计划来检查执行时间并比较查询。