Sql-Server

用 BETWEEN 代替 JOIN

  • November 14, 2019

我有兩個表要根據 BETWEEN 條件加入。

Table 1小是小,大約有 1500 條記錄,Table 2有 4000 萬條記錄。表 1 只有一列具有數據類型bigintTable28 列。我需要在 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 ;

索引:

  1. CREATE NONCLUSTERED INDEX NCIX_Table1_Cola ON table1(cola)
  2. 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;

引用自:https://dba.stackexchange.com/questions/253232