我有一個包含Customers,Subscriptions和Publications表的訂閱數據庫。從SQL查詢中排除可能結果的最有效方法是什麼?
訂閱表包含所有訂閱記錄,每個記錄有三個標誌來標記狀態:isActive,isExpire和isPending。這些是布爾值,只有一個標誌可以爲真 - 這是由應用程序處理的。
我需要確定所有未更新他們之前訂閱的雜誌的客戶,而且我不確定自己是否編寫了最有效的SQL查詢。如果我發現已經失效的訂閱,那麼如果他們已經擁有該特定雜誌的活動訂閱或待定訂閱,我需要忽略它。
這是我有:
SELECT DISTINCT Customers.id, Subscriptions.publicationName
FROM Subscriptions
LEFT JOIN Customers
ON Subscriptions.id_Customer = Customers.id
LEFT JOIN Publications
ON Subscriptions.id_Publication = Publications.id
WHERE Subscriptions.isExpired = 1
AND NOT EXISTS
(SELECT * FROM Subscriptions s2
WHERE s2.id_Publication = Subscriptions.id_Publication
AND s2.id_Customer = Subscriptions.id_Customer
AND s2.isPending = 1)
AND NOT EXISTS
(SELECT * FROM Subscriptions s3
WHERE s3.id_Publication = Subscriptions.id_Publication
AND s3.id_Customer = Subscriptions.id_Customer
AND s3.isActive = 1)
我剛剛超過50,000訂閱記錄,此查詢需要近一個小時運行,它告訴我,有很多循環或一些事情,其中的每條記錄的SQL引擎必須再次搜索才能找到任何'isPending'和'isActive'記錄。
這是我的第一篇文章,所以請溫柔,如果我錯過了我的問題中的任何信息:)謝謝。
它正在運行什麼硬件? –
在你的數據庫中,我認爲訂閱表中的每一行都是'訂閱'的'續訂'是否正確?我的意思是假設客戶擁有一本雜誌,並且子分期到2015年12月。當他續訂訂閱時,它是否在訂閱表中創建了新行,還是僅僅將狀態轉回到活動狀態? –
Windows Server 2012 R2 Essentials 64位 Intel Xeon CPU E3-1220 v3 @ 3.10Ghz 4Gb RAM –