我有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查询的工具。
谢谢。
我有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查询的工具。
谢谢。
你可以表达你的查询,如:
select * from b where b.aid = a.id and a.somefield = 'value'
我想你可以使用INNER JOIN
重写查询:
select * from c
INNER JOIN b ON b.id = c.bid
INNER JOIN a ON a.id = b.aid
,如果您有编号,投标指标和援助都应该罚款
可能有很多原因,为什么你的查询很慢。从你描述的几个出发点可能是:
您可能想要使用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/
你也可以尝试使用存在,而不是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
)
)
“正常工作” - 为什么你认为你有性能问题? – 2011-12-19 08:53:52
工作正常意味着给予适当的结果,但在第三个查询我传递两个子查询。在那种情况下id的b然后这将执行,所以花时间是有任何替代方式。 – Areeb 2011-12-19 08:58:30
我会假设sql server 2008有一个足够好的优化器,可以用Tudor Constantin建议的内部连接来实现你可笑的低效sql代码。所以,我更愿意打赌,通过按照Anders UP的建议指定合适的索引,您会看到性能提升。无论如何,请告诉我们您尝试了这些建议后发生了什么。 – 2011-12-19 09:59:32