Statistieken speelden een sleutelrol bij het afstemmen van de prestaties van Oracle. Oracle Optimizer maakt het uitvoeringsplan op basis van de statistieken van de Oracle-tabel die betrokken is bij de SQL-query's.
In sommige gevallen wilt u misschien statistieken in een orakeltabel vergrendelen, bijvoorbeeld
- u wilt niet dat een tabel wordt geanalyseerd op basis van een geplande statistische taak, maar u wilt deze later of tegen een hogere schatting analyseren
- u wilt om prestatieredenen geen statistieken voor de tabel genereren
- je wilt niet dat de server tijd besteedt om statistieken te genereren wanneer de tabelgegevens niet veranderen
Er kunnen nog veel meer gevallen zijn waarin we statistieken willen vergrendelen
Inhoudsopgave
Statistieken op tafel vergrendelen
U kunt het standaard orakelpakket DBMS_STATS gebruiken om de statistieken op de tafel te vergrendelen
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
Hoe vind je een tabel waarin statistieken zijn vergrendeld
U kunt onderstaande zoekopdracht gebruiken om alle tabellen te vinden waar statistieken zijn vergrendeld
select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
Loopstatistieken genereren Taak op de tafel waar statistieken zijn vergrendeld
Als we proberen statistieken te verzamelen over de tabellen waar statistieken zijn vergrendeld, krijgen we ORA-2005 objectstatistieken zijn vergrendeld (stattype =all)
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
We kunnen onderstaande stappen uitvoeren om de statistieken te ontgrendelen en de statistieken te genereren en opnieuw te vergrendelen
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);
Statistieken ontgrendelen voor tabel en schema / tabelstatistieken ontgrendelen voor schema
Zodra we de objecten hebben gevonden, kunnen we onderstaande zoekopdrachten gebruiken om ze te ontgrendelen
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');
Index aanmaken met statistieken vergrendeld op tafel
Vanaf 10g worden de statistieken automatisch gegenereerd wanneer we een index maken. Nu verandert deze vergelijking. Wanneer de tabel is vergrendeld, worden er geen statistieken gegenereerd tijdens het maken van de index. We moeten de FORCE-optie gebruiken om de statistieken te verzamelen tijdens het maken van een index voor vergrendelde objecten. Laten we dat in detail begrijpen door het voorbeeld te bekijken
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.
Ik hoop dat je de informatie over het vergrendelen/ontgrendelen van tabellenstatistieken in Oracle leuk vindt. Ook nu moet u weten wat u moet doen wanneer ORA-2005:objectstatistieken zijn vergrendeld en ORA-38029:objectstatistieken zijn vergrendeld gebeurt
Gerelateerde artikelen
Statistieken verzamelen in release 11i en R12
Incrementele statistieken verzamelen in 11g
ora-20001 in Schemastatistieken verzamelen op 11g(FND_HISTOGRAM_COLS)
Tabelbewaking instellen in Oracle en relatie met STATISTICS_LEVEL
Oracle-zelfstudie:oude statistieken controleren
Oracle Optimizer-modus
Oracle-documentatie over statistieken