我有一个包含大量数据的表,我需要将其与其他一些大表连接。
每次实际上只有一小部分表格与我相关。
什么时候最好过滤我的数据?
在SQL的where子句中。
创建具有特定数据的临时表,然后再将其联接。
将谓词添加到第一个内部join ON子句。
其他想法。
1。
Select * From RealyBigTable Inner Join AnotherBigTable On 鈥� Inner Join YetAnotherBigTable On 鈥� Where RealyBigTable.Type = ?
2。
Select * Into #temp From RealyBigTable Where RealyBigTable.Type = ? Select * From #temp Inner Join AnotherBigTable On 鈥� Inner Join YetAnotherBigTable On 鈥�
3。
Select * From RealyBigTable Inner Join AnotherBigTable On RealyBigTable.type = ? And 鈥� Inner Join YetAnotherBigTable On 鈥�
另一个问题:首先发生什么?Join还是Where?
Join
Where
因为您使用的是INNER JOIN,所以WHERE或JOIN辩论仅取决于您的品味和风格。就个人而言,我喜欢在ON子句中保留两个表之间的链接(例如,外键约束),而在WHERE子句中保留针对数据的实际过滤器。
SQL Server会将查询解析为相同的令牌树,因此将构建相同的查询执行计划。
如果您使用的是[LEFT / RIGHT] OUTER JOINS,那么它会带来很大的不同,因为不仅性能可能不同,而且结果也很可能不同。
要回答您的其他问题:
在WHERE或ON子句中,两者被视为相同。对于3,“ 第一个 内部联接”没有任何意义。在多表INNER JOIN场景中,哪个先行(在查询中)实际上并不重要,因为查询优化器将按其认为合适的顺序进行排序。
使用临时表完全没有必要,也无济于事,因为无论如何,您都必须提取相关部分-这也是JOIN也会做的。此外,如果在JOIN条件/ WHERE过滤器上具有良好的索引,则该索引将仅用于 访问 相关数据,而无需查看表的其余部分。