需要提高sql查询的性能

时间:2011-12-19 08:52:00

标签: sql-server-2008 sql-server-2005

我有3个表a,b,c。

select * from a

select * from b where aid in (select id from a)

select * from c where bid in (select Id from b where aid in (select id from a))

这些查询在sp中工作正常,但作为性能我需要优化这些。 您能否建议我如何改进性能或任何可用的工具 优化SQL查询。

谢谢。

5 个答案:

答案 0 :(得分:3)

我认为您可以使用INNER JOIN重写查询:

select * from c 
INNER JOIN b ON b.id = c.bid 
INNER JOIN a ON a.id = b.aid

如果你有id,bid和aid的索引都应该没问题

答案 1 :(得分:2)

查询速度慢的原因可能有很多。根据您的描述,一些起点可能是:

  • 索引缺失或不正确。至少,您必须在已加入或过滤的列上具有索引。
  • 索引的统计信息必须是最新的
  • 在某些情况下,索引可以从包含列的更多字段中受益。
  • 返回正确的数据量 - 包括列和行。如果你返回的太多,你就会充斥各种缓冲区并降低整体性能。

您可能希望使用Tuning Advisor和/或SQL Server Profiler - 在启动时在SQL Server文件夹下的“性能工具”菜单中都可以使用。

此外,学习管理工作室报告的可能性,熟悉执行计划是很好的起点。

对于更高级的学员,开始包括查询I / O的统计信息(在Management Studios查询窗口中),使用Windows性能监视器来关注相关的SQL Server计数器等。对其中一些人的一个很好的解释可以在这里找到:http://www.sql-server-performance.com/2005/sql-server-performance-monitor-coutners/

答案 2 :(得分:0)

您能表达如下问题:

select * from b where b.aid = a.id and a.somefield = 'value'

答案 3 :(得分:0)

您也可以尝试使用exists而不是IN:s。如果有大量数据可以提供帮助:

SELECT 
    *
FROM 
    a

SELECT 
    * 
FROM 
    b 
WHERE EXISTS
    (
        SELECT 
            NULL 
        FROM 
            a
        WHERE
            a.id=b.aid
    )

SELECT 
    * 
FROM 
    c 
WHERE EXISTS
    (
        SELECT 
            NULL 
        FROM 
            b
        WHERE
            c.bid=b.Id
            AND EXISTS
            (
                SELECT 
                    NULL 
                FROM
                    a
                WHERE
                    b.aid=a.id
            )
    )

答案 4 :(得分:0)

  1. 避免使用*。明确提及列名称。
  2. 对具有大量记录的表使用Non Clustered Index。
  3. 使用联接而不是子查询。
  4. 在存储过程中使用“设置NoCount ”。
  5. 您可以使用Temp表。插入所需数据并最终执行。不要忘记在退出存储过程之前删除它。