我已经搜索了stackoverflow,但每个人都要求优化他们已经完成的查询.
例如,一个已知的事实,写入SELECT * FROM是一个要避免的事情,因为sql引擎必须做出一个“隐形”查询来知道应该显示哪些列.
也知道@min_number和@max_number之间的效果比Id> = @min_number AND Id <= @max_number更好,但是我不记得为什么.这可能是因为引擎之间是一个较低级别的句子,并创建了以“处理”方式显示注册表的迭代.但我只是不知道肯定. 有人可以验证那些,并列出最常见的做法,应该避免什么?
解决方法
我的列表是sql Server特定的(我确定是更多):
使用sargable where子句 – 这意味着没有函数特别是在其中的子句中的标量UDF
当您正在寻找与第二个表不匹配的行时,WHERE NOT EXISTS往往是比左侧连接更快的选择,其中的id为空结构.
相关的子查询往往逐行运行,可怕的速度很慢.
调用其他视图的视图无法编入索引,变得非常慢,特别是如果您在大型表中获得多个级别.
选择*是特别的,当你有一个连接,因为至少有一列被发送两次,这是浪费服务器和数据库和网络资源.
通常可以使用更快速的基于集合的逻辑来替换游标
以正确的方式存储数据时,可以避免大量的即时转换.
更新时,请确保添加了一个where子句,以便不更新新值和旧值相同的行.这可能是更新10,000,000行和更新15之间的差异.示例(@L_404_0@更新结构,如果您使用另一个数据库,则可能需要查找正确的语法,但它应该提供您的想法.):
Update t set field1 = t2.field2 from table1 t join table2 t2 on t.tid = t2.tid Where t.field1 <> t2.field2
要么
Update t set field1 = @variable from table1 t Where t.field1 <> @variable
如果您一直在使用字段中的函数,那么您可能无法正确存储它(或者您应该有一个持久的计算字段,并且只有在每次选择列时才进行转换).