2012-03-13 87 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之间的差异与你如何使用它们完全不同,我会感到惊讶。