簡體   English   中英

從具有大量數據的聯接中選擇到表中

[英]Selecting into a Table from a Join with Large Amounts of Data

我正在嘗試將結果按日期范圍過濾的兩個表連接起來,然后選擇創建的連接到新表中。 有兩張表:一張約50萬條記錄,另一張約1.5億條記錄。 我試圖運行代碼以使用內部聯接進行提取。 這通常會一直運行,直到我收到一個錯誤,我已經用完了所有的磁盤空間。 我不確定問題是出在大表本身的連接上,還是出在我試圖將結果寫入新表的事實。 另外值得注意的是,大表作為視圖位於鏈接服務器上。

SELECT
  * INTO New_Table
FROM
  OPENQUERY(
    [Linked_Server],
    'SELECT * FROM [LinkedDB].[Schema].[LinkedServerTable]'
  ) IL
  INNER JOIN [Schema].[OtherTableFromLocalHost] I ON IL.IdColumn = I.IdColumn
WHERE
  I.IDate >= CONVERT(DATE, '1/1/2020')
  AND I.IDate < CONVERT(DATE, '1/31/2020')

您正在跨服務器的事務中進行分布式聯接。 您非常希望該連接在一台服務器的內存中運行。 網絡比 RAM 慢得多。

我記得因為這樣的事情重新啟動了服務器。 進展是 - 嘗試終止進程,嘗試重新啟動 dtc,嘗試重新啟動實例,嘗試重新啟動服務器。

  1. 您是否需要兩個表中的所有列?
  2. 通常從 [Schema].[OtherTableFromLocalHost] 中選擇多少條記錄?

如果這是在大表所在的位置執行的,我會將較小的表加載到本地臨時表中。 然后我會使用本地事務來進行連接。 你可以試着用大桌子做這個。 您需要為 1.5 億條記錄留出空間。 它可能會工作得更快。

另一台服務器上是否有鏈接到此服務器的服務器? 在遠程查詢中,您可以使用 WHERE 子句將 [Schema].[OtherTableFromLocalHost] 中的 IdColumn 加載到該服務器上的臨時表。 然后在那里加入。 然后將數據取回臨時表。 對臨時表執行任何需要的連接,然后插入到最終目標中。

對於一個過程,我確實創建了一個值的 xml 文檔以傳遞到遠程服務器。 遠程服務器加入 xml(節點內容)以獲取所需的數據,而無需分布式連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM