很奇怪的问题,因为百度了好久,在生成PRIMARY KEY的时候都生成了对应的索引.但是我现在在维护一个金融系统.创建的PRIMARY KEY却没有产生对应的索引.导致这个系统一个很重要的表无法正常执行索引.因为系统已经存在多年.集体创建数据库的人已经不知道哪里去了.但是这是遗留问题,已经存在2年多了,这次系统调整的时候被发现.

解决方案 »

  1.   

    可能创建的PRIMARY   KEY时索引表空间不够,索引创建不成功
      

  2.   

    我创建了一个 另外的索引,但是就是不走这个索引,并且对应的primary key没有产生索引.而我创建的索引 只包含一个字段,并且是primary key中的一个.
      

  3.   

    发表于:2008-01-29 15:20:476楼 得分:0 
    Gather   这个TABLE看看。 
    =================我是嵌入式  转过来开发java的,我才接触oracle .Gather   是什么意思???白白的问一下.
      

  4.   

    Gather table的统计信息,让执行计划自动优化。
    如果是8i 的TABLE, 不要马上用,有点风险, 9i后的应该没有关系。
    因为可能变快,也可以变慢,特别是哪些从来都没做过的DB。
      

  5.   

    Gather   table的统计信息,让执行计划自动优化。 
    如果是8i   的TABLE,   不要马上用,有点风险,   9i后的应该没有关系。 
    因为可能变快,也可以变慢,特别是哪些从来都没做过的DB。 
    ==================================
    哦,能告诉我执行方法么/???我只是想找出 sql不执行索引的原因,对于数据库系统的优化 有专门的dba,不是我的范畴.
      

  6.   

    把你的应用程序的sql贴上来,好像限制了索引的使用
      

  7.   

    首先还是看一下,执行计划。到底有没有用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');
      

  8.   

    别忘了“using index”,否则,只创建主键,没有索引。
    alter table TABLE_NAME
      add constraint PK_TABLE_NAME primary key (ID)
      using index 
      tablespace TBS_DATA;
      

  9.   

    ###########################################################################
    # 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分,另外五十另开帖子.希望大家继续讨论.
      

  10.   

    通常这个是版本的问题。在老的版本中按照你给的脚本是不会建立索引的,但是在
    9ir2及其以上的版本中建立PK,同时也建立索引,这是默认的规则。
    列出你的不同执行环境看看。
      

  11.   

    我觉得你对主键的理解有问题,
    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在你的表上追加其他的索引,已达到性能优化的要求。
      

  12.   

    如何设计索引,以及编写高效的SQL(合理使用索引),不是三言两语可以说清楚。
    建议大家参看相关资料,并在实践中提高个人能力。另外,发现很难在CSDN找到Oracle高手。
      

  13.   

    当你Select   *   from   t01   where   A1   =   'A' 
    的时候,并不能用上索引
    ==================
    很遗憾的告诉你.我上面给出的都是经过oracle测试过的.这个语句在你的表上面会执行Primary   Key(A1,A2) 对应的索引.因为索引顺序是A1,A2,当select条件是A1在前的时候是可以执行索引的.详细可以百度-->oracle索引 顺序.
      

  14.   

    索引应该是主键的一部分,怎么会创建了主键而没有对应的索引呢?
    =========================
    我开始的时候也迷茫,但是我发现
    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