sql >> Database >  >> RDS >> Oracle

Hoe de daadwerkelijke Oracle SQL-instructie te zien die wordt uitgevoerd?

Aan de kant van de datadictionary zijn er veel tools die u kunt gebruiken, zoals Schema Spy

Kijk naar views sys.v_$sql en sys.v_$sqltext om te zien welke query's worden uitgevoerd. Je hebt ook toegang nodig tot sys.all_users

Een ding om op te merken is dat query's die parameters gebruiken één keer verschijnen met items zoals

and TABLETYPE=’:b16’

terwijl anderen die dat niet doen meerdere keren zullen verschijnen, zoals:

and TABLETYPE=’MT’

Een voorbeeld van deze tabellen in actie is de volgende SQL om de top 20 diskread hogs te vinden. U kunt dit veranderen door het WHERE rownum <=20 . te verwijderen en misschien ORDER BY module . toevoegen . U zult vaak merken dat de module u een flauw idee geeft van welke software de query uitvoert (bijv.:"TOAD 9.0.1.8", "JDBC Thin Client", "[email protected] (TNS V1-V3)" enz.)

SELECT 
 module, 
 sql_text, 
 username, 
 disk_reads_per_exec, 
 buffer_gets, 
 disk_reads, 
 parse_calls, 
 sorts, 
 executions, 
 rows_processed, 
 hit_ratio, 
 first_load_time, 
 sharable_mem, 
 persistent_mem, 
 runtime_mem, 
 cpu_time, 
 elapsed_time, 
 address, 
 hash_value 
FROM 
  (SELECT
   module, 
   sql_text , 
   u.username , 
   round((s.disk_reads/decode(s.executions,0,1, s.executions)),2)  disk_reads_per_exec, 
   s.disk_reads , 
   s.buffer_gets , 
   s.parse_calls , 
   s.sorts , 
   s.executions , 
   s.rows_processed , 
   100 - round(100 *  s.disk_reads/greatest(s.buffer_gets,1),2) hit_ratio, 
   s.first_load_time , 
   sharable_mem , 
   persistent_mem , 
   runtime_mem, 
   cpu_time, 
   elapsed_time, 
   address, 
   hash_value 
  FROM
   sys.v_$sql s, 
   sys.all_users u 
  WHERE
   s.parsing_user_id=u.user_id 
   and UPPER(u.username) not in ('SYS','SYSTEM') 
  ORDER BY
   4 desc) 
WHERE
 rownum <= 20;

Merk op dat als de zoekopdracht lang is ... je v_$sqltext moet opvragen. Hiermee wordt de hele query opgeslagen. Je moet het ADDRESS en HASH_VALUE opzoeken en alle stukjes oppakken. Bijv.:

SELECT
 *
FROM
 sys.v_$sqltext
WHERE
 address = 'C0000000372B3C28'
 and hash_value = '1272580459'
ORDER BY 
 address, hash_value, command_type, piece
;


  1. Microsoft Access Tips en trucs deel 2 – Formulieren

  2. Hoe kan ik meerdere kolommen SELECTEREN binnen een CASE WHEN op SQL Server?

  3. DATEDIFF() geeft verkeerde resultaten in SQL Server? Lees dit.

  4. Gebruikers alleen toegang geven tot bepaalde tabellen in mijn inhoudsprovider