对于执行速度慢的查询,您最酷的SQL优化是什么?

时间:2009-03-31 13:11:37

标签: sql performance refactoring

刚跟我的一位同事说话。在前往咖啡机的路上,他正在一步一步地走路。

我问他“'swarmy'走路有什么用?”,他说,“我只是将一个两小时长的查询减少到40秒!感觉非常好。”

他改变了一个存储过程,即使用游标并引入了一个临时表,该表是从原始数据集重构的 - 我会尽快给他发电子邮件,以获得有关实际实现的更多信息。

但最终,他嗡嗡作响。

问题是,什么是SQL,它会影响你的想法并让你嗡嗡作响,同时优化性能低下的查询?

15 个答案:

答案 0 :(得分:6)

我必须说当我学会了如何创建和使用覆盖索引时。现在, THAT 是一个性能助推器。

答案 1 :(得分:5)

使用SQL BULK IMPORT将几小时的继承INSERT代码减少到不到一分钟。

答案 2 :(得分:3)

总是很高兴采用写得不好,带光标的查询并消除游标,将代码减少一半,并将性能提高多倍。

一些最好的改进是清晰度(并且通常也会带来不错的性能提升)。

答案 3 :(得分:1)

很抱歉,我不倾向于从这种事情中获得嗡嗡声,但大多数情况都非常基本,监控查询性能并添加索引以加快速度。

现在通过更改类中的数据结构和算法来提高我编写的“真实”代码的速度,这就是我获得热门话题的地方(并且声誉是工作中性能修复的首选)。 / p>

答案 4 :(得分:1)

嘿,在使用sqlite的iphone上,我使用独家写入事务直接将数据库处理时间从40秒减少到2秒......我很高兴这样做

因为这是我在嵌入式设备上第一次体验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?")上回答了这个问题,然而,这是一个如此简单的改进,但却经常被忽视的一个改进:

Indexes!

答案 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秒。