有关oracle性能(索引)问题,急!!
我连接两个表时总是有一个表的索引没用上(用plan_table分析),两个表中的连接字段的索引我都重建过了,两个表我也重新分析过了(analyze 。。。 compute statistics),请教一下我想使两个索引都用上,我该怎么办? 问题点数:23、回复次数:41Top
1 楼9Thoughts(一片绿洲)回复于 2001-11-12 11:22:08 得分 0
能不能把你的字段和索引说得更详细些?Top
2 楼Haiwer(海阔天空)回复于 2001-11-12 12:03:53 得分 0
在连接的时候,一般用上一个表的索引就够了,因为你的查询往往总有一个表是要用其他字段来确定连接的字段的,那样这个表就不必使用连接的字段的索引了。
很难表达,也许言不达意!Top
3 楼Haiwer(海阔天空)回复于 2001-11-12 12:07:18 得分 0
总的意思:不必钻牛角尖要求两个索引都用到,关键看查询速度!Top
4 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 12:10:33 得分 0
一个是用户表(customer),他的索引字段是cust_id(且是主键,索引名称是pk_customer),另一个是信息表(infomation),他的索引字段是用户表的cust_id字段(索引名是fk_cust).我用plan_table分析的语句是select count(*) from customer c,info_mation i where c.cust_id=i.cust_id;Top
5 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 13:07:03 得分 0
冤枉呀!就是因为速度慢,我才找原因的,发现索引没用上呀。Top
6 楼KingSunSha(弱水三千)回复于 2001-11-12 13:16:48 得分 0
试一下用HINT吧
select /*+ INDEX(information idx_info_cust_id) */
count(*)
from customer c,info_mation i
where c.cust_id=i.cust_id;
Top
7 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 13:58:56 得分 0
给他指定索引后也没用,他还是提示:TABLE ACCESS FULL CUSTOMER ANALYZED1,请再给点指导。Top
8 楼KingSunSha(弱水三千)回复于 2001-11-12 14:11:42 得分 0
索引名是fk_cust? 听起来不象索引的名称,倒象一个外健,这到底是索引还是CONSTRAINT?Top
9 楼Haiwer(海阔天空)回复于 2001-11-12 14:20:07 得分 0
To: KingSunSha(弱水三千)
很细心嘛....Top
10 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 14:26:07 得分 0
是逻辑外键,但在数据库中不是外键,确实只是个索引。Top
11 楼KingSunSha(弱水三千)回复于 2001-11-12 14:36:59 得分 0
select /*+ INDEX(information FK_CUST) */
count(*)
from customer c,info_mation i
where c.cust_id=i.cust_id;
用HINTS指定INDEX而系统忽略的话,只有一种解释那就是这个INDEX不存在.
所以我只能认为是INDEX设置的问题.Top
12 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 17:23:31 得分 0
但他显示的是customer表的全表扫描呀Top
13 楼Haiwer(海阔天空)回复于 2001-11-12 17:29:44 得分 0
customer表记录不会很多吧,有多少?Top
14 楼Haiwer(海阔天空)回复于 2001-11-12 17:34:24 得分 0
select count(*)
from customer c,info_mation i
where c.cust_id=i.cust_id;
应该是有一个表要做全表扫描(记录少的表),才能计算出count(*)
如果customer 、info_mation两表有外键关系,可以把语句改成
select count(*) from info_mation
这样会快些。
Top
15 楼KingSunSha(弱水三千)回复于 2001-11-12 17:35:29 得分 0
你能不能把INDEX DROP掉重建? 同时换一个名字
我还是认为你的INDEX有问题Top
16 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 17:36:29 得分 0
customer和infomation表都有60几万条数据,Top
17 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 17:53:42 得分 0
影响两个表的连接速度的主要有哪些因素,该如何调整啊,现在两个表都有60几万的数据,查询速度跟蜗牛似的,急死我了。Top
18 楼KingSunSha(弱水三千)回复于 2001-11-12 17:57:40 得分 0
我搞错了,原来对是CUSTOMER表做全表扫描
那你改一下HINTS看看强制索引能不能用上
CUSTOMER
select /*+ INDEX(CUSTOMER pk_customer) */
count(*)
from customer c,info_mation i
where c.cust_id=i.cust_id;
Top
19 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 18:03:59 得分 0
是不是计算count(*)一定要扫描其中的一个表呀,我把customer表的主键重建了以后,他现在对information表进行全表扫描了,但速度还是很慢,我该怎么办呀?Top
20 楼KingSunSha(弱水三千)回复于 2001-11-12 18:05:58 得分 0
实在不行你把两个表的DLL都贴上来(包括INDEX),我在家里测试一下. 我就不信做不到Top
21 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 18:25:15 得分 0
多谢了,弱水三千!现在我在where条件里加了个条件,发现两个索引都能用了,显示如下:
SELECT STATEMENT CHOOSECost = 584
SORT AGGREGATE 1
NESTED LOOPS 1
TABLE ACCESS BY INDEX ROWID CUSTOMER ANALYZED1
INDEX RANGE SCAN infomation_IX16(所加条件字段的索引名) 1
INDEX RANGE SCAN fk_cust 2
但是查询速度很慢,我该怎么办呀?
Top
22 楼MountLion(闷头睡)回复于 2001-11-12 18:48:37 得分 0
好像count(*)是要做全表扫描的,不用想了,换个法子吧?Top
23 楼ziyouzhuangtai(自由状态)回复于 2001-11-12 19:28:51 得分 0
我是说这两个表连接以后,查询非常慢,有没有什么方法改进呀!Top
24 楼KingSunSha(弱水三千)回复于 2001-11-12 21:02:59 得分 0
我做了一下测试,结果很正常(两个表各有10万条数据)
CREATE TABLE customer
(
cust_id NUMBER(10) NOT NULL,
cust_name VARCHAR2(100)
)
/
ALTER TABLE customer
ADD CONSTRAINT pk_customer PRIMARY KEY (cust_id)
/
CREATE TABLE information
(
cust_id NUMBER(10),
info1 VARCHAR2(100),
info2 VARCHAR2(100)
)
/
CREATE INDEX idx_info_cust_id
ON information
( cust_id )
/
begin
for i in 1..100000 loop
insert into customer
values (i,'name' || to_char(i));
insert into information
values (i,'col1-'|| to_char(i),'col2-'||to_char(i));
end loop;
end;
/
COMMIT
/
做完表分析以后,对以下的SQL EXPLAIN PLAN,
select /*+index(information idx_info_cust_id)*/
count(*)
from customer c,information i
where c.cust_id = i.cust_id;
SQL> SELECT LPAD(' ',2*LEVEL)||
2 Operation||' '||Options||' '||
3 decode(Object_Owner,Null,'',Object_Owner||'.'||Object_name)||' '||
4 decode(Optimizer,NULL,'',Optimizer) Q_PLAN
5 FROM plan_table
6 connect by prior ID = Parent_id and statement_id = 'XXX'
7 start with ID = 0 and statement_id = 'XXX';
Q_PLAN
--------------------------------------------------------------------------------
SELECT STATEMENT CHOOSE
SORT AGGREGATE
NESTED LOOPS
INDEX FAST FULL SCAN KNUT.IDX_INFO_CUST_ID ANALYZED
INDEX UNIQUE SCAN KNUT.PK_CUSTOMER ANALYZED
测试环境:ORACLE8.16+WIN2000 PROTop
25 楼ziyouzhuangtai(自由状态)回复于 2001-11-13 10:13:18 得分 0
多谢弱水三千了,但同样的步骤我的Q_PLAN如下:
SELECT STATEMENT CHOOSE
SORT AGGREGATE
MERGE JOIN
INDEX FULL SCAN PK_CUSTOMER ANALYZED
SORT JOIN
TABLE ACCESS FULL INFOMATION ANALYZED
环境是:ORACLE8.0.5 + SOLORIAS5.8 记录条数是60多万条。
这是我的DDL:
create table CUSTOMER
(
SCUSTOMER_ID VARCHAR2(16) not null,
SREGION_ID VARCHAR2(8) null ,
NORG_NUM NUMBER(10) null ,
SCUST_IDENTIFIER VARCHAR2(16) null ,
SCUST_CARD_NUM VARCHAR2(16) null ,
CCUST_TYPE CHAR(1) null ,
SGOLDCARD_NUM VARCHAR2(24) null ,
SGUARANTEE_ID VARCHAR2(8) null ,
SAGREEMENT VARCHAR2(80) null ,
CDATA_SOURCE_TYPE CHAR(1) null ,
CSTATUS CHAR(1) null ,
CRETURN_FLAG CHAR(1) null ,
SCUST_NAME VARCHAR2(32) null ,
SCUST_UNIT VARCHAR2(64) null ,
SUNIT_FLAG CHAR(1) null ,
SADDRESS VARCHAR2(128) null ,
SZIP_CODE VARCHAR2(6) null ,
SAREA_NUM VARCHAR2(8) null ,
STELEPHONE1 VARCHAR2(32) null ,
STELEPHONE2 VARCHAR2(32) null ,
STELEPHONE3 VARCHAR2(32) null ,
STELEPHONE4 VARCHAR2(32) null ,
SEMAIL VARCHAR2(32) null ,
DPURCHASE_DATE DATE null ,
DGUARANTEE_DATE DATE null ,
NPURCHASE_PRICE NUMBER(12,4) null ,
SINVOICE_NUM VARCHAR2(16) null ,
SSALES_UNIT_ID VARCHAR2(8) null ,
SSALES_UNIT_NAME VARCHAR2(64) null ,
DSERV_DATE DATE null ,
SSERV_UNIT_ID VARCHAR2(8) null ,
SSERV_UNIT_NAME VARCHAR2(64) null ,
SPROD_ID VARCHAR2(20) null ,
SPROD_MODEL VARCHAR2(64) null ,
SPROD_BRAND VARCHAR2(4) null ,
SSERIAL_NUM1 VARCHAR2(20) null ,
SSERIAL_NUM2 VARCHAR2(20) null ,
SSERIAL_NUM3 VARCHAR2(20) null ,
SSERIAL_NUM4 VARCHAR2(20) null ,
DMADE_DATE1 DATE null ,
DMADE_DATE2 DATE null ,
DMADE_DATE3 DATE null ,
DMADE_DATE4 DATE null ,
SOPERATOR_ID VARCHAR2(8) null ,
TENTRY_DATETIME DATE null ,
SMODIFY_OPERATOR_ID VARCHAR2(8) null ,
TMODIFY_DATETIME DATE null ,
SMODIFY_REASON VARCHAR2(48) null ,
SATTRIBUTE1 VARCHAR2(16) null ,
SATTRIBUTE2 VARCHAR2(64) null ,
DDATE_ATTRIBUTE1 DATE null ,
NNUM_ATTRIBUTE1 NUMBER(10,2) null ,
SNOTE VARCHAR2(48) null ,
constraint PK_CUSTOMER primary key (SCUSTOMER_ID)
)
/
create table infomation
(
SSERV_RECORD_ID VARCHAR2(16) not null,
SCUSTOMER_ID1 VARCHAR2(16) null ,
SCUSTOMER_ID2 VARCHAR2(16) null ,
SSERVICE_CATEGORY_ID VARCHAR2(4) null ,
SINFO_RECORD_ID VARCHAR2(16) null ,
SRECORD_TYPE CHAR(1) null ,
SSERV_FORM_NUM VARCHAR2(16) null ,
SSETTLEMENT_NUM VARCHAR2(16) null ,
CCHARGE_TYPE CHAR(1) null ,
NORG_NUM NUMBER(10) null ,
TENTRY_DATETIME DATE null ,
SOPERATOR_ID VARCHAR2(8) null ,
SOPERATOR_NAME VARCHAR2(8) null ,
NPRINT_COUNT NUMBER(2) null ,
CDATA_SOURCE_TYPE CHAR(1) null ,
CSTATUS CHAR(1) null ,
DREQUEST_DATE DATE null ,
DSERV_DATE DATE null ,
DFINISH_DATE DATE null ,
SSERV_UNIT_ID VARCHAR2(8) null ,
SSERV_UNIT_NAME VARCHAR2(64) null ,
SSERV_WORKER1 VARCHAR2(8) null ,
SSERV_WORKER2 VARCHAR2(8) null ,
SWORK_CARD1 VARCHAR2(24) null ,
SWORK_CARD2 VARCHAR2(24) null ,
SSERV_COUNT NUMBER(4) null ,
SSERV_CODE VARCHAR2(4) null ,
SRESULT_CODE VARCHAR2(4) null ,
SREFLECT_ID VARCHAR2(8) null ,
SREFLECT_DESC VARCHAR2(80) null ,
SFAULT_ID VARCHAR2(8) null ,
SFAULT_DESC VARCHAR2(80) null ,
SMAINT_ID VARCHAR2(8) null ,
SMAINT_DESC VARCHAR2(80) null ,
SSERV_DESC1 VARCHAR2(80) null ,
SSERV_DESC2 VARCHAR2(80) null ,
SCUST_DESC1 VARCHAR2(80) null ,
NSERV_FEE1 NUMBER(12,4) null ,
NSERV_FEE2 NUMBER(12,4) null ,
NSERV_FEE3 NUMBER(12,4) null ,
NSERV_FEE4 NUMBER(12,4) null ,
NTOTAL_FEE NUMBER(12,4) null ,
CCALLBACK_FLAGA CHAR(1) null ,
CCALLBACK_FLAGB CHAR(1) null ,
CCALLBACK_FLAGC CHAR(1) null ,
SCHECK_OPERATOR VARCHAR2(8) null ,
DCHECK_DATE DATE null ,
SCHECK_RESULT_ID VARCHAR2(4) null ,
SCHECK_DESC VARCHAR2(80) null ,
SCHECK_OPERATOR1 VARCHAR2(8) null ,
SCHECK_OPERATOR2 VARCHAR2(8) null ,
SCHECK_OPERATOR3 VARCHAR2(8) null ,
DCHECK_DATE1 DATE null ,
DCHECK_DATE2 DATE null ,
DCHECK_DATE3 DATE null ,
SCHECK_ATTRIBUTE1 VARCHAR2(8) null ,
SCHECK_ATTRIBUTE2 VARCHAR2(8) null ,
SCHECK_ATTRIBUTE3 VARCHAR2(8) null ,
SATTRIBUTE1 VARCHAR2(16) null ,
SATTRIBUTE2 VARCHAR2(64) null ,
SATTRIBUTE3 VARCHAR2(64) null ,
DDATE_ATTRIBUTE1 DATE null ,
NNUM_ATTRIBUTE1 NUMBER(10,2) null ,
SNOTE VARCHAR2(48) null ,
constraint PK_INFOMATION primary key (SSERV_RECORD_ID)
)
/
关联字段是customer表的scustomer_id和infomation表的scustomer_id,索引比较多,我没有办法把它从数据库中的创建语句取出来。如有好的方法请告知,我立刻取出并传上来,另外,我的customer表字段scustomer_id和infomation表的字段scustomer_id1、sserv_record_id的索引建在该表的表空间上,而其他索引建在index表空间上,不知是否有影响。Top
26 楼KingSunSha(弱水三千)回复于 2001-11-13 11:19:02 得分 0
我用SQL NAVIGATOR生成DLL,很方便,你去QUEST.COM下载一个吧.
至于索引的表空间,你的方法是对的,大的索引应该放在单独的表空间,而不要和表放在一起,否则会影响性能.这肯定不会影响EXPLAIN PLAN.Top
27 楼ziyouzhuangtai(自由状态)回复于 2001-11-13 15:18:45 得分 0
这是用 SQL NAVIGATOR生成的索引dll:
CREATE INDEX cs_customer_ix1
ON cs_customer
( sserial_num1 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix10
ON cs_customer
( sguarantee_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix11
ON cs_customer
( scust_card_num )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix12
ON cs_customer
( sprod_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix13
ON cs_customer
( sprod_model )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_customer_ix14
ON cs_customer
( cdata_source_type )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_customer_ix15
ON cs_customer
( cstatus )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix17
ON cs_customer
( saddress )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix18
ON cs_customer
( sarea_num )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix19
ON cs_customer
( sserv_unit_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix2
ON cs_customer
( sserial_num2 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix20
ON cs_customer
( dserv_date )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix21
ON cs_customer
( dpurchase_date )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix22
ON cs_customer
( soperator_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix23
ON cs_customer
( scust_identifier )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_customer_ix24
ON cs_customer
( ccust_type )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix25
ON cs_customer
( scust_name )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix26
ON cs_customer
( sserv_unit_name )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix27
ON cs_customer
( sattribute2 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix3
ON cs_customer
( sserial_num3 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix4
ON cs_customer
( sserial_num4 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix5
ON cs_customer
( stelephone1 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix6
ON cs_customer
( stelephone2 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix7
ON cs_customer
( stelephone3 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_data
/
CREATE INDEX cs_customer_ix8
ON cs_customer
( stelephone4 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_customer_ix9
ON cs_customer
( semail )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_info_record_ix16
ON cs_customer
( sregion_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_data
/
CREATE UNIQUE INDEX pk_cs_customer
ON cs_customer
( scustomer_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_data
/
CREATE INDEX cs_infomation_fk1
ON cs_infomation
( sserv_form_num )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_fk2
ON cs_infomation
( sfault_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_fk3
ON cs_infomation
( smaint_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_fk4
ON cs_infomation
( sserv_unit_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_fk5
ON cs_infomation
( scustomer_id2 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_fk6
ON cs_infomation
( sreflect_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_fk7
ON cs_infomation
( scheck_result_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_fk8
ON cs_infomation
( scustomer_id1 )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_data
/
CREATE INDEX cs_infomation_fk9
ON cs_infomation
( sinfo_record_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_infomation_ix1
ON cs_infomation
( cdata_source_type )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_ix10
ON cs_infomation
( dserv_date )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_infomation_ix2
ON cs_infomation
( srecord_type )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_infomation_ix3
ON cs_infomation
( ccallback_flaga )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_infomation_ix4
ON cs_infomation
( ccallback_flagb )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_infomation_ix5
ON cs_infomation
( ccallback_flagc )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE BITMAP INDEX cs_infomation_ix6
ON cs_infomation
( cstatus )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_ix7
ON cs_infomation
( ssettlement_num )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_ix8
ON cs_infomation
( dfinish_date )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE INDEX cs_infomation_ix9
ON cs_infomation
( tentry_datetime )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_index
/
CREATE UNIQUE INDEX pk_cs_infomation
ON cs_infomation
( sserv_record_id )
PCTFREE 10
INITRANS 2
MAXTRANS 255
TABLESPACE hskt_data
/
请弱水三千再帮帮忙呀!
Top
28 楼KingSunSha(弱水三千)回复于 2001-11-13 15:27:59 得分 0
要到晚上我才能测试,请耐心等候.Top
29 楼ziyouzhuangtai(自由状态)回复于 2001-11-13 15:39:04 得分 0
多谢了!Top
30 楼Haiwer(海阔天空)回复于 2001-11-13 15:42:01 得分 1
碰到这么个热心大哥真是福气Top
31 楼ziyouzhuangtai(自由状态)回复于 2001-11-13 15:51:03 得分 0
是呀!真是非常感激呀!Top
32 楼9Thoughts(一片绿洲)回复于 2001-11-13 17:38:59 得分 1
select count(*) from customer c,info_mation i where c.cust_id=i.cust_id;
在解析这个语句时,ORACLE首先要选择一个主表做为驱动表,而你有没有指定其他条件,FULL SCAN是必然的,无法避免,但是另外一个从表则不必做FULL SCAN。在这里驱动表应该是customer。
这是ORACLE的优化原则,因为这样做效率更高。
也正如你所言,在WHERE clause里边再加一个条件,索引被激活了,正是你的条件影响了驱动表的选择。
关于这个《Oracle8i Concept》里边有详细的描述。Top
33 楼ziyouzhuangtai(自由状态)回复于 2001-11-13 18:12:20 得分 0
谢谢一片绿洲的指点,不过现在不是索引没用上而是查询速度很慢的问题,可否再给点指点。Top
34 楼KingSunSha(弱水三千)回复于 2001-11-13 23:26:16 得分 21
终于测试完了,结果还是一样(为了加入这120万条纪录,花了我45分钟,都怪我先建立了那么多INDEX):
SQL> ;
1 SELECT LPAD(' ',2*LEVEL)||
2 Operation||' '||Options||' '||
3 decode(Object_Owner,Null,'',Object_Owner||'.'||Object_name)||' '||
4 decode(Optimizer,NULL,'',Optimizer) Q_PLAN
5 FROM plan_table
6 connect by prior ID = Parent_id and statement_id = 'AAA'
7* start with ID = 0 and statement_id = 'AAA'
SQL> /
Q_PLAN
--------------------------------------------------------------------------------
SELECT STATEMENT CHOOSE
SORT AGGREGATE
NESTED LOOPS
INDEX FULL SCAN KNUT.CS_INFOMATION_FK8 ANALYZED
INDEX UNIQUE SCAN KNUT.PK_CS_CUSTOMER ANALYZED
Elapsed: 00:00:00.40
SQL> select count(*)
2 from cs_customer c, cs_infomation i
3 where c.scustomer_id=i.scustomer_id1;
COUNT(*)
----------
599999
Elapsed: 00:00:010.56
EXPLAIN PLAN用到了一个NON-UNIQUE INDEX FULL SCAN(不是FULL TABLE SCAN)和一个UNIQUE INDEX FULL SCAN。查询的速度不是很快(毕竟有那么多纪录)。
好像已经没有办法再优化了。
另外发现一个有趣的现象,请看:
SQL> select count(*)
2 from cs_customer c, cs_infomation i
3 where c.scustomer_id=i.scustomer_id1
4 and c.scustomer_id = 100; --在CUSTOMER表上加限制条件
COUNT(*)
----------
2
Elapsed: 00:00:05.19 --很慢
1 select count(*)
2 from cs_customer c, cs_infomation i
3 where c.scustomer_id=i.scustomer_id1
4* and i.scustomer_id1 = 100 ----在INFORMATION表上加限制条件
SQL> /
COUNT(*)
----------
2
Elapsed: 00:00:00.11 --非常快
但是用EXPLAIN PLAN分析,结果是一模一样的。WHY??????????Top
35 楼ziyouzhuangtai(自由状态)回复于 2001-11-14 10:04:57 得分 0
真不知怎么谢你了,弱水三千,耽误你那么多时间,真是非常感激!
看来从索引是没有办法了,关于数据库参数的调整,可不可以给点建议,让这样的连接速度能快点,这么慢的速度实在受不了(1分40秒)。
Top
36 楼KingSunSha(弱水三千)回复于 2001-11-14 15:00:30 得分 0
太可怕了,1分40秒?在我的pc上只要10秒以内
我用的机器也是很一般的(AMD DURON 850/512MB RAM/40G HDD),根本不能和专用的服务器比的。而且数据库我也没有做太多的优化,基本参数设置如下:
db_block_buffers = 31587
shared_pool_size = 43127808
large_pool_size = 614400
db_block_size = 8192
sort_area_size = 65536
sort_area_retained_size = 65536
我个人感觉db_block_size对数据库性能影响比较大,设成2k的话,速度很慢,4k就比2k快1倍都多,8k比4k又能提高50%左右。Top
37 楼ziyouzhuangtai(自由状态)回复于 2001-11-15 09:59:19 得分 0
但db_block_size的设置是否只能在数据库创建的时候有效呀?Top
38 楼ziyouzhuangtai(自由状态)回复于 2001-11-15 10:01:10 得分 0
但db_block_size的设置是否只能在数据库创建的时候才可以修改呀?Top
39 楼KingSunSha(弱水三千)回复于 2001-11-15 10:45:03 得分 23
是的,DB_BLOCK_SIZE在创建数据库的时候指定,没办法修改.
我帮人做过几次优化,解决的办法是先倒出全部数据,用新的参数重建数据库,然后在倒入数据.Top
40 楼ziyouzhuangtai(自由状态)回复于 2001-11-15 12:47:36 得分 0
但现实是不允许这样做呀。我好惨哪,谢谢各位的帮助了!Top
41 楼Dump(当铺)回复于 2001-11-20 12:35:06 得分 0
我们从来不对大表进行关联,宁可增加冗余字段。
Top




