table1
----------------------
field1 field2 field3 ...
----------------------
主键为:field1 field2
数据量比较大:约300万想从table1里查询记录,现已知道field1(m个)和field2(n个)的集合
field1→1,2,3,4,...,1000
field2→a,b,c,d,...,z现在有两种方法

SELECT * FROM table1 
WHERE 1=1
AND field1 IN ('1','2','3',...'1000')
AND field2 IN ('a','b','c',...'z')②
用for循环执行m*n次,每次执行:
SELECT * FROM table1 
WHERE 1=1
AND field1 = m
AND field2 = n
最后将每次执行的结果合并。这两种做法效率上哪个好。或者有没有更好的方法。
感谢大家提供意见。

解决方案 »

  1.   

    这两种方法显然都不是什么好方法。
    不如建一张表tmp_f1(field1 varchar(4) not null primary key), tmp_f2(field2 char(1) primary key);
    ('1', ...., '1000')以及('a', ....'z')分别都insert进去这表只需要建一次SELECT t1.* FROM table1 t1, tmp_f1 f1, tmp_f2 f2 where t1.field1 = f1.field1 and t1.field2 = f2.field2当然table1的field1和field2提前要建好索引。
      

  2.   


    with t1 as (select level as lv1 from dual connect by level <1001), --这里是构造了1--1000的数据列
    t2 as (select chr(lv) as lv2
      from (select level as lv
              from dual
            connect by level < 123
            minus
            select level as lv from dual connect by level < 97)
            )        --这里是构造了 a--z的数据集合
    select t.*
      from table1 t
     inner join t1 on t.field1 = t1.lv1
     inner join t2 on t.field2 = t2.lv2 --通过关联 得出结果集其实您的集合不一定是1--1000,和a--z,我只是按您举出个例子来构造SQL而已。
    循环,是尽量不建议用的。除非你实在想不出好的集合方法。至于要建立什么索引,这个太明显了,自己研究,哈哈。——300W,数据量不大,应该无什么问题
    PS:以上是个人娱乐而写,望各位大虾见谅。