Oracle
 sql >> Base de données >  >> RDS >> Oracle

Requête pour trouver des analyses de table complètes dans Oracle

Souvent, les performances de la base de données seront lentes. Nous devons d'abord savoir  si une analyse complète de table volumineuse est en cours.

Voyons d'abord ce qu'est l'analyse complète de la table, puis nous verrons la requête pour trouver des analyses complètes de la table dans oracle

Qu'est-ce que l'analyse complète du tableau ?

  • L'analyse complète de la table est l'une des méthodes d'accès utilisées par Optimizer. Dans ce cas, tous les blocs de la table (jusqu'à HWM) sont analysés et les conditions de filtre de la clause WHERE sont appliquées et les lignes qui satisfont à la condition de filtre sont renvoyées. Le plan d'explication s'affichera comme ceci
Execution Plan
TABLE ACCESS FULL OF HZ_PARTIES
  • L'analyse complète de la table a analysé la table à l'aide de la lecture de plusieurs blocs. Plusieurs blocs analysés pour chaque IO –> moins d'opérations d'E/S sont effectuées
  • db_multiblock_read_count init.ora paramètre décide du nombre de multiblocs. Version récente, oracle lui-même ajuste ce paramètre selon le système et vous n'avez pas besoin de le définir
  • Qu'est-ce que HWM - High Water Mark :C'est la limite qui sépare les blocs qui contiennent ou ont contenu des données des blocs qui n'ont jamais été insérés. Le nombre de blocs sous le HWM peut être obtenu via la colonne des blocs de la vue dba_tables

requête pour trouver des analyses de table complètes dans oracle

col event format a25
col module format a50
col File format 9999
col Block format 9999999
set lines 130
set trimspool on
select sessw.SID, sessw.EVENT, sessw.p1 "File",sessw.p2 "Block", s.MODULE
from v$session_wait sessw, v$session sess
where sessw.sid = sess.sid
and sessw.event like '%scattered%'
order by 1
/

La requête ci-dessus signalera toute analyse de table complète en cours dans la base de données. Vous pouvez trouver le nom de la table dans la requête ci-dessous

select segment_name
from dba_extents
where file_id = &fileid
and &block between block_id and block_id + blocks - 1
;

Si vous souhaitez voir l'historique de toutes les sessions en cours dans la base de données pour une analyse complète de la table, nous pouvons utiliser la requête ci-dessous

column user_process heading "Name |SID" format a20;
column long_scans heading "Long Scans" format 999,999,999;
column short_scans heading "Short Scans" format 999,999,999;
column rows_retreived heading "Rows Retrieved" format 999,999,999;
set linesize 1000
set timing on
select ss.username||'('||se.sid||') ' "USER_PROCESS",
sum(decode(name,'table scans (short tables)',value)) "SHORT_SCANS",
sum(decode(name,'table scans (long tables)', value)) "LONG_SCANS",
sum(decode(name,'table scan rows gotten',value)) "ROWS_RETRIEVED"
from v$session ss, v$sesstat se, v$statname sn
where se.statistic# = sn.statistic#
and (name like '%table scans (short tables)%'
or name like '%table scans (long tables)%'
or name like '%table scan rows gotten%' )
and se.sid = ss.sid
and ss.username is not null
group by ss.username||'('||se.sid||') '
order by LONG_SCANS desc
/

Si vous souhaitez trouver tout le SQL mis en cache dans le cache de la bibliothèque pour l'instruction d'analyse complète de la table

select sql_id,object_owner,object_name from V$SQL_PLAN where
operation='TABLE ACCESS' and
options='FULL' and
object_owner <> 'SYS';

Vous pouvez obtenir le texte intégral de sql_id en utilisant la requête ci-dessous

SELECT sql_text, parsing_schema_name, module
FROM v$sql
WHERE sql_id = '&1'

Comment éviter l'analyse complète de la table dans Oracle

L'analyse complète de la table n'est pas un mal nécessaire. L'optimiseur Oracle choisit le plan en fonction du point de données. S'il a choisi l'analyse complète des données, il l'a certainement trouvé bon. De plus, très souvent, l'analyse d'index peut ne pas être bonne pour la requête et elle est plus coûteuse que l'analyse complète de la table. Nous devons donc analyser en profondeur avant de prendre une décision sur l'analyse complète de la table

Voici quelques-uns des éléments à vérifier
(a) Statistiques obsolètes de l'optimiseur :veuillez vérifier si les statistiques de l'optimiseur disponibles dans les tableaux sont à jour et ne diffèrent pas beaucoup des données réelles
(b) Vérifiez les index et l'index facteur de clustering :il se peut que vous manquiez les bons index
(c) La requête utilise peut-être la clause parallèle et choisit donc l'analyse complète de la table comme plan optimal
(d) Paramètres incorrects pour Optimizer_mode,optimizer_index_cost_adj, optimiser_index_caching

Parfois, l'exécution de sql tuning advisor sur la requête aide

Articles connexes
plan d'explication dans oracle :tout sur le plan d'explication dans Oracle, comment lire le plan d'explication d'oracle pour les problèmes liés aux performances, comment trouver le plan d'explication pour la requête dans le curseur
ce qui est logique lu dans oracle :qu'est-ce que lecture logique dans Oracle et E/S physiques dans Oracle, quelle est la meilleure E/S logique et physique en termes de performances, requêtes pour trouver des lectures physiques. cache, comment la tâche de réglage sql est-elle créée et exécutée pour obtenir la recommandation
trouver des index sur une table dans oracle :consultez cet article pour trouver des requêtes sur la façon de trouver des index sur une table dans oracle, répertorier tous les index dans le schéma ,état de l'index, colonne d'index
variables de liaison dans oracle :la variable de liaison est l'espace réservé pour les valeurs dans sqlplus et PLSQL et elle est remplacée par des valeurs lorsque l'instruction est exécutée
comment vérifier le profil sql dans oracle : vérifier sur ce post sur la façon de vérifier le profil sql dans oracle, comment trouver le contenu de sql prof ile, comment déposer le profil sql