臨時表通常可以幫助您解決性能問題。一種方法可能是僅收集需要考慮到臨時表中的記錄,然後從臨時表中創建最終的選擇語句,並將其添加到任何其他未過濾的表中。
舉一個例子,假設您正在搜索的字段之一是field1
in table1
。通過插入到表#table1
只有具有的field1
值記錄你正在尋找開始:
select PrimaryKeyTable1, Field1, Field2, Field3, etc...
into #table1
from table1
where Field1 = 'Whatever you are looking for'
這應該是非常快,即使是大表,特別是如果你有Field1
的索引。您可以爲每個帶有搜索字段的表執行此操作,以收集您正在搜索的具有相關記錄的所有記錄。
然後,您還需要確保將任何記錄插入到您的臨時表中,這些記錄可能具有對任何其他臨時表的外鍵引用。假設您還使用上述方法構建了表#table2
,該方法具有一個名爲PrimaryKeyTable1
的table1
的外鍵。你會像插入這些記錄:
Insert into #table1
(PrimaryKeyTable1, Field1, Field2, Field3, etc...)
select table1.PrimaryKeyTable1, table1.Field1, table1.Field2, table1.Field3, etc...
from table1
join #table2
on table1.PrimaryKeyTable1 = table2.PrimaryKeyTable1
where table1.PrimaryKeyTable1 not in
(Select PrimaryKeyTable1 from #table1)
現在,您也將有#table1
匹配,達到創紀錄的#table2
包含符合搜索條件的記錄中的任何記錄。您可以爲所有具有相關外鍵的臨時表執行此操作。你插入的順序很重要;請確保在收集外鍵引用記錄時,不要在最後一條插入語句之後引用任何臨時表。
然後,您可以簡單地執行最終選擇語句,用您已構建的臨時表替換實際表格,並刪除搜索字段數據的所有過濾器。根據查詢的結構可能會有其他優化,但這是一般的想法。
如果您已經探索了所有的索引選項,但這仍然無濟於事,MS SQL Server具有「更改跟蹤」功能,可能在構建緩存表時使用它。您啓用數據庫進行更改跟蹤並配置您希望跟蹤的表。 SQL Server然後在每次更新時創建更改記錄,在表上插入和刪除,然後讓您查詢自上次檢查以來所做的記錄更改。這對於同步更改非常有用,並且比使用觸發器更有效。這比管理自己的跟蹤表更容易管理。這是一個功能,因爲SQL Server 2005的
How to: Use SQL Server Change Tracking
變化只跟蹤捕獲表的主鍵和讓您查詢哪些領域可能已被修改。然後,您可以查詢這些鍵上的表連接以獲取當前數據。如果你想要捕獲數據,你也可以使用Change Capture,但是它需要更多的開銷,並且至少需要SQL Server 2008企業版。
Change Data Capture
如果您展示了一些示例表和代碼,這將會很有幫助。只是從描述中理解你的情況有點困難。 –
對不起,我真的不能。問題在於,如果將所有這些表格中的部分信息合併爲一張表格,這是最佳解決方案。如果我很好地理解這個概念,它與NoSql類似。 – user278618
我建議你在複製任何數據之前檢查相關表的索引。 –