我有兩個大型表,每個大約有1億條記錄,恐怕我需要在兩個表之間執行內部連接。現在,兩張桌子都很簡單。這裏的介紹:SQL:內部連接兩個大型表
生物實體表:
- BioEntityId(INT)
- 名稱(nvarchar的4000,雖然這是一個矯枉過正)
- TYPEID(INT)
臨時股東大會表(一個附配表,實際上得到的本體導入操作的):
- EMGId(INT)
- PID(INT)
- 名稱(nvarchar的4000,雖然這是一個矯枉過正)
- TYPEID(INT)
- 上次更改時間(日期)
我需要獲取一個匹配的名稱,以便將BioEntityId與駐留在EGM表中的PId相關聯。最初,我試圖用單個內部連接完成所有事情,但查詢似乎耗時過長,並且數據庫的日誌文件(以簡單恢復模式)設法咀嚼所有可用磁盤空間(超過200 GB,當數據庫佔用18GB)並且等待兩天後查詢會失敗,如果我沒有弄錯。我設法防止日誌增長(現在只有33 MB),但查詢已經連續運行了6天,看起來不會很快停止。我在一個相當不錯的電腦上運行它(4GB內存,Core 2 Duo(E8400)3GHz,Windows Server 2008,SQL Server 2008),我注意到計算機每30秒偶爾會發生一次卡塞(給或採取)幾秒鐘。這使得它很難用於其他任何事情,這真的讓我很緊張。
現在,這裏的查詢:
SELECT EGM.Name, BioEntity.BioEntityId INTO AUX
FROM EGM INNER JOIN BioEntity
ON EGM.name LIKE BioEntity.Name AND EGM.TypeId = BioEntity.TypeId
我手動設置一些指標了; EGM和BioEntity都有一個包含TypeId和Name的非聚集覆蓋索引。然而,查詢運行了五天,也沒有結束,所以我試着運行數據庫優化顧問來讓這件事情起作用。它建議刪除我的舊索引並創建統計信息和兩個聚集索引(每個表上只有一個,只包含TypeId,我覺得它很奇怪 - 或者只是簡單的愚蠢 - 但我仍然放棄它)。
已現在正在運行6天,我仍然不知道該怎麼辦...... 任何想法的傢伙?我怎樣才能讓這個更快(或者至少是有限的)?
更新: - 好吧,我已經取消了查詢,並重新啓動服務器,以獲得OS重新啓動和運行 - 我重新運行工作流程與您建議的修改,特別是裁剪爲nvarchar領域的尺寸小得多,併爲「=」交換「like」。這是要花至少兩個小時,所以我會在
更新2晚些時候發佈進一步的更新(格林尼治標準時間下午1:00時,18/11/09): - 估計執行計劃揭示了67%的成本關於表掃描,然後是33%的散列匹配。接下來是0%的並行性(這不奇怪嗎?這是我第一次使用估計的執行計劃,但這個特殊的事實剛剛解除了我的眉毛),0%的散列匹配,0%的並行性,0%的頂級,0 %表插入,最後再選擇0%。似乎索引是垃圾,正如預期的那樣,所以我將製作手動索引並丟棄糟糕的建議索引。
只是好奇...爲什麼你需要100+萬行回來,你有什麼打算用這些數據做? – 2009-11-17 16:22:56
4k名稱字段中存儲的最大值是多少?如果它實質上小於4k,那麼在每個表格中縮小尺寸。 – 2009-11-17 16:23:14
生物信息學...:] – 2009-11-17 16:23:24