Microsoft non ha l'abitudine di deprecare le cose in questi giorni, ma quando lo fanno, è per una ragione, e non è certamente perché vogliono renderti la vita più difficile. Al contrario, è quasi sempre perché hanno sviluppato modi migliori e più moderni per risolvere quegli stessi problemi.
Ma le abitudini sono difficili da rompere; chiedimi come lo so. Troppo spesso vedo persone aggrapparsi a un modo più vecchio di portare a termine un compito, anche se esiste un modo migliore.
Vorrei condividere un paio di esempi recenti che aiutano a illustrare come l'utilizzo di funzionalità obsolete di SQL Server continui a morderci. In questa prima parte voglio parlare di...
processi di sistema
La tabella di sistema sys.sysprocesses
è stato sostituito in SQL Server 2005 da una serie di viste a gestione dinamica (DMV), in particolare sys.dm_exec_requests
, sys.dm_exec_sessions
e sys.dm_exec_connections
. La documentazione ufficiale per sys.sysprocesses
avverte:
Un esempio recente
Di recente uno dei nostri team stava indagando su un problema di latenza del lettore di log. Prestiamo molta attenzione alla latenza qui, insieme a qualsiasi transazione di lunga durata, a causa dell'impatto a valle delle tecnologie che utilizzano il lettore di log, come i gruppi di disponibilità e la replica transazionale. I nostri primi avvisi vengono solitamente individuati su una dashboard che traccia la latenza del lettore di log rispetto alla durata della transazione (spiegherò i momenti in cui ho etichettato t0
e t1
a breve):
Hanno determinato, diciamo all'ora t0
, che una determinata sessione aveva una transazione aperta che bloccava il processo di lettura del registro. Per prima cosa hanno controllato l'output di DBCC INPUTBUFFER
, per cercare di determinare che cosa è durata questa sessione, ma i risultati hanno semplicemente indicato che hanno emesso anche altri batch durante la transazione:
event_type parameters event_info -------------- ---------- --------------- Language Event 0 SET ROWCOUNT 0;
Nota che DBCC INPUTBUFFER
ha anche un sostituto più capace nelle versioni moderne:sys.dm_exec_input_buffer
. E anche se non ha un avviso di ritiro esplicito, la documentazione ufficiale per il DBCC
comando ha questa leggera spinta:
Dopo aver ottenuto nulla dal buffer di input, hanno interrogato sys.sysprocesses
:
SELECT spid, [status], open_tran, waittime, [cpu], physical_io, memusage, last_batch FROM sys.sysprocesses WHERE spid = 107;
I risultati sono stati altrettanto inutili, almeno in termini di determinazione di ciò che la sessione stava facendo per mantenere aperta la transazione e interrompere il lettore di log:
Sto evidenziando il physical_io
colonna perché questo valore ha acceso una discussione sul fatto che volessero o meno rischiare di uccidere la sessione di sonno. L'idea era che, nel caso in cui tutti quegli I/O fisici fossero scritture, l'interruzione della transazione potrebbe comportare un rollback lungo e dirompente, peggiorando potenzialmente il problema. Non inserirò i tempi effettivi su questo, ma diciamo solo che si è trasformata in una conversazione prolungata e ha lasciato il sistema in questo stato dall'ora t0
al tempo t1
nel grafico sopra.
Perché questo è un problema
Il problema in questo caso specifico è che hanno passato quel tempo a contemplare una decisione basata su informazioni incomplete. Gli I/O sono letture o scritture? Se l'utente ha una transazione aperta e ha semplicemente letto molti dati, il rollback di quella transazione ha un impatto molto inferiore rispetto a se avesse cambiato molti dati. Quindi, invece di sys.sysprocesses
, vediamo qual è il DMV più moderno, sys.dm_exec_sessions
, può mostrarci questa sessione:
SELECT session_id, [status], open_transaction_count, cpu_time, [reads], writes, logical_reads, last_request_start_time, last_request_end_time FROM sys.dm_exec_sessions WHERE session_id = 107;
Risultati:
Qui vediamo che sys.dm_exec_sessions
suddivide l'I/O fisico separatamente in letture e scritture. Questo ci consente di prendere una decisione molto più informata, molto più rapidamente di t1 - t0
, sull'impatto di un potenziale rollback. Se l'I/O è tutto in scrittura, ea seconda di quanto è alto il numero, potremmo esitare un po' di più e magari passare il tempo a cercare di localizzare l'utente (così potremmo schiaffeggiargli le nocche o chiedere loro perché hanno una transazione aperta ). Se sappiamo che si tratta principalmente di letture, possiamo invece propendere per l'interruzione della sessione e il ripristino della transazione.
Certo, sys.sysprocesses
ha dbid
e waittime
. Ma dbid
è comunque inaffidabile e marginalmente utile, in particolare per le query tra database; ci sono informazioni molto migliori in sys.dm_tran_locks
. Le informazioni sull'attesa (tempo e ultimo tipo di attesa) sono disponibili in sys.dm_exec_requests
, ma informazioni molto più dettagliate sono disponibili in sys.dm_exec_session_wait_stats
(aggiunto in SQL Server 2016). Una scusa che sentivo spesso era quella sys.dm_exec_sessions
mancava open_tran
, ma open_transaction_count
è stato aggiunto nuovamente in SQL Server 2012. Quindi ci sono pochissime ragioni per pensare di usare sys.sysprocesses
oggi.
Se vuoi scoprire con quale frequenza sys.sysprocesses
è stato referenziato dall'ultimo riavvio di SQL Server, è possibile eseguire questa query sui contatori delle prestazioni DMV:
SELECT instance_name, cntr_value FROM sys.dm_os_performance_counters WHERE [object_name] LIKE N'%:Deprecated Features%' AND instance_name = N'sysprocesses' ORDER BY cntr_value DESC;
Se vuoi davvero evitare di dormire stanotte, o ti piace semplicemente aggiungere costantemente all'elenco delle cose di cui ti preoccupi, rimuovi il predicato contro instance_name
. Questo ti darà un'idea spaventosa e di alto livello di quante cose sono in esecuzione le tue istanze che alla fine dovrai cambiare.
Nel frattempo, vai a scaricare sp_WhoIsActive
, la procedura memorizzata ultra utile di Adam Machanic per il monitoraggio e la risoluzione dei problemi dei processi di SQL Server in tempo reale. Abbiamo distribuito questa procedura memorizzata in ogni istanza nel nostro ambiente e dovresti farlo anche tu, indipendentemente dagli altri strumenti di monitoraggio di fascia alta che potresti utilizzare.
La prossima volta
Nella parte 2 parlerò un po' di SQL Server Profiler, un'applicazione che le persone usano più per familiarità che altro, senza rendersi conto di quanto possa essere pericoloso.