【发布时间】:2017-04-02 03:37:15
【问题描述】:
我正在对 200 万条记录执行以下查询 (oracle11g)。大约需要 2.2 秒。
我的查询:
select SUBSCRIBER_NUM, SUBSCRIBER_STATUS, P_ID
from C_S_FORWARD_INFO
where '07052620' LIKE SUBSCRIBER_NUM || '%'
and SCP_VER = 1
下面是我的桌子。
CREATE TABLE C_S_FORWARD_INFO
(
SUBSCRIBER_NUM VARCHAR2(30 BYTE) NOT NULL,
P_ID NUMBER,
SUBSCRIBER_STATUS NUMBER(1,0) DEFAULT 0 NOT NULL,
ACCOUNT_NUMBER INTEGER NOT NULL,
MAJOR_VERSION_ID NUMBER(10,0) DEFAULT 1 NOT NULL,
MINOR_VERSION_ID NUMBER(10,0) DEFAULT 1 NOT NULL,
SCP_VER NUMBER(1,0) DEFAULT 0 CHECK (SCP_VER IN (0,1)),
);
ALTER TABLE C_S_FORWARD_INFO ADD CONSTRAINT C_S_FORWARD_INFO_PK
PRIMARY KEY (SUBSCRIBER_NUM,ACCOUNT_NUMBER,MAJOR_VERSION_ID, MINOR_VERSION_ID);
数据库记录(例如,实际上它有 200 万条记录)
Row 1 => 07052620,1,1,10, 1, 1, 1;
Row 2 => 0705262,2,1,10, 1, 1, 1;
Row 3 => 070526,3,1,10, 1, 1, 1;
Row 4 => 070526200001,4, 1,10, 1, 1, 1;
Row 5 => 07052,5,1,10, 1, 1, 1;
......
预期结果:第 1 行(我通过上面的查询得到这个,逻辑:从最长匹配开始,直到 '07052620')
如何优化上述查询。或编写任何其他逻辑以在.2 秒内获得预期结果。在我的查询中,'07052620' 是作为存储过程输入的动态数字。
20/11 - 更新:
我在下面尝试过(VAR_CALLING_NUM = 07052620):
while var1<=len LOOP
temp1 := SUBSTR(VAR_CALLING_NUM, 1, var1);
temp1 := concat('''',temp1);
temp1 := concat(temp1,'''');
temp6 := temp6 || temp1 || ',' ;
var1:=var1+1;
END LOOP;
temp6 := SUBSTR(temp6, 1,length(temp6)-1);
select SUBSCRIBER_NUM, SUBSCRIBER_STATUS, P_ID from C_S_FORWARD_INFO where SUBSCRIBER_NUM IN ( temp6 ) and SCP_VER = 1 order by length(subscriber_num) desc;
但这并没有给我结果。看起来查询没有动态采用 temp6。请帮忙
【问题讨论】:
-
您当前的查询存在逻辑问题,此外您还有优化问题。你想解决哪一个?
-
您希望表中满足这些条件的行的比例是多少?
-
另外,数据集中的订户号码有多少个唯一值,输入号码的变化有多大?会不会是“0”?还是总是至少有这么多字符?
-
@David Aldridge :查询应该给我第 1、2、3 和第 5 行。它不应该给我第 4 行。目前它没有给出任何记录。我怀疑我在 'IN' 中动态传递的 temp6,查询没有接受它。但是,temp6 是“'0', '07', '070', '0705', '07052', '070526', '0705262', '07052620'”。但不确定查询是否是动态的,可能是我做错了(SUBSCRIBER_NUM IN(temp6))。请帮忙。
-
在实际情况下输入的数字不会是0。它最多可以是30位数字。但是,没有最低限制。
标签: sql oracle stored-procedures database-performance