Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL-大表和小表之间的内部联接,带有筛选器_Sql Server - Fatal编程技术网

Sql server SQL-大表和小表之间的内部联接,带有筛选器

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

我有一个简单的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.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中具有匹配主键的任何列