我試圖優化查詢。基本上,交易有三部分可以重複。我記錄了所有通信,但想要獲得3個部分中的「最新鮮」。這三部分都通過一個單一的中間錶鏈接起來(不幸的是),這是什麼放緩了整個事情(太多的標準化?)。強制唯一鍵以避免合併連接
有「星級」「交易」的中心,然後是中心輻條(所有由「TransactionDetails」代表,其中樞紐使用「Transactions」主鍵,然後是外部輻條(PPGDetails,TicketDetails和「TicketDetails」和「CompletionDetails」中的每一個在它們鏈接到的「TransactionDetails」中都有一行,通過主鍵。每筆交易可以有多對這些對象中的每一對。
因此,爲了獲得最近的TicketDetails交易,我使用這個視圖:
CREATE VIEW [dbo].[TicketTransDetails] AS
select *
from TicketDetails tkd
join (select MAX(TicketDetail_ID) as TicketDetail_ID
from TicketDetails temp1
join TransactionDetails temp2
on temp1.TransactionDetail_ID = temp2.TransactionDetail_ID
group by temp2.Transaction_ID) qq
on tkd.TicketDetail_ID = qq.TicketDetail_ID
join TransactionDetails td
on tkd.TransactionDetail_ID = td.TransactionDetail_ID
GO
其他2個細節類型具有相似的視圖。
然後,把所有的交易細節我想,每交易一排,我使用:
select *
from Transactions t
join CompletionTransDetails cpd
on t.Transaction_ID = cpd.Transaction_ID
left outer join TicketTransDetails tkd
on t.Transaction_ID = tkd.Transaction_ID
left outer join PPGTransDetails ppd
on t.Transaction_ID = ppd.Transaction_ID
where cpd.DateAndTime between '2/1/2017' and '3/1/2017'
這是由設計,我想至少具有1「CompletionDetail」 ONLY的交易,但0或更多「PPGDetail」或「TicketDetail」。
此查詢返回正確的結果,但需要40秒才能在體面的服務器硬件上執行,並且在「SELECT」返回需要100%的執行計劃時間之前立即執行「合併連接(左外連接)」。
如果我在最終查詢中將連接取出爲PPGTransDetails或TicketTransDetails,它將執行時間降低到〜20秒,因此顯着改進,但仍然對大量記錄進行合併連接無關,我假設)。
當只選擇一個事務(通過where子句)時,查詢只需要大約4秒,然後查詢就會有「嵌套循環」的最後一步,這也需要大部分時間( 96%)。我希望這個查詢不到一秒鐘。
由於視圖沒有主鍵,我認爲導致合併聯接繼續進行。也就是說,我在創建模擬此功能的查詢時遇到問題 - 更不用說效率更高的查詢了。
任何人都可以幫助我認識到我可能錯過了什麼嗎?
謝謝!
--mobrien118
從本質上講,對於單個事務,可以有很多PPGDetails,TicketDetails和CompletionDetails,但每一個會有它自己的TransactionDetails(它們是一對一的,但不是在模型中強制實施,只是在軟件中)。
目前有:
- 1619307 「交易」
- 3,564518 「TransactionDetails」
- 512644 「PPGDetails」
- 1471826 「TicketDetails」
- 1580043 「CompletionDetails」
目前沒有forei gn在這些項目上設置的關鍵約束或索引。
你對底層表有什麼樣的索引? – pmbAustin