Gil*_*tal 7 sql sql-server performance
我有一个包含大量数据的表,我需要将它与其他一些大表连接起来.
我的桌子中只有一小部分每次都与我有关.
什么时候最好过滤我的数据?
在SQL的where子句中.
使用特定数据创建临时表,然后才加入它.
将谓词添加到第一个内连接ON子句.
其他一些想法.
1.
Select *
From RealyBigTable
Inner Join AnotherBigTable On …
Inner Join YetAnotherBigTable On …
Where RealyBigTable.Type = ?
Run Code Online (Sandbox Code Playgroud)
2.
Select *
Into #temp
From RealyBigTable
Where RealyBigTable.Type = ?
Select *
From #temp
Inner Join AnotherBigTable On …
Inner Join YetAnotherBigTable On …
Run Code Online (Sandbox Code Playgroud)
3.
Select *
From RealyBigTable
Inner Join AnotherBigTable On RealyBigTable.type = ? And …
Inner Join YetAnotherBigTable On …
Run Code Online (Sandbox Code Playgroud)
另一个问题:先发生什么?Join还是Where?
Ric*_*iwi 13
因为您正在使用INNER JOIN,所以WHERE或JOIN辩论仅取决于您的品味和风格.就个人而言,我喜欢在ON子句中保留两个表之间的链接(例如外键约束),并在WHERE子句中保持对数据的实际过滤.
SQL Server将查询解析为相同的标记树,因此将构建相同的查询执行计划.
如果你使用[LEFT/RIGHT] OUTER JOINS代替它,它会产生一个与众不同的世界,因为不仅性能可能不同,而且很可能是结果.
什么时候最好过滤我的数据?
在WHERE或ON子句中,两者都被视为相同.对于3," 第一内连接"没有相关性.在多表INNER JOIN场景中,哪个首先(在查询中)并不重要,因为查询优化器将按其认为合适的方式对顺序进行洗牌.
使用临时表是完全没必要的,也无济于事,因为你无论如何都必须提取相关部分 - 这也是JOIN的作用.此外,如果您在JOIN条件/ WHERE过滤器上有一个很好的索引,索引将仅用于访问相关数据而不查看表的其余部分.