2009-06-18 4 views
7

Ich habe eine Kimball-Stil DW (Fakten und Dimensionen in Sternmodellen - keine spät ankommenden Fakten Zeilen oder Spalten, keine Spalten in Dimensionen außer Verfall als ändern Teil der sich langsam ändernden Dimensionen des Typs 2) mit umfangreicher täglicher Verarbeitung zum Einfügen und Aktualisieren von Zeilen (an neuen Daten) und monatlichen und täglichen Berichtsprozessen. Die Fakttabellen sind durch die Daten für die einfache Rollback alter Daten partitioniert.In einem Data Warehouse-Szenario gibt es einen Nachteil bei der Verwendung von WITH (NOLOCK)

Ich verstehe die WITH(NOLOCK) uncommitted auszulesenden Daten führen kann, weiß ich nicht aber auch alle Sperren erstellen möchten, die die ETL-Prozesse zu versagen oder zu blockieren verursachen würde. Wenn wir vom DW lesen, lesen wir in allen Fällen von Faktentabellen für ein Datum, das sich nicht ändert (die Faktentabellen sind nach Datum partitioniert), und für Dimensionstabellen, für die keine Attribute für die Fakten geändert werden sie sind verbunden mit.

Also - gibt es irgendwelche Nachteile? - vielleicht in den Ausführungsplänen oder in der Operation von solchen SELECT -nur Abfragen, die parallel von den gleichen Tabellen laufen.

+0

verwandt. http://stackoverflow.com/questions/20047/diagnosing-deadlocks-in-sql-server-2005 –

Antwort

2

Solange es keine no-update Daten gibt, ist es kein Schaden, aber ich würde mich wundern, wenn es auch viel Nutzen ist. Ich würde sagen, es ist einen Versuch wert. Das Schlimmste, was passieren wird, ist, dass Sie unvollständige und/oder inkonsistente Daten erhalten, wenn Sie sich in der Mitte einer Batch-Einfügung befinden, aber Sie können entscheiden, ob das irgendetwas Nützliches ungültig macht.

+0

Die Fakt-Zeilen, die wir lesen, werden sich nicht ändern und die Dimensionszeilen werden immer gültig sein, aber sie können abgelaufen sein und ein neues Dimension für neue Fakten geschaffen. –

+0

Scheint mir völlig geradlinig. Ich habe nur zwei Fragen. 1. Gibt es ein Problem mit der Art, wie es läuft, ohne diese Änderung vorzunehmen (d. H., Dies ist möglicherweise eine vorzeitige Optimierung). 2. Dies sind alles nur Lese-Abfragen und Sie entspannen ihre Isolationsstufen. Was für eine schlimme Sache (abgesehen von der offensichtlichen Zartheit der Ergebnisse, die Sie offensichtlich durch die Betonung von Anhängen und Fakten-Versioning abmildern), stellen Sie sich vor? – dkretz

+0

Ich habe nicht die Kontrolle über das ETL, aber ich bin für das gesamte Reporting verantwortlich. Ich habe keinen Zugriff auf sp_who, also muss ich proaktiv sicherstellen, dass meine gesamte (signifikante) Verarbeitung die tägliche und monatliche Belastung nicht beeinträchtigt, bevor sich die DBAs beschweren, dass ich sie blockiere. –

1

Ja. Ihr SQL wird viel weniger lesbar sein. Sie werden unweigerlich einige NOLOCK-Hinweise verpassen, weil SQL SELECT-Befehle, die die NOLOCK-Strategie verwenden, es überallhin mitnehmen müssen.

You can get the same thing by setting the isolation level

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Am Ende erhalten Sie eine 10% Leistungssteigerung (sorry, ich bin zu faul, um den Artikel für sie zu sehen, aber es ist da draußen)

I‘ d sagen, ein 10% Gewinn ist es nicht wert, Lesbarkeit zu reduzieren.

+0

+1 für die Einstellung der Isolationsstufe, aber "mit Nolock" ist besser als nichts. Es ist keine 10% Sache, so viel wie es läuft oder nicht. –

+0

Ich werde darüber nachdenken. Es gibt andere Operationen auf der Verbindung (d. H. Meine Prozesskonfigurations- und Statusdaten, nicht die fact/dim-Stern-modellierten Daten), die ich nicht unbedingt so haben möchte. Zu diesem Zeitpunkt habe ich WITH (NOLOCK) in den Ansichten zentralisiert, die die Sternmodelle in der DW-Datenbank umschließen und glätten. –

1

Wenn es möglich ist, die gesamte Datenbank schreibgeschützt zu machen, dann ist dies eine bessere Option. Sie erhalten Lese-Nicht-Commit-Leistung, ohne Ihren gesamten Code ändern zu müssen.

ALTER DATABASE adventureworks SET read_only 
+0

Die DW-Datenbank ist für meinen Benutzer bereits schreibgeschützt, muss jedoch für die ETL-Prozesse beschreibbar sein, um neue Daten in die Fakten (und ggf. Dimensionen) zu laden. Meine Datenbank enthält meine Prozessprozeduren und Konfiguration. –

+0

Ich denke, es funktioniert nur, wenn die db nur der Benutzer nicht gelesen wird. Vielleicht in Betracht ziehen, die Datenbank aus & in read_only als Teil der ETL zu ändern –

+0

Vielleicht eine schreibgeschützte Dateigruppe? –

5

Dies ist, was Sie wahrscheinlich benötigen:

`ALTER DATABASE Adventure SET READ_COMMITTED_SNAPSHOT ON;

ALTER DATENBANK AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON; `

Dann gehen Sie vor und

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

in Ihren Abfragen verwenden. Nach BOL:

Das Verhalten von READ COMMITTED auf der Einstellung der READ_COMMITTED_SNAPSHOT Datenbankoption ab:

Wenn READ_COMMITTED_SNAPSHOT auf OFF (Standardeinstellung) gesetzt ist, verwendet die Database Engine gemeinsame Sperren andere Transaktionen zu verhindern, Modifizieren Zeilen, während die aktuelle Transaktion eine Leseoperation ausführt.Die gemeinsam genutzten Sperren blockieren auch, dass die Anweisung Zeilen liest, die von anderen Transaktionen geändert wurden, bis die andere Transaktion abgeschlossen ist. Der freigegebene Sperrtyp bestimmt, wann er freigegeben wird. Zeilensperren werden freigegeben, bevor die nächste Zeile verarbeitet wird. Seitensperren werden freigegeben, wenn die nächste Seite gelesen wird, und Tabellensperren werden freigegeben, wenn die Anweisung abgeschlossen ist.

Wenn READ_COMMITTED_SNAPSHOT auf ON festgelegt ist, verwendet das Datenbankmodul die Zeilenversionsverwaltung, um jede Anweisung mit einem transaktionskonsistenten Snapshot der Daten zu versehen, wie sie am Anfang der Anweisung vorhanden waren. Sperren werden nicht verwendet, um die Daten vor Aktualisierungen durch andere Transaktionen zu schützen.

Hoffe diese Hilfe. Raj

+0

Ich werde darüber nachdenken. Es gibt andere Operationen auf der Verbindung (d. H. Meine Prozesskonfigurations- und Statusdaten, nicht die fact/dim-Stern-modellierten Daten), die ich nicht unbedingt so haben möchte. –

2

Haben Sie darüber nachgedacht, eine DATABASE SNAPSHOT Ihres DW zu erstellen und Ihre Berichte daraus zu erstellen?

+0

Nein, das ist nicht wirklich möglich, da es sich um mehrere TB Daten handelt. Das DW ist für diesen Zweck ausgelegt, weshalb die Faktentabellen nach Datum partitioniert sind. –

+0

Ein Datenbank-Snapshot ist jedoch eine Sparse-Datei mit einer Semantik zum Schreiben auf eine Kopie. Alles, was Sie benötigen, ist der Speicherplatz auf der Festplatte, der reserviert werden soll. E/A-Vorgänge werden nur ausgeführt, wenn ein Schreibvorgang in der ursprünglichen Datenbank ausgeführt wird. –

0

NOLOCK führt einen "schmutzigen Lesevorgang" durch (unanständig LESEN UNKOMMITTIERT macht dasselbe wie NOLOCK). Wenn die Datenbank während des Lesens aktualisiert wird, besteht die Gefahr, dass inkonsistente Daten zurückgegeben werden. Die einzige Option besteht darin, entweder das Sperren und damit das Blockieren zu akzeptieren oder eine der beiden neuen Isolationsstufen zu wählen, die in SQL 2005 ab discussed here angeboten werden.

+0

Es sind keine Einfügungen oder Aktualisierungen der Daten möglich. Die einzigen Änderungen sind zukünftige Daten, die wir erst lesen, wenn die Verarbeitung abgeschlossen ist. –

+0

Dann ist NOLOCK die richtige Lösung. –

Verwandte Themen