sql >> Database >  >> RDS >> Oracle

Stale-statistieken controleren?

Statistieken kunnen oud worden als de gegevens in de tabel substantieel veranderen.Up-to-date statistieken zijn belangrijk om goede uitvoeringsplannen te genereren

Hoe Oracle beslist of de statistieken verouderd zijn

Statistieken worden als verouderd beschouwd wanneer #(INSERTS + UPDATES + DELETES)>=10% van NUM_ROWS van dba_tables:

Parameterinstelling vereist om de tabelwijzigingen bij te houden

Voorafgaand aan Oracle 10g werd het automatisch verzamelen van statistieken voor objecten die oud waren geworden gecontroleerd door de instelling van de MONITORING-vlag op de tafel.
Afhankelijk van de MONITORING-vlag verzamelde de GATHER_STATS_JOB-taak "GATHER EMPTY" en "GATHER STALE" op de gemarkeerde objecten.

In 10g zijn de trefwoorden MONITORING en NOMONITORING verouderd en worden ze genegeerd. De functie voor tabelbewaking wordt nu beheerd door de parameter STATISTICS_LEVEL.

Wanneer STATISTICS_LEVEL is ingesteld op BASIC, is bewaking op de tafel uitgeschakeld.
Als STATISTICS_LEVEL is ingesteld op TYPICAL, is bewaking ingeschakeld.
Standaard is STATISTICS_LEVEL ingesteld op TYPICAL en is bewaking van tabellen ingeschakeld. Het wordt sterk aanbevolen om STATISTICS_LEVEL in te stellen op TYPICAL in 10g en hoger
Door deze parameter in te stellen, houdt Oracle het geschatte aantal INSERT-, UPDATE- en DELETE-bewerkingen voor de Oracle-tabel bij sinds de laatste keer dat er statistieken werden verzameld. Deze informatie over "aangebrachte wijzigingen" wordt bijgehouden in de SGA en periodiek (ongeveer elke 15 minuten) spoelt de SMON de gegevens naar de datadictionary-tabellen. U kunt de informatie handmatig wissen door dbms_stats.FLUSH_DATABASE_MONITORING_INFO() aan te roepen. De datadictionary-informatie wordt zichtbaar gemaakt via de weergaven:DBA_TAB_MODIFICATIONS, ALL_TAB_MODIFICATIONS en USER_TAB_MODIFICATIONS.

Oracle gebruikt deze weergaven om tabellen met verouderde statistieken te identificeren.
Telkens wanneer er 10% verandering in de gegevens in een tabel optreedt, beschouwt Oracle de statistieken als verouderd.

Hoe oude statistieken te controleren

De onderstaande PLSQL-procedure vindt alle tabellen in het SCOTT-schema, wat verouderde statistieken zijn

SET SERVEROUTPUT ON

SQL> DECLARE
ObjList dbms_stats.ObjectTab;
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'SCOTT', objlist=>ObjList, options=>'LIST STALE');
FOR k in ObjList.FIRST..ObjList.LAST
LOOP
dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname);
END LOOP;
END;
/

De onderstaande sql kan ook worden gebruikt om invoegen, bijwerken, verwijderen te vinden

select u.TIMESTAMP,
t.last_analyzed,
u.table_name,
u.inserts,
u.updates,
u.deletes,
d.num_rows,
decode(d.num_rows,0,'Table Stats indicate No Rows',
nvl(TO_CHAR(((U.inserts+u.deletes+u.updates)/d.num_rows) * 100,'999.99')
,'Null Value in USER_TAB_MODIFICATIONS')
) percent
from user_tables t,USER_TAB_MODIFICATIONS u,dba_tables d
where u.table_name = t.table_name
and d.table_name = t.table_name
and d.owner = '&Owner'
and (u.inserts > 3000 or u.updates > 3000 or u.deletes > 3000)
order by t.last_analyzed
/

Als u dit op de hele database wilt uitvoeren

SET SERVEROUTPUT ON

SQL> DECLARE
ObjList dbms_stats.ObjectTab;
BEGIN
DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST STALE');
FOR k in ObjList.FIRST..ObjList.LAST
LOOP
dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname);
END LOOP;
END;
/

Als je de tabellen wilt zien waar de statistieken leeg zijn, kunnen we hieronder gebruiken

SET SERVEROUTPUT ON

SQL> DECLARE
ObjList dbms_stats.ObjectTab;
BEGIN
DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST EMPTY');
FOR k in ObjList.FIRST..ObjList.LAST
LOOP
dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname);
END LOOP;
END;
/

Zodra u de lijst met tabellen hebt gevonden, kunt u statistieken over deze tabellen genereren.

exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME');

We kunnen ook het onderstaande commando uitvoeren om statistieken te genereren over alle verouderde objecten in het schema

exec dbms_stats.gather_schema_stats(ownname => '<schema name>', cascade => TRUE, options => 'GATHER AUTO');

Vanaf Oracle11g kan de verouderingsdrempel worden ingesteld met behulp van de STALE_PERCENT-statistiekenvoorkeur. Dit kan globaal worden ingesteld met DBMS_STATS.SET_GLOBAL_PREFS of op tabelniveau met DBMS_STATS.SET_TABLE_PREFS.

Verwante artikelen

ora-38029:objectstatistieken zijn vergrendeld
ora-20001 in Schemastatistieken verzamelen op 11g(FND_HISTOGRAM_COLS)
Statistieken verzamelen in release 11i en R12
Incrementele statistieken verzamelen in 11g
Hoe kan ik set Table Monitoring in Oracle en relatie met STATISTICS_LEVEL


  1. Fix "Ten minste één van de argumenten voor COALESCE moet een expressie zijn die niet de NULL-constante is" in SQL Server

  2. Tips om uw SQL Server-complexiteit te verminderen

  3. Een scheidingsteken toevoegen aan een aaneengeschakelde tekenreeks in SQL Server - CONCAT_WS()

  4. 4 manieren om rijen te vinden die hoofdletters bevatten in PostgreSQL