应该避免哪些SQL Server查询功能/子句的示例?
最近我发现 NOT IN 子句严重降低了性能。
你有更多的例子吗?
答案 0 :(得分:5)
避免NOT IN
的原因并不是真正的性能,而是当集合包含null时,它具有非常令人惊讶的行为。例如:
select 1
where 1 not in (2,null)
这不会返回任何行,因为where
被解释为:
where 1 <> 2 and 1 <> null
首先1 <> null
评估为未知。然后1 <> 2 and unknown
评估为未知。所以你不会收到任何行。
答案 1 :(得分:2)
我避免使用相关子查询(不相关的子查询和派生表都可以)以及我可以避免的任何游标。如果可以,也要避免while循环。考虑数据集而不是逐行处理。
如果您使用的是UNION,请检查UNION ALL是否可以正常工作。可能存在结果差异,因此请在进行更改之前确保。
我总是把DISTINCT这个词看作是一个线索,看看是否有更好的方式来呈现数据。与使用派生表或其他方法相比,DISTINCT成本较高,以避免使用它。
避免隐含的连接语法,以避免意外的交叉连接(人们经常修复,不寒而栗,与众不同)。 (生成一个包含400万条记录的列表然后区分以获得您想要的三条记录是很昂贵的。)
避免调用其他视图的视图!我们有一些人设计了一个完整的客户端数据库,性能是可怕的!不要走那条路。
避免使用语法 在哪里MyField喜欢“%test%'
那个和其他不可浏览的where子句可以阻止优化器使用索引。
答案 2 :(得分:2)
避免
CURSOR - 使用基于集合的操作
SELECT * - 明确命名列
EXEC(@dynamic_sql_with_input_parms) - 将sp_executesql与输入参数一起使用。
答案 3 :(得分:0)
我最近更改了
的视图Select Row1, Row2 FROM table Where blahID = FKblahID
UNION
Select Row1, Row2 FROM table2 Where blah2ID = FKblahID
到
Select Row1, Row2 FROM table Where blahID = FKblahID
并且看到一个大约需要8分钟的查询现在只用了大约20秒而不是100%确定为什么这么大的变化。
第二个联盟也只返回了大约200条记录,而第一个联盟则返回了几千条记录。