应该避免哪些SQL Server查询功能/子句的示例?

时间:2010-02-03 18:48:16

标签: sql-server sql-server-2005 performance

应该避免哪些SQL Server查询功能/子句的示例?

最近我发现 NOT IN 子句严重降低了性能。

你有更多的例子吗?

4 个答案:

答案 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条记录,而第一个联盟则返回了几千条记录。