2011-12-19 155 views
0

我有3个表a,b,c。需要提高sql查询的性能

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查询的工具。

谢谢。

+1

“正常工作” - 为什么你认为你有性能问题? – 2011-12-19 08:53:52

+0

工作正常意味着给予适当的结果,但在第三个查询我传递两个子查询。在那种情况下id的b然后这将执行,所以花时间是有任何替代方式。 – Areeb 2011-12-19 08:58:30

+0

我会假设sql server 2008有一个足够好的优化器,可以用Tudor Constantin建议的内部连接来实现你可笑的低效sql代码。所以,我更愿意打赌,通过按照Anders UP的建议指定合适的索引,您会看到性能提升。无论如何,请告诉我们您尝试了这些建议后发生了什么。 – 2011-12-19 09:59:32

回答

0

你可以表达你的查询,如:

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

我想你可以使用INNER JOIN重写查询:

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

,如果您有编号,投标指标和援助都应该罚款

2

可能有很多原因,为什么你的查询很慢。从你描述的几个出发点可能是:

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

您可能想要使用Tuning Advisor和/或SQL Server Profiler--在启动时SQL Server文件夹下的Performance Tools菜单中都可用。

此外,学习Management Studios报告的可能性以及熟悉执行计划是很好的起点。

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

0

你也可以尝试使用存在,而不是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 
      ) 
    ) 
0
  1. 避免使用。明确提到列名称。
  2. 将非聚簇索引用于具有大量记录的表。
  3. 使用联接而不是子查询。
  4. 在存储过程中使用“上设置NoCount”。
  5. 您可以使用临时表。插入所需的数据并最终执行。不要忘记在退出存储过程之前先删除它。