2008-10-03

ORACLE OPTIMALIZATION

sprawdzenie liczby bloków:
SELECT blocks, extents FROM dba_segments WHERE segment_name='[table]' AND owner='[owner]';
sprawdzenie liczby bloków zajętych przez segment:
SELECT blocks, empty_blocks FROM dba_tables WHERE table_name = '[table]' AND owner='[owner]';
optymalizacja przestrzeni:

zmiejszenie ilosci bloków zformatowanych pod wcześniej zainstertowane dane, które to dane następnie zostały zdeletowane, a bloki zostały automatycznie przesunięte do FREELIST, czyli obniża się HWM, jednak zaalokowana liczba bloków przez segment pozostaje nie zmieniona, ponadto bloki migrują do wolnej przestrzeni w miejsce pustych bloków dlatego zmienia się row_id i block_id.
ALTER TABLE [table] MOVE;
następnie proces Automatic Space Segment Management powinien wszystko wyczyścić, oczywiście przestrzeń musi być w trybie Extent Management Local, jeżeli nie to trzeba to zrobić ręcznie jak poniżej

zmniejszenie zaalokowanej liczby bloków przez segment:
ALTER TABLE [table] ENABLE ROW MOVEMENT;ALTER TABLE [table] SHRINK SPACE;
obliczanie wielkości przestrzeni wycofania:
undo_blk/s - ilość bloków wycofań na sekundę,
86400 - ilość sekund w ciągu dnia
undo_blk/s = SELECT (SUM(undoblks))/ SUM ((end_time - begin_time) * 86400) FROM v$undostat;ts_size = (show parameter undo_retention) * undo_blk/s * db_block_size + db_block_size
lub zapytanie:
SELECT (UR * (UPS * DBS)) + (DBS) AS "Bytes" FROM (SELECT value AS UR FROM v$parameter WHERE name = 'undo_retention'), (SELECT (SUM(undoblks)/SUM(((end_time - begin_time)*86400))) AS UPS FROM v$undostat), (select block_size as DBS from dba_tablespaces where tablespace_name= (select value from v$parameter where name = 'undo_tablespace'));
sprawdzenie twardych zapytań:
select pa.SID, pa.VALUE "Hard parses",ex.VALUE "Execute Count" from v$sesstat pa,v$sesstat ex where pa.sid = ex.sid and pa.statistic#=(select statistic# from v$statname where name ='parse count (hard)') and ex.statistic#=(select statistic# from v$statname where name = 'execute count') order by "Hard parses" desc;
select * from (select sql_text,parse_calls,executions from v$sqlstats order by parse_calls)where rownum < 10 #jeżeli zbliżone parse_calls do executions to te pytania są za często parsowane