sql >> Database teknologi >  >> RDS >> Oracle

Sådan finder du en tabel, hvor statistik er låst

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


  1. dBase Support er tilbage i Microsoft Access!

  2. Top GUI-værktøjer til PostgreSQL

  3. Sådan udføres og administreres MySQL-sikkerhedskopier til Oracle DBA'er

  4. Få alle forældre til et barn