我有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