Domanda

Ho un DW in stile Kimball (fatti e dimensioni nei modelli a stella - nessuna riga o colonna di fatti in arrivo in ritardo, nessuna colonna che cambia di dimensioni tranne la scadenza come parte delle dimensioni che cambiano lentamente di Tipo 2) con una pesante elaborazione giornaliera da inserire e aggiorna le righe (in nuove date) e i processi di reporting mensili e giornalieri. Le tabelle dei fatti sono suddivise in base alle date per facilitare il rolloff dei vecchi dati.

Comprendo che WITH (NOLOCK) può causare la lettura di dati senza commit, tuttavia, non desidero creare alcun blocco che causi il fallimento o il blocco dei processi ETL.

In tutti i casi, quando leggiamo dal DW, leggiamo dalle tabelle dei fatti per una data che non cambierà (le tabelle dei fatti sono partizionate per data) e le tabelle delle dimensioni che non avranno attributi che cambiano per i fatti che sono collegati a.

Quindi - ci sono degli svantaggi? - forse nei piani di esecuzione o nel funzionamento di tali SELECT - solo query eseguite in parallelo dalle stesse tabelle.

È stato utile?

Soluzione

Finché non ci sono dati senza aggiornamenti, non c'è nulla di male, ma sarei sorpreso se ci fossero molti vantaggi. Direi che vale la pena provare. Il peggio che accadrà è che otterrai dati incompleti e / o incoerenti se sei nel mezzo di un inserimento batch, ma puoi decidere se ciò invalida qualcosa di utile.

Altri suggerimenti

Questo è probabilmente ciò di cui hai bisogno:

`ALTER DATABASE AdventureWorks     SET READ_COMMITTED_SNAPSHOT ON;

ALTER DATABASE AdventureWorks     SET ALLOW_SNAPSHOT_ISOLATION ON; `

Quindi vai avanti e usa

IMPOSTA IL LIVELLO DI ISOLAMENTO DELLE TRANSAZIONI LEGGI IMPEGNATO

nelle tue query. Secondo BOL:

Il comportamento di READ COMMITTED dipende dall'impostazione dell'opzione di database READ_COMMITTED_SNAPSHOT:

Se READ_COMMITTED_SNAPSHOT è impostato su OFF (impostazione predefinita), il Motore di database utilizza i blocchi condivisi per impedire ad altre transazioni di modificare le righe mentre la transazione corrente sta eseguendo un'operazione di lettura. I blocchi condivisi impediscono inoltre all'istruzione di leggere le righe modificate da altre transazioni fino al completamento dell'altra transazione. Il tipo di blocco condiviso determina quando verrà rilasciato. I blocchi di riga vengono rilasciati prima dell'elaborazione della riga successiva. I blocchi di pagina vengono rilasciati quando viene letta la pagina successiva e i blocchi di tabella vengono rilasciati al termine dell'istruzione.

Se READ_COMMITTED_SNAPSHOT è impostato su ON, il Motore di database utilizza il controllo delle versioni delle righe per presentare ogni istruzione con un'istantanea transazionalmente coerente dei dati come esisteva all'inizio dell'istruzione. I blocchi non vengono utilizzati per proteggere i dati dagli aggiornamenti di altre transazioni.

Spero che questo aiuto. Raj

Hai considerato la creazione di un DATABASE SNAPSHOT del tuo DW e esegui i tuoi rapporti?

Sì. Il tuo SQL sarà molto meno leggibile. Inevitabilmente ti mancheranno alcuni suggerimenti NOLOCK perché i comandi SQL SELECT che utilizzano la strategia NOLOCK devono metterli ovunque.

Puoi ottenere la stessa cosa impostando il livello di isolamento

IMPOSTA LIVELLO ISOLAMENTO TRANSAZIONE LEGGI UNCOMMITTED

Alla fine ottieni un aumento delle prestazioni del 10% (scusa se sono troppo pigro, cerca l'articolo per questo, ma è là fuori)

Direi che un guadagno del 10% non vale la pena ridurre la leggibilità.

Se è possibile rendere l'intero database di sola lettura, questa è un'opzione migliore. Otterrai prestazioni senza lettura senza dover modificare tutto il codice.

ALTER DATABASE adventureworks SET read_only

NOLOCK esegue una & # 8216; lettura sporca & # 8217; (indecentemente READ UNCOMMITTED fa la stessa cosa di NOLOCK). Se il database viene aggiornato durante la lettura, esiste il pericolo che si ottengano dati incoerenti. L'unica opzione è accettare il blocco e quindi il blocco o scegliere uno dei due nuovi livelli di isolamento offerti da SQL 2005 in poi discusso qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top