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è?

E' noto a tutti che a partire dalla versione nav 4.00 SP1 sono stati introdotti le seguenti funzionalità:
  1. FINDFIRST
  2. FINDLAST
  3. FINDSET([ForUpdate][, UpdateKey])

introdotte per sostituire la funzione FIND([Which]). Il FIND presenta una serie di svantaggi come :

  1. l'utilizzo di cursori dinamici per il recupero di dati
  2. 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).
  3. 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

Prometeo: Colui che rubò il fuoco eterno agli Dei per donarlo agli umani.

Ognuno di noi è portatore di conoscenza (il fuoco). Ognuno di noi può condividere la prorpia conoscenza commentando i post che saranno presentati nel Blog.