Einleitung Mit der Veröffentlichung von SQL Server 2016 Service Pack 1 ist die In-Memory ColumnStore-Technologie jetzt auch in den Standard-, Web - und sogar Express - und LocalDB-Editionen verfügbar. Neben dem Vorteil von nur 1 Codebasis zu pflegen, wird diese Änderung in der Politik auch eine klare Plattenspeicherplatz sparen aufgrund seiner hohen Daten-Deduplizierung und Kompression Ratios und nicht zuletzt seine auch eine ernsthafte Ad-hoc-Abfrage Leistung Booster Der Hauptunterschied zwischen den SQL-Varianten ist, wie viel CPU-Leistung und Speicher für Aufgaben wie den (Re-) Aufbau des Clustered ColumnStore Index zugewiesen werden. Zum Beispiel: Mit der Standard Edition wird ein einziger Core (max. 100 Prozessorzeit des sqlservr Prozesses) verwendet und das Abfragen eines CCI geschieht mit maximal 2 CPUs (MAXDOP2), abgesehen von der Nutzung aller verfügbaren CPUs in Enterprise Edition. Erstellen eines Cluster-ColumnStore-Index (CCI) mit SQL Server 2016 Standard Edition: Erstellen eines CCI mit allen 4 verfügbaren Cores mit SQL Server 2016 Enterprise Edition: Die Basiszeitpunkte für das Laden von 7.2 GB 60 Million Zeilen aus einer einzelnen TPCH-lineItem-Datei zeigen nicht viel Ein Unterschied zwischen den Aromen, wenn Bulk Einfügen der Daten direkt in eine Heap-Tabelle oder eine Tabelle mit einem CCI wird der Unterschied deutlich werden, wenn wir die Zeit zum Bau eines CCI auf einer Heap-Tabelle oder den Wiederaufbau eines CCI zu vergleichen: Zusammenfassend, die absolute Schnellste Weg, um Daten in einer Tabelle mit einem Clustered ColumnStore Index zu haben, ist: Laden in Heap erstellen die CCI anschließend mit SQL 2016 Ent. Ed. Direktes Laden in CCI Für Tabellen, in denen bereits ein Clustered ColumnStore Index erstellt wurde, stellen Sie sicher, dass Sie direkt in komprimierte Zeilengruppen streamen, um den Durchsatz zu maximieren. Um dies zu tun, sollte die Batch-Größe des Batches gleich oder größer als 100K Zeilen (genau 102400) sein. Kleinere Batches werden zuerst in komprimierte Deltastabellen geschrieben, bevor Tupel in die endgültigen komprimierten Row Group Segmente verschoben wird, was bedeutet, dass SQL Server die Daten zweimal berühren muss: Es gibt verschiedene Optionen zum Laden von Daten und wir gehen über die am häufigsten verwendeten Wie der Befehl Bulk Insert, BCP und SSIS. Lets sehen, was benötigt wird, um beste Leistung zu bekommen und wie zu überwachen 1) T-SQL-Bulk Insert Lassen Sie uns mit dem Befehl BULK INSERT starten: Prüfen der Anzahl der Zeilen, die bereits in die CCI geladen wurden, auch wenn Wird die Tabelle Sperren-Option verwendet, fragen Sie eine neue dmv mit dem Namen sys. dmdbcolumnstorerowgroupphysicalstats: Diese DMV wird auch zeigen, die möglichen Resource Group Staaten detaillierter beim Laden. Beim Laden von Daten gibt es vier mögliche Gruppengruppen. Wenn Sie sehen, dass der Zustand INVISBILE wie in der Abbildung unten bedeutet, dass Daten in eine RowGroup komprimiert werden. 1: OPEN160160160160160160160 (RowGroup akzeptiert neue Datensätze) 2: CLOSED160160160 (RowGroup wird gefüllt, aber noch nicht durch den Tupel-Mover-Prozess komprimiert) 3: COMPRESSED160 (RowGroup ist im Prozess, aus Daten im Delta - RowGroup wird gefüllt und komprimiert). 4 TOMBSTONE160 (RowGroup ist bereit, Müll gesammelt und entfernt werden) Durch die Festlegung der Batch-Größe mit einem Wert von 102400 oder höher erreichen Sie maximale Leistung und Daten werden gestreamt und direkt in seine endgültige RG komprimiert wird dieses Verhalten zeigt sich als COMPRESSED. Sie können auch ein DMV überprüfen, das mit SQL2014 eingeführt wurde, um den RowGroup-Status zu überprüfen, der die sys. columnstorerowgroups DMV ist: Testergebnis Masseneinfügung von Daten in eine Tabelle mit CCI über den Befehl Bulk Insert kann durch Hinzufügen der Batchsize102400 und TABLOCK-Optionen. Dies führt zu einer Verbesserung des Durchsatzes um 8. 2) BCP. exe Das BCP-Dienstprogramm wird noch ziemlich stark in vielen Produktionsumgebungen verwendet, damit es sich lohnt, es schnell zu überprüfen: standardmäßig sperrt das BCP 1000 Zeilen an der Zeit zu SQL Server. Die Zeit, die benötigt wird, um 7.2GB Daten über BCP zu laden: 530 Sekunden. Or160 113K rowssec Der RowGroup-Zustand zeigt NVISIBLE an, was bedeutet, dass bei den Standardeinstellungen der Delta Store verwendet wird. Um sicherzustellen, dass der BCP-Befehl die Daten direkt in die komprimierten RGs fließt, müssen Sie die Option batchsize b mit einem Wert von mindestens 102400 hinzufügen. Ich lief verschiedene Tests mit größeren Batchgrößen: bis zu 1048576, aber die 102400 gab mir am besten Ergebnis. BCP DB. dbo. LINEITEMCCI in F: TPCHlineitem. tbl S. - c - T - tquotquot - b 102400 h tablock Der RowGroup-Zustand zeigt nun COMPRESSED an, was bedeutet, dass wir den Delta Store und die Datenströme in die komprimierten RGs umgehen: Ergebnis: das BCP Abgeschlossen in 457 Sekunden oder 133K Zeilen pro Sekunde oder Beim Testen bemerkte ich, dass die Standardeinstellungen von SSIS 2016 Speicherpuffergrößen verwenden, die möglicherweise auch die Batchgröße auf weniger als 100K Zeilen beschränken können. Im Beispiel unten sehen Sie, dass die Daten in den Deltaspeichern gelandet sind: Die RG-Zustände sind geschlossen und die deltastorehobtid-Felder werden gefüllt, was bedeutet, dass die Delta-Speicher genutzt werden. Dies war der Augenblick zu erreichen und zu überprüfen, mit meinen Kollegen, die glücklicherweise haben, um dies zu bemerken und eine Lösung ist bereits vorhanden (siehe: Data Flow Puffer Auto Sizing Fähigkeit Vorteile Datenbelastung in CCI). Um die CCI-Streaming-Fähigkeiten voll auszuschöpfen, müssen Sie die Einstellungen für den Standard-Speicher BufferSize amp MaxRows erhöhen: Ändern Sie diese in 10x größere Werte: 8211 DefaultMaxBufferRows von 10000 in 1024000 und das wichtigste: 8211 DefaultBufferSize von 10485760 in 104857600. Hinweis: Die neue AutoAdjustBufferSize-Einstellung sollte auf True gesetzt sein, wenn Sie sehr breite Datenzeilen laden. Ändern Sie auch die Werte für den Zieladapter: 8211 Zeilen pro Batch: 160 von keinem in 102400 8211 Maximale Einfügungs-Commitgröße: von 2147483647 in 102400 Die mit SQL Server 2016 SP1 eingeführte Feature-Parität eröffnet eine völlig neue Palette von Möglichkeiten, von Hoffnung zu profitieren Die oben beschriebenen Komplettlösungen helfen Ihnen, die Bulk Insert-, BCP - und SSIS-Leistung zu maximieren, wenn Sie Daten in einen Clustered-ColumnStore-Index laden. Dies ist der schnellste Weg, um Daten aus einer Flatfile in eine Tabelle in SQL Server 2016 zu laden Post auf diesem Thema vor vielen Jahren, die Einführung von In-Memory-optimierte Tabellen und aktualisierbar Columnstore Tabellenindizes. Auch die Liste der zu transportierenden Datentransportfahrzeuge wächst: Neben BCP, dem T-SQL-Bulk-Insert-Befehl, dem SSIS als ETL-Tool und PowerShell gibt es einige neue, wie PolyBase, External R Script oder ADF. In diesem Beitrag werde ich mit der Überprüfung beginnen, wie viel schneller die neue langlebige amp nicht dauerhaft In-Memory-Tabellen sind die Festlegung der Baseline Für diese Tests Im mit einem Azure DS4V2 Standard VM mit 8 cores28 GB RAM und 2 Festplatten mit Host-Caching RW aktiviert. (Beide Luns bieten 275 MBsec RW-Durchsatz, obwohl die GUI eine Grenze von 60MBsec angibt). Ich habe eine einzelne 60 Million row7.2 Gigabyte TPCH lineitem flache Datei als Daten zu laden. Als Baseline für den Vergleich verwenden wir die Zeit, die es braucht, um die Datei in eine Heap-Tabelle zu laden: Dieser reguläre Bulk Insert Befehl vervollständigt innerhalb von 7 Minuten mit einem Durchschnitt von 143K rowssec. Aktivieren der Testdatenbank für speicheroptimierte Tabellen Die in SQL20142016 enthaltenen In-Memory-Tabellen sind für sehr schnelle OLTP mit vielen kleinen Transaktionen und hohen Parallelität ausgelegt, was eine ganz andere Art von Arbeitsauslastung als Masseneinfügung ist Aus Kuriositäten gibt es einen Versuch Es gibt 2 Arten von In-Memory-Tabellen: langlebig und nicht haltbar Tabellen. Die dauerhafte werden persist Daten auf der Festplatte, die nicht haltbar diejenigen nicht. Um diese Option zu aktivieren, müssen wir eine Haushaltung durchführen und ein schnelles Datenträgervolumen für das Hosting dieser Dateien zuweisen. Ändern Sie zuerst die Datenbank, um die Option Enthält MEMORYOPTIMIZEDDATA zu aktivieren, gefolgt von dem Hinzufügen eines Dateipfads und einer Dateigruppe, die die speicheroptimierten Tabellen enthält: Die dritte Sache zu tun ist, einen separaten Speicherpool der SQL Server-Instanz hinzuzufügen, damit sie alle beibehalten kann Die Daten, die wir in In-Memory-Tabellen von seinem Default-Speicherpool laden: Binden einer Datenbank an einen Speicherpool Die folgenden Schritte, um einen separaten Speicherpool zu definieren und eine Datenbank an sie zu binden, sind nachfolgend aufgeführt: Zusätzliche Speicher-Pools werden über den Server verwaltet SQL Resource Governor. Der vierte und letzte Schritt besteht darin, die Testdatenbank mit dem Befehl sys. spxtpbinddbresourcepool an den neuen Speicherpool zu binden.160 Damit die Bindung wirksam wird, müssen wir die Datenbank offline nehmen und wieder online holen. Sobald sie gebunden sind, können wir dynamisch die Speichermenge ändern, die ihrem Pool über den Befehl ALTER RESOURCE POOL PoolHk WITH (MAXMEMORYPERCENT 80) zugewiesen ist. Bulk Insert in Durable In-Memory-Tabelle Nun sind alle mit der Option In-Memory aktiviert, können wir eine in-Memory-Tabelle erstellen. Jede speicheroptimierte Tabelle muss mindestens einen Index (entweder einen Range - oder einen Hash-Index) aufweisen, die vollständig (wieder) im Speicher zusammengesetzt sind und niemals auf der Festplatte gespeichert sind. Eine dauerhafte Tabelle muss einen deklarierten Primärschlüssel haben, der dann durch den erforderlichen Index unterstützt werden kann. Um einen Primärschlüssel zu unterstützen, fügte ich der Tabelle eine zusätzliche Rownumber-ROWID1-Spalte hinzu: Das Angeben einer Batchgröße von 1 (bis zu 5) Million Zeilen für das Bulk-Insert-Kommando hilft, Daten auf der Festplatte zu halten, solange das Bulk-Insert aktiv ist (anstatt zu speichern Alles am Ende) damit minimiert Speicherdruck auf den Speicher-Pool PookHK wir geschaffen. Die Datenbelastung in die dauerhafte In-Memory-Tabelle schließt in 5 Minuten 28 Sekunden oder 183K Rowssec ab. Das ist eine okay Zeit aber nicht so viel schneller als unsere Grundlinie. Betrachtet man die sys. dmoswaitstats zeigt, dass die no.1 waitstat IMPPROVIOWAIT ist, die auftritt, wenn SQL Server wartet auf eine Bulk-Last IO zu beenden. Betrachten des Leistungsindikators Bulk-Kopie Rowssec und Disk Write Bytessec zeigt das Spülen auf 275-MBsec-Plattenspitzen an, sobald eine Charge eingegangen ist (die grünen Spikes). Das ist das Maximum von dem, was die Platte liefern kann, aber nicht alles erklärt. Angesichts des geringen Gewinns werden wir diese für zukünftige Untersuchungen parken. Überwachen des Speicher-Pools Über die sys. dmresourcegovernorresourcepools dmv können wir überprüfen, ob unsere In-Memory-Tabelle den neu erstellten PoolHK-Speicher nutzt Pool: Der Ausgang zeigt an, dass die 7.2GB (einige extra für die Rowid) unkomprimiert in den Speicher geladen wurden PoolHk pool: Wenn Sie versuchen, mehr Daten zu laden, als Sie dem Pool zur Verfügung stehen, erhalten Sie eine korrekte Nachricht wie diese: Die Anweisung wurde beendet. Msg 701, Ebene 17, Status 103, Zeile 5 In dem Ressourcenpool 8216PookHK ist nicht genügend Arbeitsspeicher vorhanden, um diese Abfrage auszuführen. Um eine Ebene tiefer bei der Speicherplatzzuweisung auf einer Tabelle pro In-Speichertabelle auszusehen, können Sie die folgende Abfrage ausführen (aus dem SQL Server In-Memory OLTP-Interne für SQL Server 2016-Dokument): Die Daten, die wir gerade geladen haben, werden als Varheap-Struktur mit einem Hash-Index: Bisher so gut Jetzt können wir weitergehen und überprüfen, wie Staging in einer nicht dauerhaften Tabelle führt Bulk Insert in nicht-dauerhafte In-Memory-Tabelle Für IMND-Tabellen brauchen wir nicht einen Primärschlüssel, so dass wir nur Hinzufügen und Nicht-Cluster-Hash-Index und setzen DURABILITY SCHEMAONLY. Der Bulk-Einsatz Das Laden von Daten in die nicht dauerhafte Tabelle ist innerhalb von 3 Minuten mit einem Durchsatz von 335 K rowssec abgeschlossen (vs. 7 Minuten). Dies ist 2,3 mal schneller als das Einfügen in eine Heap-Tabelle. Herkömmlicherweise ist SSIS der schnellste Weg, um eine Datei schnell in SQL Server zu laden, da SSIS alle Daten verarbeiten wird, die vorverarbeitet werden, damit die SQL Server-Engine kann Verbringen ihre CPU-Ticks auf die Daten auf der Festplatte. Wird dies immer noch der Fall sein, wenn das Einfügen der Daten in eine nicht dauerhafte Tabelle Unter einer Zusammenfassung der Tests, die ich mit SSIS für diesen Post lief: die SSIS Fastparse-Option und160 die DefaultBufferMaxRows und DefaultBufferSize-Einstellungen sind die wichtigsten Performance Booster. Auch der Native OLE DB (SQLOLEDB.1) Provider führt etwas besser als der SQL Native Client (SQLNCLI11.1). Wenn Sie SSIS und SQL Server nebeneinander ausführen, wird die Erhöhung der Netzwerkpaketgröße nicht benötigt.160160 Net Ergebnis: ein grundlegendes SSIS-Paket, das eine flache Dateiquelle liest und die Daten direkt über ein OLE DB-Ziel in die Non-Durable-Tabelle schreibt Ähnelt dem Befehl Bulk Insert in eine IMND-Tabelle: Die 60 Millionen Zeilen werden in 2 Minuten 59 Sekunden oder 335 KB rowssec geladen, identisch mit dem Befehl Bulk insert. SSIS mit Balanced Data Distributor Aber wait8230160 die In-Memory-Tabellen sind entworfen, um Lock-Amp-Latch frei, so dass dies bedeutet, dass wir Daten auch über mehrere Streams laden können Das ist leicht zu erreichen mit SSIS der Balanced Data Distributor bringt genau das (die BDD Wird im Common-Abschnitt der SSIS-Toolbox aufgelistet) Hinzufügen der BDD-Komponente und Einfügen der Daten in die gleiche Non-Durable-Tabelle mit 3 Streams bietet den besten Durchsatz: Wir sind jetzt bis zu 526000 Rowssec Betrachten dieser sehr flachen Linie mit nur 160 der CPU-Zeit, die von SQLServer verwendet wird, scheint es, wir schlagen einige Engpass: Ich schnell versucht, kreativ zu sein durch die Nutzung der Modulo-Funktion und fügte 2 weitere Datenströme im Paket (jeder Verarbeitung 13 der Daten) 160, aber es ist nicht besser Viel (1 min52sec) so ein großes Thema für eine Zukunft zu untersuchen post160160 Die In-Memory Nicht-Durable Tabelle Option bringt einige ernsthafte Leistungsverbesserungen für das Staging von Daten laden Daten 1,5x schneller mit einem regulären Masseneinsatz und bis zu 3,6x mal schneller Mit SSIS. Diese Option, die hauptsächlich zur Beschleunigung von OLTP entwickelt wurde, kann auch einen großen Unterschied machen, um das Batch-Fenster schnell zu verkleinern (Fortsetzung) Aktualisieren der SQL Server-Tabellenstatistik für den Performance-Kick Der RANGEHIKEY zeigt den höchsten Wert für diesen Schlüsselbereich an. Das RANGEROWS zeigt die Anzahl der Datensätze zwischen dem RANGEHIKEY-Wert und dem neuen RANGEHIKEY-Wert an. Die EQROWS ist die geschätzte Anzahl von Zeilen, die dem RANGEHIKEY-Wert entsprechen. Der DISTINCTRANGEROWS-Wert ist die geschätzte Anzahl der verschiedenen Werte zwischen dem aktuellen RANGEHIKEY und dem nächsten RANGEHIKEY. Die AVGRANGEROWS ist die geschätzte Anzahl von doppelten Werten zwischen dem aktuellen RANGEHIKEY und dem nächsten RANGEHIKEY. Wenn Sie große Bereiche mit wenigen Datensätzen haben, müssen Sie möglicherweise den Scan-Prozentsatz Ihres Index anpassen. Wie Sie vielleicht aus diesem Tipp gesammelt haben, können statistische Aktualisierung und Abstimmung eine sehr komplexe Aufgabe sein. Wenn sie korrekt ausgeführt wird, kann sie das zusätzliche Bit der Leistung bereitstellen, das das System unter der Standardstatistikkonfiguration nicht bereitgestellt hat. Diese Techniken ermöglichen es Ihnen, die Leistung von SQL Server zu steigern und eine Rückgabe für jeden in Ihre SQL Server-Infrastruktur investierten Dollar zu erhalten. ÜBER DEN AUTOR Denny Cherry hat über ein Jahrzehnt Erfahrung bei der Verwaltung von SQL Server, einschließlich MySpaces über 175 Millionen Benutzer-Installation, einer der größten in der Welt. Dennys Bereiche der technischen Expertise gehören Systemarchitektur, Performance-Tuning, Replikation und Fehlerbehebung. Denny nutzt diese Fähigkeiten regelmäßig in seiner aktuellen Rolle als Sr. Database Administrator und Architect bei Awareness Technologies. Denny ist ein langjähriges Mitglied von PASS und Quest Softwares Association von SQL Server Experts und hat zahlreiche technische Artikel über SQL Server-Management geschrieben. Dies wurde zuletzt im Oktober 2007 veröffentlicht Dig Deeper auf Microsoft SQL Server Performance Monitoring und Tuning Finden Sie mehr PRO-Inhalte und andere Mitglied nur bietet, hier. E-Handbook Konversation starten 0 Kommentare Ihr Passwort wurde gesendet an: Mit der Absendung stimmen Sie zu, E-Mails von TechTarget und seinen Partnern zu erhalten. Wenn Sie sich außerhalb der Vereinigten Staaten aufhalten, stimmen Sie zu, dass Ihre personenbezogenen Daten in die Vereinigten Staaten übertragen und verarbeitet werden. Datenschutz Bitte erstellen Sie einen Benutzernamen zum Kommentieren.
No comments:
Post a Comment