我搜索了stackoverflow,但每个人都要求优化他们已经完成的查询.
我想知道,关于做什么的基本内容,创建查询时要避免的内容.
例如,一个已知的事实是,写入SELECT * FROM是一件要避免的事情,因为sql引擎必须进行"不可见"查询以了解应该显示哪些列.
也知道between @min_number AND @max_number工作比Id >= @min_number AND Id <= @max_number我好,但我不记得为什么.这可能是因为两者之间是由引擎控制在较低级别的句子,并且创建迭代以显示以某种方式"处理"的reg.但我只是不确定.
有人可以验证这些并列出最常见的做法,避免什么?
HLG*_*GEM 15
我的列表是特定于SQL Server的(我确信还有更多):
使用sargable where子句 - 这意味着没有函数特别是标量UDF在where子句中的where子句
当你在寻找那些与第二个表不匹配的行时,哪里没有EXISTS往往比一个id为null结构的左连接更快.
相关的子查询倾向于逐行运行并且速度非常慢.
调用其他视图的视图无法编入索引并变得非常慢,尤其是如果在大型表中获得多个级别.
当您有一个连接时,特别要避免选择*,因为至少有一个列被发送两次,这会浪费服务器,数据库和网络资源.
游标通常可以用更快速执行的基于集合的逻辑替换当您以正确的方式存储数据时,您可以避免很多即时转换.
更新时,请确保添加where子句,以便不更新新值和旧值相同的行.这可能是更新10,000,000行和更新15之间的差异.示例(Tsql Update结构,如果你使用另一个db,你可能必须查找正确的语法,但它应该给你的想法.):
Update t
set field1 = t2.field2
from table1 t
join table2 t2 on t.tid = t2.tid
Where t.field1 <> t2.field2
Run Code Online (Sandbox Code Playgroud)
要么
Update t
set field1 = @variable
from table1 t
Where t.field1 <> @variable
Run Code Online (Sandbox Code Playgroud)
检查您的索引.SQL Seerver不会自动索引外键.如果它们用于连接,则通常需要对其进行索引.
如果您经常在字段上使用函数,则可能无法正确存储它(或者您应该有一个持久的计算字段,并且每次选择列时都不会进行一次转换.)
你最好的选择是为你选择的数据库获得一本好的性能调优书(最好的是数据库特定的),并阅读有关编写查询的章节.
编辑,2012年2月:
避免这些"十大常见的SQL编程错误"
在WHERE子句中,避免使用列作为函数的输入,因为这可能导致全表扫描而不是能够使用索引.某些平台上的查询优化器比其他平台做得更好,但通常更安全.例如,如果您要查找过去30天内的记录,请根据您要比较的日期进行数据操作,而不是针对您的列:
坏
WHERE DATEADD(DAY, 30, [RecordDate]) > GETDATE()
Run Code Online (Sandbox Code Playgroud)
这可能会导致全表扫描(取决于您的平台的查询优化器),即使[RecordDate]已编制索引,因为DATEADD(DAY, 30, [RecordDate])必须进行评估以将其与之进行比较GETDATE().如果您将其更改为:
更好
WHERE [RecordDate] > DATEADD(DAY, -30, GETDATE())
Run Code Online (Sandbox Code Playgroud)
[RecordDate]无论查询计划优化器在您的平台上有多好,现在总是能够使用索引,因为它DATEADD(DAY, -30, GETDATE())被评估一次,然后可以用作索引中的查找.同样的原则适用于使用CASE语句,UDF等.
| 归档时间: |
|
| 查看次数: |
9089 次 |
| 最近记录: |