2015-02-11 91 views
1

我有一個數百萬記錄表格,其中定義了一個整數主鍵。 我也有「黑名單」中沒有數以百萬計的ID。它們存儲在內存中(從磁盤上的文件讀取)。SQL Server獲取增量項目

我必須選擇不在黑名單中的記錄,即所有記錄的ID不在我的黑名單中。

我解決了這個問題,使用臨時表(單列:ID)插入不需要的ID,然後選擇其ID不在此表中的所有記錄。

我最關心的是性能:

  1. 插入如此多的紀錄臨時表。

  2. 選擇不在臨時表中的項目。

編輯 在我使用的是臨時表像這樣的時刻:

  1. 創建臨時表與單個列(ID)
  2. 填充的ID
  3. 臨時表
  4. 在列
  5. 上創建非聚簇索引
  6. 使用類似於此的查詢獲取增量項:

從MYTABLE米選擇m.id其中m.id沒有(從#tempTable seelct ID)

+0

「黑名單」文件是靜態的嗎?如果是這樣,你可以添加一個「BIT」列,並將ID標記在大的永久表中。如果「黑名單」文件不是靜態的....那麼文件格式是什麼?如果是csv或固定寬度的字段,您可以跳過第1步並通過OPENROWSET從黑名單文件中讀取ID。 – DMason 2015-02-11 14:01:40

+0

我看不到臨時表的大小有問題,但由於您沒有提供任何性能統計信息,因此很難評估。你能向我們展示你的查詢,或者它的簡化版本嗎?看看你是如何排除記錄,通過連接,是否存在,(...)子句等,這將是有用的。此外,你的臨時表創建可能是有用的看到。也許索引是有用的? – Tanner 2015-02-11 14:09:07

+0

@DMason否,黑名單不是靜態的,它是動態獲取的。此外,該列表是在我的應用程序服務器,而sql服務器運行在單獨的遠程sql服務器機器上,所以我不能可靠地從磁盤讀取數據 – Adi 2015-02-11 21:24:51

回答

0

你們這裏最好的辦法是將列添加到標誌每一行是否被列入黑名單或不(例如:將其稱爲isBlockListed),並保持該列最新。

您也可以將非聚集索引添加到此標誌,以便快速選擇您的數據,其中isBlockListed = ture/false。