這個問題的關鍵部分是'最佳',意思是最快的返回時間。我有幾張有我想要的信息的表格。編寫查詢本身並不麻煩,只是試圖確定獲取信息的最快方式。如何優化從多個表中獲取記錄
- 審計(這是主表我想從信息)
- 訂單(其餘的都是表我想從有限的數據)
- 喬布斯
- 現金
的事情,他們共同點是一個賬戶,因此是一個AccountID。我有我正在尋找的AccountID。不幸的是,審計表沒有一個直接的外鍵進入有問題的賬戶表,因此爲了確定審計記錄是否屬於我的結果集,我必須一次一個地加入審計表和隨後的3個表檢查審計記錄是否與我的AccountID相關。
例如
Select a.* from [Audits] a JOIN [Orders] o ON a.RecordID = o.OrderID
where a.RecordType = 'Order' and o.AccountID = @AccountID
union
select a.* from [Audits] a JOIN [Jobs] j on a.RecordID = j.JobID
where a.RecordType = 'Job' and j.AccountID = @AccountID
...
我打算做一個數據的第一子集下次提取,然後填寫從二級表中的信息,使我最初做了有限的成功。我認爲這是一個兩部分問題,首先是找到屬於我的子集的AuditID的最快方法,其次是填寫缺失數據的最快方式。任何建議,將不勝感激。
編輯1
,我想出了一個解決方案了,但如果有任何簡單的方法來優化它,所以我打算將它張貼在這裏我有興趣知道希望它有助於進一步澄清問題。如果您發現語法錯誤,請忽略它們,我試圖刪除儘可能多的不必要的信息。
Create Table #AuditTemp (columns)
Insert into #AuditTemp a.*, null as [Extra1], null as [Extra2] ...
From [Audits] a
Left Join [Orders] o ON a.RecordID = o.OrderID
Left Join [Jobs] j ON a.RecordID = j.JobID
Left Join [Credits] c ON a.RecordID = c.CreditID
Where o.AccountID = @AccountID or j.AccountID = @AccountID ...
Order By Time desc
OFFSET @offset ROWS FETCH NEXT @PageSize ROWS ONLY
Update #AuditTemp Set [Extra1] = o.[Column1] ...
From [Orders] Where o.AccountID = @AccountID and #AuditTemp.RecordID = o.OrderID
...
因此,我得到我需要的20條記錄,然後如果它們匹配,則一次填充一條記錄。
讓我看看我是否正確:「審計」表中的「RecordID」字段可以是一個Order,Job或Credit,並且它們唯一共享的是「AccountID」字段? –
看起來很有趣。想到的一點是使用'union all'而不是'union'。這將跳過'union'的額外排序和重複數據刪除。 – SqlZim
你使用的是什麼版本的sql server? 'select @@ version' – SqlZim