Domanda

Come uno sviluppatore di software e di un DBA aspirante, cerco di encorporate best practice quando disegno le mie database di SQL Server (il 99% del tempo il mio software si trova sulla cima di SQL Server). Faccio il miglior design possibile prima e durante lo sviluppo.

Ma, funzionalità proprio come qualsiasi altro sviluppatore di software, si aggiunge, insetti, e proprio cambiamento di requisiti che esige alterato / oggetti di database creati.

La mia domanda è, dovrebbe interrogare sintonizzazione essere proattivo o reattivo? In altre parole, un paio di settimane dopo un po 'pesante codice / modifica del database, devo solo mettere da parte un giorno per verificare le prestazioni delle query e ottimizzare in base al largo di che? Anche se sembra essere in esecuzione bene

O devo solo essere consapevoli del fatto che meno rispetto alla media delle prestazioni dovrebbe essere un controllo database e tornare alla lavagna proverbiale?

messa a punto di query può richiedere un sacco di tempo, e in base al progetto iniziale del database potrebbe essere benefici minimi. Sono curioso di vedere il modus operandi accettato.

È stato utile?

Soluzione

Sia, ma soprattutto propositivo

E 'importante prova durante lo sviluppo a fronte di volumi e la qualità dei dati realistici. E 'comune incredibilmente ad avere una query in esecuzione su uno sviluppatori di 100 o 1000 righe poi cadere piatto con 10 milioni di righe di produzione.

Ti permette di prendere appunti anche di "indice può aiutare in questo". Or "rivisitare me". O "risolverà con la nuova funzione di xxx nella prossima versione DB".

Tuttavia, un paio di domande non sarà resistere alla prova del tempo. cambiamenti di distribuzione dei dati o si va esponenziale perché l'ottimizzatore decide di utilizzare un diverso tipo di join. In questo caso, solo si può reagire.

Detto questo, per SQL Server, almeno, i vari "mancante indice" e "interrogare più lungo" query DMV possono indicare le aree problematiche prima che la chiamata di telefono

Modifica: per chiarire ...

Proactive non lo fa sintonia media ogni query ora. Significa ottimizzare ciò che è necessario (spesso correre) per un tempo di risposta ragionevole. Per lo più ignorare il report settimanale query 03:00 la domenica.

Altri suggerimenti

OK, mi mordo e avere una visione contrarian. Prima di tutto, vorrei dire non si dovrebbe mai iniziare facendo qualcosa che si sa vi condurrà nei guai. Se si desidera chiamare questo applicando le migliori pratiche, andare avanti. Questo è quanto essere proattivi dovrebbe andare.

Dopo di che, di tempo (e denaro di) un-sprecando così andare avanti con lui e consegnare il prodotto. Invece di prendere un sacco di domande di tuning fase di progettazione che possono o non possono mai rivelarsi colli di bottiglia, usare questo tempo per le prove extra, tra cui test di carico.

Quando si scopre che qualcosa non sta eseguendo fino alle vostre specifiche di progettazione, o se qualcosa sta cadendo nella parte inferiore del 10% o il 20% della lista del vostro profiler dei tempi di risposta, quindi investire il tempo necessario per modificare qualsiasi cosa è che è rotto.

In un perfetto mondo tutto sarebbe stato perfettamente progettato fin dall'inizio e sviluppato utilizzando una sequenza di generazione logica. Nel mondo reale ci sono vincoli di budget e di tempo ed i dati di prova potrebbe non finire per assomigliare i vostri dati di produzione. Per questa ragione, dico uso comune senso per la prevenzione proattiva dei problemi, ma concentrare i vostri risorse limitate punto le cose che si rivelano essere veri problemi invece di spendere tempo e denaro che probabilmente non si dispone sulla ricerca di problemi immaginari o potenziali.

Si sta andando a fare 3 tipi di accordatura, 1 reattivo e proattivo 2.

reattiva

Di punto in bianco, alcune partenze di query causando problemi. Potrebbe essere a causa di un bug di un'applicazione o una funzione, un tavolo in crescita in eccesso di aspettative, un picco di traffico, o la query optimizer ottenere "creativo". Questo potrebbe essere un oh-merda-the-site's-down tipo medio-of-the-notte della vicenda, o potrebbe essere in risposta al sistema di lentezza di natura non critico. In entrambi i casi, il carattere di definizione di sintonizzazione reattiva è che hai già un problema . Inutile dire che si vuole fare come poco di questo possibile. Il che ci porta a ...

proattiva

Tipo 1: Manutenzione

In una sorta di tabella di marcia, ogni pochi mesi o settimane a seconda di come spesso le modifiche dello schema e quanto velocemente i dati cresce, si dovrebbero rivedere l'uscita di strumenti di analisi delle prestazioni del vostro database (ad esempio AWR rapporti per Oracle DBA). Non Sei sguardo per le questioni incipienti, cioè cose che nel loro cammino verso che richiede la sintonizzazione reattivo, così come low-hanging fruit, gli elementi che non sono suscettibili di causare problemi presto, ma può migliorate con poco sforzo nella speranza di prevenire gran lunga problemi -future. Quanto tempo si dovrebbe spendere per questo dipenderà da quanto tempo hai, e che altro si potrebbe essere spesa su, ma la quantità ottimale è mai pari a zero. Tuttavia, si può facilmente ridurre la quantità è necessario spendere per fare di più ...

Tipo 2: corretta progettazione

monito di Knuth contro "ottimizzazione prematura" è ampiamente conosciuto e debitamente rispettato. Ma la corretta definizione di "prematura" deve essere utilizzato. Alcuni sviluppatori di applicazioni, quando il permesso di scrivere le proprie domande, hanno la tendenza ad adottare la prima interrogazione che hanno colpito su che è logicamente corretto, e pagare nessuna mente di sorta per le prestazioni, presente o futuro. Oppure possono prova contro un set di dati di sviluppo che semplicemente non è rappresentativo dell'ambiente di produzione (suggerimento: non fare questo gli sviluppatori dovrebbe sempre avere accesso ai dati realistici per i test!.). Il punto è che il momento giusto per sintonizzare una query è prima volta che viene viene distribuito, non quando si presenta in una lista di poveri prestazioni SQL, e sicuramente non quando causa un problema critico.

Allora, cosa si qualificherebbe come un ottimizzazione prematura in terreni DBA? In cima alla mia lista sarebbe sacrificare la normalizzazione senza un bisogno dimostrato. Certo si potrebbe mantenere una somma su una riga padre, piuttosto che il calcolo è in fase di esecuzione dalle righe figlio, ma non si ha realmente bisogno di? Se siete Twitter o Amazon, strategico de-normalizzazione e pre-calcolo può essere i vostri migliori amici. Se stai progettando una piccola banca dati di contabilità per 5 utenti, struttura adeguata per facilitare le esigenze di integrità dei dati per essere la massima priorità. Altre ottimizzazioni premature sono anche una questione di priorità. Non passare ore tweaking una query che viene eseguito una volta al giorno e impiega 10 secondi, anche se si pensa di poter tagliare a 0,1 secondi. Forse avete un rapporto che corre per 6 ore al giorno, ma di esplorare la pianificazione come un processo batch prima di investire tempo nella messa a punto esso. Non investire in una, in tempo reale, a parte replicati segnalazione esempio se il carico di produzione mai galleggia sopra il 10% (supponendo che si può gestire la sicurezza).

Per testare con i dati realistici, tenendo ipotesi plausibili in modelli di crescita e di traffico (più indennità per i picchi), e applicando la vostra conoscenza di stranezze ottimizzatore della vostra piattaforma, è possibile distribuire le query che run (vicino) in modo ottimale non solo ora, ma in futuro, e in condizioni tutt'altro che ideali. Quando si applica le tecniche adeguate, interrogare prestazione può essere previsto con precisione, e ottimizzato (nel senso di ogni essere componente veloce come deve essere).

(E già che ci sei, imparare le statistiche! )

In un mondo perfetto tutto messa a punto sarebbe stato fatto in fase di progettazione in modo proattivo e nulla sarebbe reattiva, ma il mondo non è perfetto. Troverete che i dati di test a volte non è rappresentativo, saranno stati mancati casi di test, i carichi saranno inaspettatamente diversa, e ci saranno bug che problemi di causa di prestazioni. Queste situazioni possono richiedere un po 'di messa a punto reattiva, ma questo non significa che la sintonizzazione reattivo è preferito. L'obiettivo dovrebbe sempre essere quello di recuperare questi in anticipo.

La pianificazione per la sintonizzazione retroattiva è molto pragmatico. Quando si esegue il test si dovrebbe documentare tempi attesi e throughput e, a volte dovrebbe effettivamente costruire in analisi che consente di sapere quando i processi di produzione non sono conformi alle specifiche di progetto. In questo modo si può essere in grado di identificare in anticipo ciò che il codice ha bisogno di essere sintonizzato. È quindi possibile determinare non solo quale sia il problema, ma perché tu non interferite nella / fase di test di progettazione.

Per quanto mi riguarda, il test delle prestazioni ha sempre fatto parte del processo di sviluppo. Vuoi cambiare questa tabella, alterare questo rapporto, aggiungere questa funzionalità? Come parte del test è assicurarsi che è possibile confrontare le prestazioni individuali e in generale per linee di base conosciuti e / o contro i requisiti (ad esempio alcuni rapporti operare in background o sono comunque automatizzati, quindi le prestazioni - o meglio la velocità - di ogni singola query nella sistema non è sempre la priorità assoluta).

secondo me, questo non dovrebbe essere un processo reattivo a tutti - non si dovrebbe mai aspettare fino a quando un cambiamento provoca un problema di prestazioni in produzione per iniziare a reagire ad essa. Quando si effettua il cambiamento di dev / test, ecc, si dovrebbe essere in prova tali modifiche con dati simili su hardware simile con le stesse applicazioni e modelli di utilizzo simili. Non lasciate che queste modifiche vengono precipitò fuori alla produzione e vi sorprenderà. Questo sarà quasi sempre accade quando non è conveniente per trascorrere una giornata di sintonia -. Budget per quel tempo la sintonizzazione con largo anticipo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top