Statistik spillede en nøglerolle for Oracle-indstilling af ydeevne. Oracle Optimizer opretter eksekveringsplanen baseret på statistikken for oracle-tabellen involveret i SQL-forespørgslerne.
Du vil måske låse statistik i en orakel-tabel i nogle tilfælde, for eksempel
- du ønsker ikke, at en tabel skal analyseres efter tidsplan statistikjob, men du ønsker at analysere den senere eller med højere skøn
- du ønsker ikke at generere statistikken for tabellen af ydeevneårsager
- du ønsker ikke, at serveren skal bruge tid på at generere statistik, når tabeldataene ikke ændres
Der kunne være mange flere tilfælde, hvor vi ønsker at låse statistik
Indholdsfortegnelse
Sådan låser du statistik på bordet
Du kan bruge standard-oracle-pakken DBMS_STATS til at låse statistikken på bordet
exec dbms_stats.lock_table_stats('table_owner','table_name');
Example SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH'; STATTYPE_LOCKED —–------------ exec dbms_stats.lock_table_stats('TEST','TECH'); SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH'; STATTYPE_LOCKED —–-------- ALL
Sådan finder du en tabel, hvor statistik er låst
Du kan bruge nedenstående forespørgsel til at finde alle de tabeller, hvor statistik er låst
select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
Kørende statistikgenerering Job på bordet, hvor statistik er låst
Hvis vi forsøger at køre indsamle statistik på de tabeller, hvor statistik er låst, får vi ORA-20005 objektstatistik er låst (stattype =alle)
SQL> exec dbms_stats.gather_table_stats('TECH', 'TEST'); BEGIN dbms_stats.gather_table_stats('TECH', 'TEST'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at “SYS.DBMS_STATS”, line 10640 ORA-06512: at “SYS.DBMS_STATS”, line 10664 ORA-06512: at line 1
Vi kan udføre nedenstående trin for at låse statistikken op og generere statistikken og låse igen
exec dbms_stats.unlock_table_stats('TECH','TEST'); exec dbms_stats.gather_table_stats('TECH', 'TEST'); exec dbms_stats.lock_table_stats('TECH','TEST'); or exec dbms_stats.gather_table_stats('TECH', 'TEST',force=>true);
Sådan låser du op for statistik for tabel og skema / låser op for tabelstatistikker for skema
Når vi nu har fundet ud af objekterne, kan vi bruge nedenstående forespørgsler til at låse dem op
unlock table stats for schema exec dbms_stats.unlock_schema_stats('schema_owner'); exec dbms_stats.unlock_table_stats('table_owner','table_name'); Example exec dbms_stats.unlock_schema_stats('TECH'); exec dbms_stats.unlock_table_stats('TECH','TEST');
Oprettelse af indeks med statistik låst på tabellen
10g og fremefter, når vi opretter indeks, genereres statistikken automatisk. Nu ændres denne ligning. Når tabellen er låst, vil der ikke blive genereret statistik, mens indekset oprettes. Vi er nødt til at bruge FORCE-indstillingen til at indsamle statistik, mens vi opretter indeks for låste objekter. Lad os forstå det i detaljer ved at se eksemplet
Example Lets first create the dummy table and lock the statistics on that table SQL> create table test as select a.* ,rownum id from all_objects a where rownum <1001; SQL> exec dbms_stats.lock_table_stats('TECH','TEST'); Now we will try to create index SQL> create index test_idx on test(id); Index created. SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='TEST_IDX'; NUM_ROWS LAST_ANAL ---------- --------- So statistics on index is not generated automatically for the locked statistics table Lets try to generate the statistics using DBMS_STATS SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX'); BEGIN dbms_stats.gather_index_stats(null, 'TEST_IDX'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at "SYS.DBMS_STATS", line 10640 ORA-06512: at "SYS.DBMS_STATS", line 10664 ORA-06512: at line 1 So statistics generation failed. In order to generate stats on the index, We can use force option in dbms_stats to override this SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX',force=>true); PL/SQL procedure successfully completed. SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='IDX'; NUM_ROWS LAST_ANAL ---------- --------- 1000 01-SEP-17 Lets try to create a new index with compute statistics clause SQL> create index TEST_IDX1 on test(object_name) compute statistics; create index idx on test(object_name) compute statistics * ERROR at line 1: ORA-38029: object statistics are locked So ORA-38029 error happens, So we need to create index with out the compute statistics clause and then generate stats using force option SQL> create index TEST_IDX1 on test(object_name); SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true); Same things happens if we rebuild the index with compute statistics option SQL> alter index TEST_IDX1 rebuild compute statistics; alter index TEST_IDX1 rebuild compute statistics * ERROR at line 1: ORA-38029: object statistics are locked SQL> alter index TEST_IDX1 rebuild; Index altered. SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true); PL/SQL procedure successfully completed.
Håber du kan lide informationen om, hvordan du låser/låser tabeller op i Oracle. Nu skal du også vide, hvad du skal gøre, når ORA-20005:objektstatistik er låst og ORA-38029:objektstatistik er låst sker
Relaterede artikler
Indsamling af statistik i Release 11i og R12
Inkrementel statistik Indsamling i 11g
ora-20001 i Saml skemastatistik på 11g(FND_HISTOGRAM_COLS)
Sådan indstiller du tabelovervågning i Oracle og relationer med STATISTICS_LEVEL
Oracle Tutorial:Sådan tjekker du gammel statistik
Oracle Optimizer Mode
Oracle-dokumentation om statistik