一尘不染

SQL-使用联接筛选大表-最佳做法

sql

我有一个包含大量数据的表,我需要将其与其他一些大表连接。

每次实际上只有一小部分表格与我相关。

什么时候最好过滤我的数据?

  1. 在SQL的where子句中。

  2. 创建具有特定数据的临时表,然后再将其联接。

  3. 将谓词添加到第一个内部join ON子句。

  4. 其他想法。

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


阅读 172

收藏
2021-03-17

共1个答案

一尘不染

因为您使用的是INNER
JOIN,所以WHERE或JOIN辩论仅取决于您的品味和风格。就个人而言,我喜欢在ON子句中保留两个表之间的链接(例如,外键约束),而在WHERE子句中保留针对数据的实际过滤器。

SQL Server会将查询解析为相同的令牌树,因此将构建相同的查询执行计划。

如果您使用的是[LEFT / RIGHT] OUTER JOINS,那么它会带来很大的不同,因为不仅性能可能不同,而且结果也很可能不同。


要回答您的其他问题:

什么时候最好过滤我的数据?

  1. 在SQL的where子句中。
  2. 创建具有特定数据的临时表,然后再将其联接。
  3. 将谓词添加到第一个内部join ON子句。
  4. 其他想法。

在WHERE或ON子句中,两者被视为相同。对于3,“ 第一个 内部联接”没有任何意义。在多表INNER
JOIN场景中,哪个先行(在查询中)实际上并不重要,因为查询优化器将按其认为合适的顺序进行排序。

使用临时表完全没有必要,也无济于事,因为无论如何,您都必须提取相关部分-这也是JOIN也会做的。此外,如果在JOIN条件/
WHERE过滤器上具有良好的索引,则该索引将仅用于 访问 相关数据,而无需查看表的其余部分。

2021-03-17