问题描述
我有2000个号码(Uniq主键)。我想获取电话号码的联系方式。我的数据库是Oracle。
我在查询中使用IN(bla,bla)
。因此工作缓慢。
我的查询示例:
SELECT p.*,t.*
FROM PERSONEL p
LEFT OUTER JOIN CODE_TITLE t ON t.Id = p.TitleId
WHERE ID IN(1,2,....,2000)
查询运行时大约需要10到12秒。
是否可以使用一种方法来代替IN(bla,bla)
?您可以举例说明吗?
解决方法
将您的数字(或实际数字)放入表格中。我们称之为LIST_TABLE。然后
SELECT p.*,t.*
FROM PERSONEL p
LEFT OUTER JOIN CODE_TITLE t ON t.Id = p.TitleId
WHERE ID IN(select list_id from list_table)
LIST_TABLE的表的类型(正常,GTT,外部)将取决于值的来源以及加载它们的最佳机制。
,您可以使用xmltable('1 to 2000')
作为派生表,以生成从1开始到2000递增1的整数集:
SELECT p.*,t.*
FROM PERSONEL p
LEFT JOIN CODE_TITLE t ON t.Id = p.TitleId
WHERE Id IN ( SELECT TO_NUMBER(column_value) FROM xmltable('1 to 2000') )
P.S。实际上使用WHERE ID BETWEEN 1 AND 2000
就足以在CODE_TITLE.ID
上创建索引,以提高查询性能。
create or replace type myTcType as table of number(16,0);
create or replace function in_list(p_string in varchar2) return myTcType
as
l_data myTcType := myTcType();
l_string long default p_string || ',';
l_n number;
begin
loop
exit when l_string is null;
l_data.extend;
l_n := instr(l_string,',');
l_data(l_data.count) := substr(l_string,1,l_n-1);
l_string := substr(l_string,l_n+1);
end loop;
return l_data;
end;
select * from table(cast(in_list('1,2,3,4,5') as myTcType));