我有一個查詢似乎要花太長時間才能執行。這已經有一段時間了,因爲除了非常簡單的選擇/更新和v.simple連接之外,我已經做了很多事情,所以我在這裏不僅僅是生鏽了!優化我的(簡單)SQL查詢(連接)
SELECT count(distinct r.TAGCODE)
FROM RAWREADS r
where r.TAGCODE NOT IN (
select distinct r.TAGCODE
from RAWREADS r, checkpoints c, guards g, INCIDENTITEMS i
where r.TAGCODE = c.TAGNO
or r.TAGCODE = g.IDTAG
or r.TAGCODE = i.IDTAG
);
內選擇似乎正常工作,如果慢(幾秒鐘),但只要我添加外「算哪裏都不在」我最終不得不殺了我的DB連接 - 因此沒有良好的工作進入應用程序! ;)
我希望上面的查詢清楚了我想要實現的...獲取所有rawread標籤,其中該標籤與checkpoints/guard/incidentitems中的相應列不匹配。
我正在使用Flamebird數據庫服務器(沒有選擇)和FlameRobin運行查詢,如果重要。
在某些時候,我還需要添加一個查詢到外部選擇,以確保我不選擇標籤代碼爲空或「」的任何rawreads。
我已經從out select中刪除了一個「char_length(tagcode)> 0」條件,希望能夠加快速度,但是我認爲我的問題比這個更重要。
+1:可以使用WHERE NOT EXISTS進一步優化(c)而不存在(g)而不存在(i)'? – MatBailie 2012-08-08 13:54:41
@Dems:我認爲這不會有很大的不同。在任何情況下,表中的三個選項都會運行,因爲我不認爲WHERE子句會短路,如果不是必要的話,不會運行其他查詢。但它可能值得一試 – 2012-08-08 13:57:45
感謝馬(!)。我在我的數據庫上試過這個查詢,它返回的速度比我能測量的要快,足夠滿足我的需求(它永遠不會是一個大數據集)。 我現在得去看看工會了! – DaFoot 2012-08-08 14:13:35