我正在使用ms sqlserver 2005.我有一個查詢需要根據日期進行過濾。 可以說我有一個包含電話號碼和日期的表格。 我需要提供時間範圍內電話號碼的計數(開始日期和結束日期)。 如果這些電話號碼在過去出現,則不應將其計入結果計數。 我做這樣的事情:SQL查詢選擇優化
select (phoneNumber) from someTbl
where phoneNumber not in (select phoneNumber from someTbl where date<@startDate)
這看起來效率不高,在所有我(和它花費過多時間瓶坯與一些副作用,也許應該在不同的問題,提交的結果) 我在某些TBL中有大約300K行,應該檢查。
我做這個檢查後,我需要檢查一件事。 我有一個過去的數據庫,其中包含另一個30K的電話號碼。 所以我加入
and phoneNumber not in (select pastPhoneNumber from somePastTbl)
和真正釘棺材或打破駱駝或什麼都使用的是解釋致命狀態短語的最後一根稻草。
所以我正在尋找更好的方法來預製這2個動作。
UPDATE 我已經選擇去亞歷山大的解決方案,結束了這種查詢:
SELECT t.number
FROM tbl t
WHERE t.Date > @startDate
--this is a filter for different customers
AND t.userId in (
SELECT UserId
FROM Customer INNER JOIN UserToCustomer ON Customer.customerId = UserToCustomer.CustomerId
Where customerName = @customer
)
--this is the filter for past number
AND NOT EXISTS (
SELECT 1
FROM pastTbl t2
WHERE t2.Numbers = t.number
)
-- this is the filter for checking if the number appeared in the table before startdate
AND NOT EXISTS (
SELECT *
FROM tbl t3
WHERE t3.Date<@startDate and t.number=t3.number
)
感謝吉拉德
什麼部分查詢的花費最多時間的查詢執行計劃?索引是否提供?查詢需要多長時間?什麼是可接受的時間範圍? – jpw 2013-05-01 09:56:01