有一个ADDRESS表,表中大概有2百多万条记录.
这个表建了多个索引,其中有一个是:
CREATE INDEX ADDRESS_PLSQL ON ADDRESS
(LANG_ID, COMPANY_NO, EVENT_ID, DEM_COM_NO, COMPANY_IND, DEFAULT_IND)
我用外面一条sql:
SELECT NVL (city, '')
FROM ADDRESS
WHERE LANG_ID = 0
AND COMPANY_NO = 51000120
AND EVENT_ID = 202
AND DEM_COM_NO = '10112197'
AND COMPANY_IND = 'T'
AND DEFAULT_IND = 'T'
它查询1秒都不要!!!而我在一个存储过程用
.......
DBMS_OUTPUT.PUT_LINE('START');
DBMS_OUTPUT.PUT_LINE(TO_CHAR( SYSDATE,'dd-MM-yyyy HH:MI:ss' ));
begin
SELECT NVL(CITY, '')
INTO v_CITY
FROM ADDRESS
WHERE LANG_ID = glangid
AND COMPANY_NO = gcompanyno
AND EVENT_ID = geventid
AND DEM_COM_NO = v_pub_company_no
AND COMPANY_IND = 'T'
AND DEFAULT_IND = 'T';
EXCEPTION
WHEN OTHERS THEN
v_CITY:='';
end; DBMS_OUTPUT.PUT_LINE('END');
DBMS_OUTPUT.PUT_LINE(TO_CHAR( SYSDATE,'dd-MM-yyyy HH:MI:ss' ));..........
调用时它显示我用了25秒的时间!!!!!
这个表建了多个索引,其中有一个是:
CREATE INDEX ADDRESS_PLSQL ON ADDRESS
(LANG_ID, COMPANY_NO, EVENT_ID, DEM_COM_NO, COMPANY_IND, DEFAULT_IND)
我用外面一条sql:
SELECT NVL (city, '')
FROM ADDRESS
WHERE LANG_ID = 0
AND COMPANY_NO = 51000120
AND EVENT_ID = 202
AND DEM_COM_NO = '10112197'
AND COMPANY_IND = 'T'
AND DEFAULT_IND = 'T'
它查询1秒都不要!!!而我在一个存储过程用
.......
DBMS_OUTPUT.PUT_LINE('START');
DBMS_OUTPUT.PUT_LINE(TO_CHAR( SYSDATE,'dd-MM-yyyy HH:MI:ss' ));
begin
SELECT NVL(CITY, '')
INTO v_CITY
FROM ADDRESS
WHERE LANG_ID = glangid
AND COMPANY_NO = gcompanyno
AND EVENT_ID = geventid
AND DEM_COM_NO = v_pub_company_no
AND COMPANY_IND = 'T'
AND DEFAULT_IND = 'T';
EXCEPTION
WHEN OTHERS THEN
v_CITY:='';
end; DBMS_OUTPUT.PUT_LINE('END');
DBMS_OUTPUT.PUT_LINE(TO_CHAR( SYSDATE,'dd-MM-yyyy HH:MI:ss' ));..........
调用时它显示我用了25秒的时间!!!!!
解决方案 »
- 如何远程备份oracle数据库到本地 ?
- 请问哪里有Oracle10.2.0.1的补丁下载?
- 冷备份的问题
- 简单的存储过程中使用参数或变量的问题
- 一个很复杂的sql语句,请教高手
- 怎样级联删除数据库记录?
- 在oracle9i里创建了一个info的表,放在system方案,system表空间中,在sqlplus中用info这个表名直接可以用,但是用c#连接时,只用info好
- 请推存 几本书 (pl/sql)的,还看看问题
- 关于用SQLLDR 导入数据的问题?
- 记录 312: 被拒绝 - 表 BSA_20160103 的列 OB_INFO 出现错误。 多字节字符错误。
- 我想问一下 oracle7.3的数据怎么可以导入到oracle9里面?
- DBA高手求救 :oracle9.0.2.1.0 数据库紧急恢复
oracle里面 ''=null为where条件中使用的列创建索引
AND COMPANY_NO = gcompanyno
AND EVENT_ID = geventid
AND DEM_COM_NO = v_pub_company_no 这里面的glangid是多少呢?gcompanyno又等于多少呢>
nvl(city,'为空')
LANG_ID = 0
COMPANY_NO = 51000120
EVENT_ID = 202
DEM_COM_NO = '10112197'
,
索引我已经建了
问题就是同样的SQL,在不同的地方为什么用的时间这么大的差别呢????
如果的确是这句话有性能问题,用以下的方法试试
1.如果没有用到索引的话,可以选重建索引,再把存储过程重建一下。
2.如果你使用的是CBO(基于代价的优化器),将表重新做一下分析。