150分相送讨教个奇怪问题,创建表PRIMARY KEY的同时,什么时候会不产生对应的索引呢?

star119119 2008-01-29 12:14:47
很奇怪的问题,因为百度了好久,在生成PRIMARY KEY的时候都生成了对应的索引.

但是我现在在维护一个金融系统.创建的PRIMARY KEY却没有产生对应的索引.

导致这个系统一个很重要的表无法正常执行索引.

因为系统已经存在多年.集体创建数据库的人已经不知道哪里去了.但是这是遗留问题,已经存在2年多了,这次系统调整的时候被发现.
...全文
223 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
star119119 2008-02-12
  • 打赏
  • 举报
回复
索引应该是主键的一部分,怎么会创建了主键而没有对应的索引呢?
=========================
我开始的时候也迷茫,

但是我发现
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
sulins 2008-02-12
  • 打赏
  • 举报
回复
怎么这么多人把主键和索引混在一块?
ruihuahan 2008-02-11
  • 打赏
  • 举报
回复
索引应该是主键的一部分,怎么会创建了主键而没有对应的索引呢?
star119119 2008-02-11
  • 打赏
  • 举报
回复
当你Select * from t01 where A1 = 'A'
的时候,并不能用上索引
==================
很遗憾的告诉你.

我上面给出的都是经过oracle测试过的.

这个语句在你的表上面会执行Primary Key(A1,A2) 对应的索引.

因为索引顺序是A1,A2,当select条件是A1在前的时候是可以执行索引的.

详细可以百度-->oracle索引 顺序.
star119119 2008-01-30
  • 打赏
  • 举报
回复
###########################################################################
# 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分,另外五十另开帖子.希望大家继续讨论.
sulins 2008-01-30
  • 打赏
  • 举报
回复
如何设计索引,以及编写高效的SQL(合理使用索引),不是三言两语可以说清楚。
建议大家参看相关资料,并在实践中提高个人能力。

另外,发现很难在CSDN找到Oracle高手。
doer_ljy 2008-01-30
  • 打赏
  • 举报
回复
我觉得你对主键的理解有问题,
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在你的表上追加其他的索引,已达到性能优化的要求。
多壮志 2008-01-30
  • 打赏
  • 举报
回复
通常这个是版本的问题。在老的版本中按照你给的脚本是不会建立索引的,但是在
9ir2及其以上的版本中建立PK,同时也建立索引,这是默认的规则。
列出你的不同执行环境看看。

sulins 2008-01-29
  • 打赏
  • 举报
回复
别忘了“using index”,否则,只创建主键,没有索引。


alter table TABLE_NAME
add constraint PK_TABLE_NAME primary key (ID)
using index
tablespace TBS_DATA;
Petergepeter 2008-01-29
  • 打赏
  • 举报
回复
首先还是看一下,执行计划。到底有没有用INDEX,
然后,看看,你的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');
hailang_maxu 2008-01-29
  • 打赏
  • 举报
回复
把你的应用程序的sql贴上来,好像限制了索引的使用
star119119 2008-01-29
  • 打赏
  • 举报
回复
Gather table的统计信息,让执行计划自动优化。
如果是8i 的TABLE, 不要马上用,有点风险, 9i后的应该没有关系。
因为可能变快,也可以变慢,特别是哪些从来都没做过的DB。
==================================
哦,能告诉我执行方法么/???

我只是想找出 sql不执行索引的原因,对于数据库系统的优化 有专门的dba,不是我的范畴.
Petergepeter 2008-01-29
  • 打赏
  • 举报
回复
Gather table的统计信息,让执行计划自动优化。
如果是8i 的TABLE, 不要马上用,有点风险, 9i后的应该没有关系。
因为可能变快,也可以变慢,特别是哪些从来都没做过的DB。
star119119 2008-01-29
  • 打赏
  • 举报
回复
发表于:2008-01-29 15:20:476楼 得分:0
Gather 这个TABLE看看。
=================

我是嵌入式 转过来开发java的,我才接触oracle .

Gather 是什么意思???白白的问一下.
star119119 2008-01-29
  • 打赏
  • 举报
回复
本來主鍵就是索引啊!
======================
你说对了

但是由于之前建立数据库那个人,是先建立的索引再建立的主键,有的主键冲突了,系统没有建立.

于是手动建立.但是却不走这个手动建立的索引.
fxianxian 2008-01-29
  • 打赏
  • 举报
回复
本來主鍵就是索引啊!
Petergepeter 2008-01-29
  • 打赏
  • 举报
回复
Gather 这个TABLE看看。
star119119 2008-01-29
  • 打赏
  • 举报
回复
我创建了一个 另外的索引,但是就是不走这个索引,并且对应的primary key没有产生索引.

而我创建的索引 只包含一个字段,并且是primary key中的一个.
star119119 2008-01-29
  • 打赏
  • 举报
回复
有索引没有用上
bjt_ 2008-01-29
  • 打赏
  • 举报
回复
仔细查查是没有这个索引,
还是有索引没有用上?
加载更多回复(2)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧