如何解决如何加快oracle查询? 在bla bla中
我有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));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。