Sql server SQL-大表和小表之间的内部联接,带有筛选器
我有一个简单的SQL查询,它在表a和表B之间进行内部连接,并进行过滤。表A非常大,而表B相当小。我只想返回与某个筛选器匹配的行,例如,table_B.some_col IN('a','B','c','d')。当然,我把这个过滤器作为WHERE子句。但是,建议我复制相同的筛选器,但要复制表A并将其放入联接中。比如说,Sql server SQL-大表和小表之间的内部联接,带有筛选器,sql-server,Sql Server,我有一个简单的SQL查询,它在表a和表B之间进行内部连接,并进行过滤。表A非常大,而表B相当小。我只想返回与某个筛选器匹配的行,例如,table_B.some_col IN('a','B','c','d')。当然,我把这个过滤器作为WHERE子句。但是,建议我复制相同的筛选器,但要复制表A并将其放入联接中。比如说, SELECT * FROM table_A INNER JOIN table_B ON table_A.pk = table_B.pk AND table_A.som
SELECT
*
FROM table_A
INNER JOIN table_B
ON table_A.pk = table_B.pk
AND table_A.some_col IN ('a', 'b', 'c', 'd')
WHERE
table_B.some_col IN ('a', 'b', 'c', 'd')
据称,这样做可以改进查询计划。不幸的是,由于机器上的安全限制,我无法检查查询计划。这种说法是真的吗?在
和或的Where
子句中添加一个过滤器没有任何区别
这里有一些测试
使用的查询..
从中选择*
命令
参加
人力资源部员工
关于h.empid=o.empid
在And子句中筛选..
empid=4
执行计划:
设置统计IO:
Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
在Where子句处筛选:
其中empid=4
执行计划:
统计IO:
Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
在每种情况下,SQLServer都足够聪明,可以重新安排查询(因为它是内部联接),只获取相关行在和或处添加一个过滤器,其中
子句没有任何区别
这里有一些测试
使用的查询..
从中选择*
命令
参加
人力资源部员工
关于h.empid=o.empid
在And子句中筛选..
empid=4
执行计划:
设置统计IO:
Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
在Where子句处筛选:
其中empid=4
执行计划:
统计IO:
Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
在每种情况下,SQLServer都足够聪明,可以重新排列查询(因为它是内部联接),只获取相关行等等,您的两个查询实际上是不同的查询,没有表A。某些列在。。。您可以从B中选择任何在A中具有匹配主键的选项-除非B中的某些列在A中是重复值,否则您的两个查询实际上是不同的查询,没有表A。。。除非B中的某个列是A中的重复值,否则您可以选择从B中选择的、在A中具有匹配主键的任何列