如何加快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));

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...