martedì 21 settembre 2010
Recupera Query Eseguite
--SELECT * FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
giovedì 22 luglio 2010
martedì 11 maggio 2010
Query Malefiche
La seguente query SQL individua le ultime query effettuate a sistema di tutti gli utenti che risultano malefiche per il sistema (Malefiche non è una parola composta).
SELECT
st.text,
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) as statement_text,
execution_count,
case
when execution_count = 0 then null
else total_logical_reads/execution_count
end as avg_logical_reads,
last_logical_reads,
min_logical_reads,
max_logical_reads,
case
when execution_count = 0 then null
else total_logical_writes/execution_count
end as avg_logical_writes,
last_logical_writes,
min_logical_writes,
max_logical_writes,
max_elapsed_time
FROM sys.dm_exec_query_stats as qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st
ORDER BY max_logical_reads DESC
domenica 9 maggio 2010
FIND('-') (il Mito). Perchè?
- FINDFIRST
- FINDLAST
- FINDSET([ForUpdate][, UpdateKey])
introdotte per sostituire la funzione FIND([Which]). Il FIND presenta una serie di svantaggi come :
- l'utilizzo di cursori dinamici per il recupero di dati
- restituisce tutto il recordset dei dati della tabella interessata, anche se a noi interessa solo un record. (in questo modo proprio per aver utilizzato i cursori creati e deallocati si ha uno spreco di risorse come occupazione di memoria,CPU,TempDB).
- se non dichiarato il find non capisce se deve recuperare i dati i modalità lock o readuncommited.
il FINDFIRST ed il FINDLAST non utilizzano i cursori. Il FINDSET permette di recuperare da SQL solo il numero di record dichiarato nel recordset del DB.
NOTA: il RecordSEt di default a partire dalla versione NAV 6.0 è stato impostato a 50 mentre nelle precedenti era a 500. Bisogna arrivare ad un compromesso sul numero di record da restituire ad un repeat..until. Si rischia di fa ripetere troppe volte la query di recupero dei dati e l'allocazione di memoria. Esempio: supponiamo di effettuare il
rec.findset(false,false) repeat.. until se la tabella rec. restituisce circa 1000 record un recordset impostato a 50 deve effettuare circa 20 chiamate al DB , allocare e deallocare il cursore ed interessare non da poco l'NDBCS.
L'ISEMPTY la funzione piu veloce del west! indica con un valore booleano di ritorno se la tabella è piena o è vuota in base hai filtri indicati. Non ha bisogno di settare la chiave per filtrarsi. Utilizza le statistiche delle chiavi della tabella. Esempio:
- SELECT TOP 1 NULL FROM "CRONUS$G/L Entry" WITH (READUNCOMMITTED) WHERE ("Posting Date"= '2010-01-01')
Presentazione
Ognuno di noi è portatore di conoscenza (il fuoco). Ognuno di noi può condividere la prorpia conoscenza commentando i post che saranno presentati nel Blog.