2012-03-13 88 views
3

我回來了,因爲我再次需要你的幫助!
以下哪一項是更好的選擇?Oracle - 最好的句子:IN(),like,REGEXP_LIKE,otherone

的問題是:
我有一個表myTable['DateYYYYMMDD','field1', 'field2', 'field3', 'MyField'],每天有人插入多條記錄。

我要創建 2(快)的觀點myView1,在過去30天內創建myView2是選擇記錄(從myTable),並用不同的MYFIELD值。

我已經發現了一些不同的簡單的解決方案,我想知道這是最快:

解決方法1

--myView1: 
select field1, field2, ...., fieldn, MYFIELD 
    from myTable 
where DateYYYYMMDD > sysdate -30 
    and MYFIELD in ('65643L', '65643L174', '65643L8N', 
        ... 
        '6564L7174', '6564L78N','6564L78N_2O15', 
        ... 
        '6564L78N3226T2_2O15', '6564L78N8N322', 
        '6564L78N6T2', '6564L78N6T2_2O15', 
        '6564L7-NOTT1-6T2', '6564L76T2', 
        ... 
        '6563XP8N322', '6563XP8N322_2O15', 
        '6563XP8N3226T2', '6563XP8N3226T2_2O15', 
        '6563XP8N6T2', '6563XP-NOTT1-6T2', 
        '6563XP6T2', '9563XPT1', 
        '9563XPT1_2O15', 
        ... 
        '9566UB', '9566UB_2O15', 
        '9566UB174', '9566UB8N', 
        '6566UB8N_2O15', '6566UB8N174', 
        '6566UB8N322', 
        ...) 


myView2: 
select field1, field2, ...., fieldn, MYFIELD 
    from myTable 
where DateYYYYMMDD > sysdate -30 
    and MYFIELD in ('9P26_B', '9P26_BN', 
        '9P26_8N', 
        ... 
        '9P26_8NN', '9P26_2O158N9', 
        '556_B', '556_8N', 
        ... 
        '5566NP4P', '696N65T', 
        '696N65T6T2', 
        ... 
        '696W1P_B', '696W1P_8N') 

--solution 2

--myView1: 
select field1, field2, ...., fieldn, MYFIELD 
    from myTable 
where DateYYYYMMDD > sysdate -30 
    and (MYFIELD like '656%' or MYFIELD like '956%') 

--myView2: 
select field1, field2, ...., fieldn, MYFIELD 
    from myTable 
    where DateYYYYMMDD > sysdate -30 
    and (MYFIELD like '9P26%' 
     or MYFIELD like '556_%' 
     or MYFIELD like '5566%' 
     or MYFIELD like '696%') 

--solution 3

--myView1: 
select field1, field2, ...., fieldn, MYFIELD 
    from myTable 
where DateYYYYMMDD > sysdate -30 
    and (REGEXP_LIKE(MYFIELD, '^656') or REGEXP_LIKE(MYFIELD, '^956')) 

--myView2: 
select field1, field2, ...., fieldn, MYFIELD 
    from myTable 
where DateYYYYMMDD > sysdate -30 
    and (REGEXP_LIKE(MYFIELD, '^9P26') 
     or REGEXP_LIKE(MYFIELD, '^556_') 
     or REGEXP_LIKE(MYFIELD, '^5566') 
     or REGEXP_LIKE(MYFIELD, '^696')) 

我希望解釋我需要什麼,如果有一個更好的解決方案,請建議吧! 非常感謝!

回答

4

爲什麼不只是使用LIKE?

--myView1: 
select field1, field2, ...., fieldn, MYFIELD 
from myTable 
where DateYYYYMMDD > sysdate -30 
and 
MYFIELD like '656%' or MYFIELD like '956%' 

REGEXP功能強大,但並不快。

+0

是一個簡單而不錯的選擇!我搜索更快......是'更快'的'IN'句子? – BellaVita 2012-03-13 16:40:29

+2

我不知道,但我想象IN和LIKE的性能大致相同 - 兩者都可以在適當的情況下使用索引掃描。 LIKE更強大,如果你真的想要所有的匹配,因爲你的IN列表可能很容易缺少一個值。 – 2012-03-13 16:45:29

+0

如果這確實是一個時間關鍵的應用程序,而您已經有問題,那麼您可以考慮使用物化視圖,但如果您沒有性能問題,我不會那樣做。 – Eggi 2012-03-13 17:59:09

1

像@託尼安德魯斯說,我會避免REGEXP_LIKE選項,因爲你不需要任何它提供的LIKE沒有的功能。

擁有一個合適的索引會比IN和LIKE之間的切換更有幫助。理想情況下,您將在DateYYYYMMDD,MYFIELD上有一個索引。如果你這樣做,如果IN/LIKE之間的差異與你如何使用它們完全不同,我會感到驚訝。