Sql-Server
用 BETWEEN 代替 JOIN
我有兩個表要根據 BETWEEN 條件加入。
Table 1
小是小,大約有 1500 條記錄,Table 2
有 4000 萬條記錄。表 1 只有一列具有數據類型bigint
和Table2
8 列。我需要在 BETWEEN 條件下在這兩個表之間加入。我嘗試關注,但它變得緩慢,只有 1 條記錄
Table1
和 4000 萬條記錄Table2
。詢問:
SELECT t1.cola AS [InputValue],t2.cola,t2.colb,t2.colc,t2.cold,t2.code FROM table2 t2 INNER JOIN table1 t1 ON t1.cola BETWEEN t2.cola AND t2.colb ;
索引:
CREATE NONCLUSTERED INDEX NCIX_Table1_Cola ON table1(cola)
CREATE NONCLUSTERED INDEX NCIX_Table2_Col_a_b ON table2(cola,colb)
上面的查詢只用了 30 秒,只記錄了 1 條記錄
table1
和 4000 萬條記錄table2
。如前所述,我將獲得 1500 多條記錄,table1
速度會越來越慢。需要做中間索引或適當索引的任何替代方法嗎?編輯:添加了範例數據。
表格1:
cola --------------- 12 145 34 90 88990 987611 55 ... .. ......1500 rows
表2:
cola colb colc cold cole ------------------------------------- 0 10 c1 d1 e1 11 20 c2 d2 e2 21 40 c3 d3 e3 41 60 c4 d4 e4 61 100 c5 d5 e5 101 1000 c6 d6 e6 1001 10000 c7 d7 e7 10001 200000 c8 d8 e8 ...... ......40 millions records
預期結果:
InputValue cola colb colc cold cole -------------------------------------------------- 12 11 20 c2 d2 e2 145 101 1000 c6 d6 e6 34 21 40 c3 d3 e3 .....
SQL小提琴:連結
我遇到過類似的問題 - 問題是 sql 不“知道” cola 和 colb 是 range 並且下一行的 cola 總是比目前行 colb 大,所以 between 不會有太大幫助:什麼時候會找到第一個匹配的可樂,它也會繼續檢查其他人。我建議使用交叉應用的查詢來查找
max(table2.cola) <= table1.cola
然後驗證添加這樣的where table2.colb >= table1.cola
東西SELECT t1.cola AS [InputValue] ,t2.cola ,t2.colb ,t2.colc ,t2.cold ,t2.code FROM table1 t1 CROSS APPLY ( SELECT TOP 1 t2.cola ,t2.colb ,t2.colc ,t2.cold ,t2.code FROM table2 t2 WHERE t1.cola >= t2.cola AND t1.cola <= t2.colb ORDER BY t2.cola DESC ) t2;