Differenza tra livello riga e livello pagina blocco e conseguenze


10

Quando tento di eseguire il mio piano di manutenzione, ricevo il seguente errore:

L'esecuzione della query "" non è riuscita con il seguente errore: "L'indice" "(partizione 1) sulla tabella" "non può essere riorganizzato perché il blocco a livello di pagina è disabilitato."

Al momento abbiamo abilitato il blocco a livello di riga su questo indice. Posso abilitare il blocco a livello di pagina, ma non sono sicuro di quali siano le ripercussioni.

La mia domanda è: qual è la differenza tra i due schemi di blocco e quali sono le loro conseguenze nel mondo reale (nella produzione)?

Risposte:


14

L'esecuzione della query "" non è riuscita con il seguente errore: "L'indice" "(partizione 1) sulla tabella" "non può essere riorganizzato perché il blocco a livello di pagina è disabilitato."

Il piano di manutenzione deve tentare di RIORGANIZZARE ALTER INDEX, che è un'operazione online. Per rimuovere la frammentazione (pagine non in ordine), le pagine devono essere bloccate e spostate, il che non è possibile se i blocchi delle pagine sono stati disabilitati. L'unico modo per deframmentare senza i blocchi di pagina è bloccare l'intera partizione, il che non è possibile per REORGANIZE come solo online.

Qual è la differenza tra i due schemi di blocco e quali sono le loro conseguenze nel mondo reale (in produzione)?

È necessario capire quali sono un record e una pagina per valutare l'impatto della mancata accettazione di un determinato tipo di blocco. Se non si ha familiarità con gli interni di archiviazione di SQL Server, iniziare con Anatomy of a Record e Anatomy of a Page . In parole povere:

  • righe = record
  • le righe sono memorizzate in pagine di 8kb

Se dovessi modificare i tipi di blocco consentiti:

  • Disabilita blocchi pagina = Solo blocchi riga e tabella
  • Disabilita blocchi riga = Solo blocchi pagina e tabella
  • Disabilita entrambi = Solo blocchi tabella

Esistono due scenari di cui sono a conoscenza in cui può essere utile non consentire un tipo di blocco. Ciò non significa che non ce ne siano altri, speriamo che qualcun altro intervenga con degli esempi.

Una tabella di ricerca a cui si accede di frequente, che cambia di rado : disabilitando i blocchi a livello di pagina e di riga, tutti i lettori accetteranno un blocco di tabella condiviso. Questo è più veloce / più economico rispetto al solito intento condiviso sulla tabella, seguito da intento condiviso su una pagina e infine un blocco condiviso su una o più righe specifiche.

Prevenzione di uno scenario di deadlock specifico : se si verificano deadlock causati da processi simultanei che acquisiscono blocchi che si trovano spesso nella stessa pagina, la disattivazione dei blocchi di riga comporta invece l'esecuzione di blocchi di pagine. Solo un processo può quindi accedere alla pagina alla volta, l'altro deve attendere.

Il primo esempio è la micro-ottimizzazione e difficilmente produrrà benefici misurabili su un sistema tipico. Il secondo risolverà quel particolare scenario di deadlock ma potrebbe introdurre effetti collaterali imprevisti, ad esempio uccidere la concorrenza in una diversa sezione di codice. Difficile valutare completamente l'impatto, avvicinarsi con cautela!

L'impostazione predefinita è l'abilitazione di entrambi e ciò non deve essere modificato senza una buona causa.


9

Probabilmente niente. Sono sicuro che la SM lo sa meglio di te o di me

Ho lavorato su sistemi OLTP ad alto volume e non ho mai sentito la necessità di modificare le impostazioni. Un deadlock dovrebbe essere riprovato perché accadranno comunque

Citando dal blog di SQL Server Storage Engine, "Blocca escalation in SQL2005" n che vale comunque la pena leggere completamente.

Per impostazione predefinita, sono abilitati i blocchi ROW e PAGE ... SQL Server sceglie la granularità del blocco ROW nella maggior parte dei casi, ma può scegliere il blocco PAGE dove appropriato. Quindi, per il caso specificato, è probabile il blocco ROW. Non è possibile disattivare il blocco PAGINA a livello di database o istanza. Riscontri blocchi a causa dei blocchi PAGE?

Suppongo che se forzi solo i rowlock, allora consumerai risorse che potrebbero essere utilizzate in modo più efficace altrove. Se il tuo carico è abbastanza alto da essere importante, perché consumare memoria? L'articolo del blog approfondisce questo argomento

Ho il sospetto che ci sia qualche superstizione dietro questo, proprio come questi:


+1 ma: i deadlock nei sistemi OLTP possono essere evitati; il mio sistema funziona senza deadlock per mesi, anche se lo distribuiamo 2-3 volte a settimana.
AK
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.