刚跟我的一位同事说话。在前往咖啡机的路上,他正在一步一步地走路。
我问他“'swarmy'走路有什么用?”,他说,“我只是将一个两小时长的查询减少到40秒!感觉非常好。”
他改变了一个存储过程,即使用游标并引入了一个临时表,该表是从原始数据集重构的 - 我会尽快给他发电子邮件,以获得有关实际实现的更多信息。
但最终,他嗡嗡作响。
问题是,什么是SQL,它会影响你的想法并让你嗡嗡作响,同时优化性能低下的查询?
答案 0 :(得分:6)
我必须说当我学会了如何创建和使用覆盖索引时。现在, THAT 是一个性能助推器。
答案 1 :(得分:5)
使用SQL BULK IMPORT将几小时的继承INSERT代码减少到不到一分钟。
答案 2 :(得分:3)
总是很高兴采用写得不好,带光标的查询并消除游标,将代码减少一半,并将性能提高多倍。
一些最好的改进是清晰度(并且通常也会带来不错的性能提升)。
答案 3 :(得分:1)
很抱歉,我不倾向于从这种事情中获得嗡嗡声,但大多数情况都非常基本,监控查询性能并添加索引以加快速度。
现在通过更改类中的数据结构和算法来提高我编写的“真实”代码的速度,这就是我获得热门话题的地方(并且声誉是工作中性能修复的首选)。 / p>
答案 4 :(得分:1)
因为这是我在嵌入式设备上第一次体验sql - 与通常的服务器相关的东西(索引,规范化等等)完全不同
---就服务器而言,索引是真正的祝福。如果你在表中稍微有点痛苦并且摆脱尽可能多的空值,你会对性能提升感到惊讶 - 没有多少开发人员专注于空值,他们通常会使用索引和其他记录的东西
其他一些较少被利用的方法 - 使用xml来处理多次批量插入/更新/删除,而不是一次进行1次插入 - 在sql 2005中,这可能是非常酷的
答案 5 :(得分:1)
关于索引的全部内容。并避免使他们无用的愚蠢事情。
答案 6 :(得分:1)
更改WHERE子句中的条件顺序,以便首先过滤最具辨别力的条件(同时删除性别等非区分列的索引)。
答案 7 :(得分:1)
在当天,我参与了用COBOL编写的CICS / DB2系统。尽管我们拥有所有正确的索引和WHERE
子句,但我们的许多查询都在进行全表扫描(并且速度很慢)。
事实证明(我可能已经倒退了,已经15年了)问题是我们在PIC S9(n) COMP
中使用WORKING STORAGE
作为查询参数,但是DB2想要{{1} }。通过使用错误的数据类型,DB2必须进行全表扫描,以便将数据库中的值转换为我们传入的值。我们更改了变量定义,查询现在可以使用索引,这显着改善了我们的表现。
答案 8 :(得分:1)
我有一个最初为SQL Server 6.5编写的查询,它不支持SQL 92连接语法,即
select foo.baz
from foo
left outer join bar
on foo.a = bar.a
改为写成
select foo.baz
from foo, bar
where foo.a *= bar.a
查询已经存在了一段时间,并且累积了相关数据以使查询运行得太慢,大约需要90秒才能完成。当这个问题出现时,我们已经升级到SQL Server 7。
在使用索引和其他Easter-egging之后,我将连接语法更改为符合SQL 92。查询时间减少到3秒。
我认为我再也没有那种感觉了。我是一个f%$ ^英雄。
答案 9 :(得分:0)
我在之前的一个问题("Biggest performance improvement you’ve had with the smallest change?")上回答了这个问题,然而,这是一个如此简单的改进,但却经常被忽视的一个改进:
答案 10 :(得分:0)
我们有一个类似的事情,我们在Open Freeway网站上查询速度慢。答案不是优化查询,而是优化它所在的服务器。我们增加了缓存限制和缓存大小,以便服务器不会经常运行查询。
这大大提高了系统的速度,最终让客户满意! :)
不是原始帖子优化技能的水准,但它确实让我们嗡嗡声!
答案 11 :(得分:0)
拆分一个可笑的长存储过程,它执行了大量的“如果它是在下午5点之后,返回这个sql”并且花了超过20秒来运行,进入一组被调用的存储过程一个控制sp,并将时间缩短到亚秒响应。
答案 12 :(得分:0)
一个词,动态查询
如果使用大量参数进行搜索,则可以从SQL字符串中对它们进行折扣。这极大地加快了我的查询速度。
Create PROCEDURE dbo.qryDynamic
(
@txtParameter1 nvarchar(255),
@txtParameter2 nvarchar(255),
AS
SELECT qry_DataFromAView.*
FROM qry_DataFromAView
BEGIN
DECLARE @SQL nvarchar(2500)
DECLARE @txtJoin nvarchar(50)
Set @txtJoin = ' Where '
SET @SQL = 'SELECT qry_DataFromAView.*
FROM qry_DataFromAView'
IF @txtParameter1 is not null
Begin
SET @SQL=@SQL + @txtJoin + ' Field1 LIKE N''%'' + @dynParameter1 + N''%'') '
Set @txtJoin = ' And '
end
IF @txtParameter2 is not null
Begin
SET @SQL=@SQL + @txtJoin + ' Field2 LIKE N''%'' + @dynParameter2 + N''%'') '
Set @txtJoin = ' And '
end
SET @SQL=@SQL + ' ORDER BY Field2'
Exec sp_executesql @SQL, N'@dynParameter1 nvarchar(255), @dynParameter2 nvarchar(255)', @dynParameter1 = @txtParameter1 ,@dynParameter2 = @txtParameter2
END
GO
答案 13 :(得分:0)
在能够使用Cross Tab查询废弃处理和查找的oodles(技术术语)后,我有了一个温暖的光芒......
通常情况下,添加索引或只获取所需数据等简单的事情,但是当您发现的问题符合您之前见过的答案时......好时光!
答案 14 :(得分:0)
(主题的一半)
我将3000行存储过程重写为LINQ2SQL / C#。 存储过程在一堆未编制索引的临时表之间篡改了大量数据。 LINQ2SQL版本将数据读入几个Dictionaries和ILookups,然后我用普通的旧C#代码手动加入数据。
存储过程大约需要20秒,LINQ2SQL / C#版需要0.2秒。