如何解决全表扫描?

[复制链接]
查看11 | 回复8 | 2016-1-7 20:57:31 | 显示全部楼层 |阅读模式
视图1:create or replace view accoinfotemp1 as
select
SYSDATE AS C_MODIFYDATE,
to_char(a.CUSTID) as c_custno,
from CRM_PERSONAL_CUST b,CRM_ACCOINFO a
where TO_CHAR(b.CUSTID)=TO_CHAR(a.CUSTID )

视图2:create or replace view accoinfotemp2 as
select
SYSDATE AS C_MODIFYDATE,
to_char(A.CUSTID) as c_custno,
from CRM_ORG_CUST d,CRM_ACCOINFO A
whereto_char(d.CUSTID)=to_char(A.CUSTID)

视图3:create or replace view customer.accoinfotemp as
select* from accoinfotemp1
union all
select* from accoinfotemp2
表的说明:
CRM_PERSONAL_CUST有大约90万记录,CUSTID是num型
CRM_ACCOINFO有大约100万记录,custid是num型。
这两个表上面分别建了custid索引和to_char(custid)索引。
sql语句1:
SELECT C_custno FROM ACCOINFOTEMP WHERE C_custno = '23223';
速度很快,使用了to_char(custid)索引
sql语句2:
SELECT C_CUSTNOFROM ACCOINFOtemp WHERE C_custno in
(SELECT C_custno FROM ACCOINFOTEMP WHERE C_custno = '23223')
速度很慢(5-6秒),在acconinfo上使用了全表扫描。
如果将视图1、2中to_char(custid)改为custid,执行速度很快。
外层视图中死活不使用函数索引。
请问各位如何解决这个问题,提高查询效率?
谢谢!
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
自己顶一下,补充:所有涉及到的表和索引均做过analyse。
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
如果将视图1、2中to_char(custid)改为custid,执行速度很快,TO_CHAR(b.CUSTID)=TO_CHAR(a.CUSTID
-----------------
为什么要用to_char() ?
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
之所以使用to_char,是因为这几张表是已经开发好的系统建立的,后来购买的商用系统要使用原来的数据,没有custid字段,对应的字段是custno,并且类型是varchar
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
各位老大,帮帮忙吧!
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
ORACLE頭痛的事還真不少
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
由于你在列custid上使用了函数,这样就使索引失效,执行了全表扫描,所以很慢。
解决办法:可以考虑建立函数索引。
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
最初由 renfu999 发布
[B]由于你在列custid上使用了函数,这样就使索引失效,执行了全表扫描,所以很慢。
解决办法:可以考虑建立函数索引。 [/B]


顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
回复

使用道具 举报

千问 | 2016-1-7 20:57:31 | 显示全部楼层
已经建立了函数索引。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行