|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
与其他数据库相比,MySQL易学易用。毛病|办理
接到开辟职员和营业职员的关照,说一个上岸页面不克不及用了,报错:
2005-01-3113:59:02,721[com.aspire.common.dao.OamUserDAO]--214:select毛病
java.sql.SQLException:ORA-01502state
这个毛病是因为索引生效酿成的,重修索引后,成绩就办理了。
为了弄分明索引为何会生效,和怎样办理,我们做个测试:
起首我们创立一个一般的测试表(非分区表):
SQL>createtablet(anumber);
Tablecreated.
SQL>selecttablespace_namefromuser_segmentswheresegment_name=T;
TABLESPACE_NAME
------------------------------
DATA_DYNAMIC
SQL>
然后,我们创立一个一般索引
SQL>createindexidxtont(a);
Indexcreated.
SQL>insertintotvalues(10);
1rowcreated.
SQL>setlinesize200
SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;
INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEVALID
SQL>
摹拟索引是生效的情形:
SQL>altertabletmovetablespacetools
2/
Tablealtered.
SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;
INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEUNUSABLE
SQL>
我们看到,当利用相似altertablexxxxxxmovetablespacexxxxxxx命令后,索引就会生效。
固然,作为测试,也能够间接利用alterindexidxtunusable;命令使索引生效,比方:
SQL>alterindexidxtunusable;
Indexaltered.
SQL>
在这类情形下,我们向表中拔出数据看看是甚么情形:
SQL>insertintotvalues(11);
insertintotvalues(11)
*
ERRORatline1:
ORA-01502:indexMISC.IDXTorpartitionofsuchindexisinunusablestate
SQL>
我们看到,这时候就呈现了罕见的“ORA-01502:indexXXXXXXXXorpartitionofsuchindexisinunusablestate”毛病。
反省一下索引形态,我们会注重到索引已是“UNUSABLE”了。
SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;
INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEUNUSABLE
SQL>
关于一般表中的分歧索引(非独一索引),我们有两种办法办理这个成绩。
办法一:设置skip_unusable_indexes=true;
SQL>altersessionsetskip_unusable_indexes=true;
Sessionaltered.
SQL>insertintotvalues(11);
1rowcreated.
SQL>commit;
Commitcomplete.
SQL>select*fromt;
A
----------
1
2
3
4
5
10
11
7rowsselected.
SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;
INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEUNUSABLE
SQL>
如今我们看到,这个索引的形态固然仍是“UNUSABLE”可是,经由过程设置“altersessionsetskip_unusable_indexes=true;”,
我们已能够会见这个表了,可是请注重,这类情形下,这个索引是不成用的,也就是说优化器在思索是不是要利用索引时是不思索这个以是的。
办法2:经由过程罕见以是完全办理这个成绩
起首,先设置“skip_unusable_indexes=false”,也就是不跳不对效索引
SQL>altersessionsetskip_unusable_indexes=false;
Sessionaltered.
SQL>
然后重修这个生效的索引
SQL>alterindexidxtrebuild;
Indexaltered.
SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;
INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEVALID
SQL>
我们看到重修索引后,索引的形态就一般了。
如今拔出数据,看看是一般:
SQL>insertintotvalues(12);
1rowcreated.
SQL>commit;
Commitcomplete.
SQL>
看来,重修索引才是办理这类成绩的完全的办法。
人力成本上的节省,MySQL的用户Spacemonkey实验室的首席执行官MitchPirtle如此表示:“维护MySQL使得你不需要一个年薪15万美元的DBA。 |
|