很奇怪的问题,因为百度了好久,在生成PRIMARY KEY的时候都生成了对应的索引.但是我现在在维护一个金融系统.创建的PRIMARY KEY却没有产生对应的索引.导致这个系统一个很重要的表无法正常执行索引.因为系统已经存在多年.集体创建数据库的人已经不知道哪里去了.但是这是遗留问题,已经存在2年多了,这次系统调整的时候被发现.
解决方案 »
- 关于oracle 游标的问题[有点好奇]
- Oracle 多表共用序列问题
- 测试没有成功。
- 请帮我看一下这个存储过程?
- 兄弟们帮我看看这条sql语句应该怎么写,谢谢
- 如何让system用户可以有执行dbms_utility.exec_ddl_statement的权限?
- 急急急!Oracle8.16+Win2000系统,安装后一切正常,重启机后出现ORA-01034错误,大侠帮忙!
- 请教大家关于oracle中substr函数的一个问题
- 如何更好地学习oracle数据库
- 两个子查询的连接查询如何提高查询速度
- 取表的第一条记录的一个字段的值怎么取?
- NEt中 的一个存存储考试的应用...在线等解决就给分
Gather 这个TABLE看看。
=================我是嵌入式 转过来开发java的,我才接触oracle .Gather 是什么意思???白白的问一下.
如果是8i 的TABLE, 不要马上用,有点风险, 9i后的应该没有关系。
因为可能变快,也可以变慢,特别是哪些从来都没做过的DB。
如果是8i 的TABLE, 不要马上用,有点风险, 9i后的应该没有关系。
因为可能变快,也可以变慢,特别是哪些从来都没做过的DB。
==================================
哦,能告诉我执行方法么/???我只是想找出 sql不执行索引的原因,对于数据库系统的优化 有专门的dba,不是我的范畴.
然后,看看,你的SQL到底是怎样的,是否根本就不可能用那个INDEX,
如果可以的话,我们可以加上HINT,强制该SQL使用该INDEX,看是否OK。
最后,再决定要不要gather table.9i gather table:
exec DBMS_STATS.gather_table_stats(ownname,tabname,partname,estimate_percent,block_sample,
method_opt,degree,granularity,cascade,stattab,statid,statown,no_invalidate);EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES');
alter table TABLE_NAME
add constraint PK_TABLE_NAME primary key (ID)
using index
tablespace TBS_DATA;
# test 5
# 虚拟FX系统的问题
###########################################################################CREATE TABLE INFO.TEST4 (
A1 VARCHAR2(7) NOT NULL,
A2 VARCHAR2(8) NOT NULL,
A3 VARCHAR2(25) NULL,
A4 VARCHAR2(25) NULL,
A5 VARCHAR2(25) NULL
)CREATE INDEX TEST_4 ON TEST4(A1,A2,A3) # 阻止创建索引
CREATE INDEX TEST_4_1 ON TEST4(A2)
CREATE INDEX TEST_4_2 ON TEST4(A1,A3,A4) # 避免特殊情况ALTER TABLE TEST4 ADD PRIMARY KEY (A2,A1) #不会创建索引declare
idx number(7) := 1;
begin
loop
exit when idx = 1000;
insert into INFO.TEST4 values (idx, idx, '1', '1', '1');
idx := idx + 1;
end loop;
end;SELECT * FROM TEST4 WHERE A2='1_1'#结果:执行了索引TEST_4_1 这个表结构和数据库的是一样的,这个查询也是一样的,当然程序里是单个字段查询,不是所有字段.
现在的问题是,我无法虚拟出数据库出现的问题,因为我的还是可以走手动创建的索引.而数据库的不走,因为按照这个步骤创建的主键是不会创建索引的.
http://hi.baidu.com/ryouaki/blog/item/a029eb8bf9c6c8d7fc1f10d4.html
在我的百度空间里面有具体的实验说明.但是在我现在系统的数据库里是不走索引.公司采取了重建表的方式解决了问题.但是我只是想知道这个问题的存在原因.oracle方面专家(一个获得oracle认证的朋友)给的是数据表坏掉了.
根据这个反常现象也可以这么理解.是可以采纳的一个原因.PS:我在这个版块只能发100分,另外五十另开帖子.希望大家继续讨论.
9ir2及其以上的版本中建立PK,同时也建立索引,这是默认的规则。
列出你的不同执行环境看看。
Primary(A1,A2)的意思是,A1,A2是一个键
你不能把它割裂开看,就索引而言也是这样的。
比如说
CREATE TABLE T01 (
A1 VARCHAR2(7) NOT NULL,
A2 VARCHAR2(8) NOT NULL,
A3 VARCHAR2(25) NULL,
A4 VARCHAR2(25) NULL,
A5 VARCHAR2(25) NULL,
Primary Key(A1,A2)
)
当你Select * from t01 where A1 = 'A'
的时候,并不能用上索引,而当你Select * from T01 where A1='1' and A2 = '1'时会是用创建主见的时候创建的索引。
另外朱剑主要是完整性约束的要求,而索引则关注与查询性能。
也就是说我们不用考虑创建主键的时候或者针对主键的索引为什么不起作用,我们只需要考虑这个索引我的SQL文是否用得上。
可以针对不同的SQL在你的表上追加其他的索引,已达到性能优化的要求。
建议大家参看相关资料,并在实践中提高个人能力。另外,发现很难在CSDN找到Oracle高手。
的时候,并不能用上索引
==================
很遗憾的告诉你.我上面给出的都是经过oracle测试过的.这个语句在你的表上面会执行Primary Key(A1,A2) 对应的索引.因为索引顺序是A1,A2,当select条件是A1在前的时候是可以执行索引的.详细可以百度-->oracle索引 顺序.
=========================
我开始的时候也迷茫,但是我发现
CREATE INDEX TEST_4 ON TEST4(A1,A2,A3) # 阻止创建索引
CREATE INDEX TEST_4_1 ON TEST4(A2)
CREATE INDEX TEST_4_2 ON TEST4(A1,A3,A4) # 避免特殊情况 ALTER TABLE TEST4 ADD PRIMARY KEY (A2,A1) #不会创建索引
按照这个规律创建主键的话就不会在根据主键创建索引,经过测试成立,环境是9I