Server2014-Das ist neu(Teil 2)

January 30, 2018 | Author: Anonymous | Category: Ingenieurwissenschaften, Informatik, Datenbank
Share Embed Donate


Short Description

Download Server2014-Das ist neu(Teil 2)...

Description

Backend Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

SQL Server 2014: Das ist neu, Teil 2

Ent(b)lockungskur Eine der größten Neuerungen im SQL Server 2014 ist In-Memory OLTP. Es soll die Datenbank-Engine im SQL Server revolutionieren, da sämtliche Transaktionen direkt im Hauptspeicher ohne Locking & Blocking durchgeführt werden. Auf einen Blick

Klaus Aschenbrenner bietet SQL Server Consulting Services für Unternehmen in ganz Europa an. Er beschäftigt sich seit Jahren mit der WindowsProgrammierung und seit 2000 mit dem .NET Framework. 2­ 004 und 2005 wurde er für sein Engagement als Microsoft MVP ausgezeichnet. Nähere Informationen zu seiner Person finden Sie auf www.SQLpassion.at.

I

n-Memory OLTP ist das Schlagwort im SQL Server 2014: Microsoft versucht mit InMemory OLTP (OLTP = Online Transaction Processing) die relationale Datenbank-Engine im SQL Server neu zu erfinden und verspricht eine bis zu 100-fache Performance-Verbesserung (daher auch der Codename Hekaton = Griechisch für hundert). Klingt vielversprechend. Aber was verbirgt sich eigentlich hinter In-Memory OLTP, warum brauchen wir eine solche neue Technologie, und mit welchen Fallstricken muss man rechnen? In diesem Artikel werden Sie zunächst sehen, was In-Memory OLTP ist und warum eine solche neue Technologie für eine relationale Datenbank-Engine wie den SQL Server wichtig ist. Anschließend tauchen wir Schritt für Schritt in In-Memory OLTP ein und Sie lernen, wie Sie es gewinnbringend in Ihren eigenen Datenbanken einsetzen können – oder auch nicht ...

Inhalt

Warum In-Memory OLTP?

▸ Warum brauchen wir InMemory OLTP? ▸ Memory Optimized Tables. ▸ Native Compiled Stored Procedures. ▸ Lock & Latch Free Data Structures.

Als Erstes möchte ich Ihnen zeigen, warum eine solche neue Technologie im SQL Server notwendig ist und welches die Hintergründe sind. Relationale Datenbanken können aus verschiedenen Gründen ausgebremst werden: ◼ L  angsames mechanisches Storage. ◼ S  SD-Storage ist extrem teuer. ◼ C  PU-Taktraten sind auf zirka 3 GHz beschränkt. ◼ R  elationale Datenbanken skalieren nicht unendlich.

Serie 1. Mehr Platz im Pool 2. Ent(b)lockungskur

dnpCode A1405SQLServer2014

60

Sehen wir uns die einzelnen Punkte genauer an. Wenn Sie Storage-Subsysteme im Einsatz haben, die traditionelle mechanische Festplatten nutzen, wissen Sie sehr gut, dass Ihre Performance katastrophal ist. Unsere CPUs sind über die Zeit immer schneller und schneller geworden, Hauptspeicher hat Latenzzeiten von Nanosekunden. Und dann werden unsere Daten auf Festplatten gespeichert, wo mechanisch ein Schreib-/Lesekopf bewegt werden muss und die einzelnen Platten rotieren – die Latenzzeiten bewegen sich hier im Millisekundenbereich. Tausende Male langsamer als Zugriff auf den Hauptspeicher ... Auf der anderen Seite spricht schon fast jeder über SSD-Storage-Systeme, die auf Flash-Tech-

nologie basieren und uns ohne mechanische Komponenten Latenzzeiten im Nanosekundenbereich versprechen. Der einzige Nachteil daran ist der eher hohe Preis. Wenn Sie einen Blick auf Hauptspeichermodule (RAM) werfen, kann damit die gleiche Performance zu einem niedrigeren Preis erzielt werden, als das mit SSDs möglich wäre. Darum ist es auch schon jetzt ganz wichtig, dem SQL Server so viel Hauptspeicher wie möglich zuzuweisen, damit so viele Daten wie möglich gecacht werden können. Können Sie sich noch an Ihre erste CPU erinnern? Bei mir war das ein Intel-486-DX2Prozessor. Laut Moore's Law sollte sich die Zahl der Transistoren in Mikroprozessoren alle 18 bis 24 Monate verdoppeln. Die derzeit schnellsten Prozessoren (ohne Übertaktung) laufen bei zirka 3 GHz. Früher ging man davon aus, dass sich das immer weiter steigern lässt: 4, 5, 6, 7, 8 GHz und so weiter. Aber die Realität hat uns anderes gelehrt. Denn mit der Zahl der Transistoren nimmt auch die Entwicklung von Wärme zu, die nicht mehr effektiv abgeführt werden kann. Dadurch stehen wir jetzt bei etwa 3 GHz. Mehr geht nicht. Aber auch dieses Problem wurde seitens der Prozessorhersteller (Intel, AMD) – fast – gelöst: Statt über die Taktrate zu skalieren, wurden einfach mehrere Cores auf einem physischen CPUSocket verbaut. Anwendungen, die Multithreading unterstützen, können dadurch weiterhin

[Abb. 1] CPU-Taktraten skalieren nicht unbegrenzt [1].

5.2014 www.dotnetpro.de

Backend Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

skalieren und eine enorme Performance liefern. In Abbildung 1 können Sie an der blauen Kurve sehr schön erkennen, dass die Takt­ raten von CPUs nicht bis ins Unendliche skalieren. Leider skalieren auch traditionelle relationale Datenbanken nicht bis ins Unendliche. Relationale Datenbanken wie der SQL Server basieren intern auf Konzepten, die bereits in den 70er Jahren „erfunden“ wurden. Konzepte, die dem SQL Server hier im Weg stehen, sind das Locking, Blocking und Latching. Schauen wir uns das einmal genauer an. Mit Locking und Blocking sollte jeder vertraut sein, der mit dem SQL Server arbeitet. Damit parallele Transaktionen voneinander isoliert werden können (und somit korrekte Ergebnisse liefern), verwendet der SQL Server intern Locks. Ein Lock im SQL Server ist eine logische Sperre. Lesende Transaktionen (SELECT) fordern immer Shared Locks an, schreibende Transaktionen (INSERT, UPDATE, DELETE) fordern immer Exclusive Locks an. Und die beiden Locks sind inkompatibel, das heißt, lesende Transaktionen blockieren schreibende Transaktionen und umgekehrt. Dadurch entstehen sogenannte Blockaden, die den Durchsatz und somit die Performance der Datenbank minimieren. Abhilfe wurde hier zum Beispiel bereits mit dem SQL Server 2005 geschaffen, indem ein „Optimistic Concurrency Model“ eingeführt wurde. Hier fordern lesende Transaktionen keine Shared Locks mehr an, sondern holen sich eine entsprechend alte gültige Version des betreffenden Datensatzes aus dem Version Store, der zentral in der TempDb gehalten wird. Schreibende Vorgänge müssen allerdings immer noch Exclusive Locks anfordern – dies kann nicht beeinflusst werden. Neben den Locks auf Transaktionsebene muss der SQL Server intern auch den parallelen Zugriff auf gemeinsam genutzte Datenstrukturen zwischen unterschiedlichen Threads synchronisieren. Eine solche Datenstruktur ist zum Beispiel der Buffer Pool, in dem alle gelesenen Pages vom Storage zwischengespeichert werden. Wenn Sie schon einmal MultithreadingAnwendungen implementiert haben, werden Sie wissen, dass für die Thread-Synchronisierung unter anderem sogenannte Critical Sections eingesetzt werden. Eine Critical Section ist ein Codeblock, der zu einem gegebenen Zeitpunkt nur von ei-

nem einzigen Thread ausgeführt werden darf. Im SQL Server werden diese Critical Sections als Latches bezeichnet. Wenn ein Thread einen lesenden oder schreibenden Zugriff auf Pages im Buffer Pool durchführt, durchläuft dieser ebenfalls Critical Sections, da ansonsten sogenannte Race Conditions entstehen würden. Im Fachjargon des SQL Servers bezeichnet man diese Vorgehensweise als Latching einer Page: Bevor eine Page gelesen werden kann, muss sie mit einem Shared Latch gelatcht werden; bevor eine Page geschrieben werden kann, muss sie mit einem Exclusive Latch gelatcht werden. Daraus folgt, dass der Zugriff auf Pages im Buffer Pool serialisiert, also single-threaded erfolgt! Auch wenn Sie eine perfekte Indizierungsstrategie für Ihre Datenbank gefunden und den schnellsten Storage der Welt im Einsatz haben, werden Sie in Latching-Probleme im Hauptspeicher laufen, da auf gewisse Datenstrukturen kein Multi-threaded-Zugriff erlaubt ist. Ein altbekanntes Problem ist hier die sogenannte „Last Page Insert Latch Contention“: Sie kann in einem Clustered Index auftreten, wenn Sie einen fortlaufenden Wert wie eine INT IDENTITY-Spalte unter einer sehr hohen Nutzerlast verwenden. Aus alldem ist zu erkennen, dass aktuelle relationale Datenbanken nicht in alle Unendlichkeit skalieren. Wir benötigen daher eine Technologie mit den folgenden Eigenschaften, damit eine relationale Datenbank nahtlos skalieren kann : ◼ D  aten werden ausschließlich im Hauptspeicher gehalten. ◼ A  bfragen werden mit den geringstmöglichen CPU-Instructions abgearbeitet. ◼ E  liminierung von Locking, Blocking und Latching. Genau hier setzt In-Memory OLTP im SQL Server 2014 an. Diese neue Technologie baut auf drei Säulen auf : ◼ Memory Optimized Tables ◼ Native Compiled Stored Procedures ◼ Lock & Latch Free Data Structures

Memory Optimized Tables Die erste der Säulen, auf denen In-Memory OLTP im SQL Server 2014 aufbaut, sind sogenannte Memory Optimized Tables (speicheroptimierte Tabellen). Im Unterschied zu den traditionellen Disk-Based Tables werden die Daten in den In-Memory Tables nur im Hauptspeicher gehalten und nicht in Datenfiles, die physisch im Storage liegen.

Damit im Fehlerfall (zum Beispiel bei einem Absturz des SQL Servers) die Daten aus dem Hauptspeicher rekonstruiert werden können, werden periodisch sogenannte Checkpoint-Files geschrieben, die in einem sehr effizienten Format die Daten, die im Hauptspeicher gehalten werden, in einer FILESTREAM-Filegroup abspeichern. Wenn Sie eine Memory Optimized Ta­ ble­im SQL Server 2014 erzeugen, müssen Sie auch mindestens einen Hash­-Index anlegen. Ein Hash-Index indiziert die Tabellendaten in einer Hash Table. Traditionelle Clustered und Non-Clustered Indizes werden von Memory Optimized Tables nicht unterstützt, da der intern verwendete B+-Baum auf das ineffiziente Latching angewiesen ist, dessen Probleme wir bereits betrachtet haben. In der finalen Version des SQL Server 2014 werden pro Memory Optimized Table bis zu acht Hash-Indizes unterstützt, weitere sind aktuell nicht vorgesehen. Ab der CTP2 des SQL Server 2014 werden auch sogenannte Range-Indizes unterstützt, die intern auf einem Bw-Baum aufbauen. Mehr dazu später. Memory Optimized Tables bieten Ihnen auch ein vollständiges neues Concurrency Model an, das auf den Prinzipien von „Multi Version Concurrency Control“ (MVCC) aufbaut [2]. Traditionell werden ja beim Lesen und Schreiben von Daten entsprechende Locks angefordert. Beim Einsatz von Optimistic Concurrency, dem optimistischen Locking (ab SQL Server 2005, siehe oben) lässt sich beim Lesen die Vergabe von Shared Locks vermeiden, beim Schreiben der Daten müssen aber immer noch Exclusive Locks angefordert werden. Der Einsatz von MVCC ändert dies vollständig, da hier auch beim Schreiben von Daten keine Exclusive Locks mehr angefordert werden. Bei Datenveränderungen werden nämlich einfach neue Versionen erzeugt, die einen Begin- und End-Timestamp aufweisen. Lesende Transaktionen können dann sehr einfach aufgrund ihres aktuellen Timestamps die für sie gültige Version des Datensatzes zurückliefern. Ältere Versionen eines Datensatzes, die nicht mehr benötigt werden, entfernt später ein Garbage Collector. Damit Sie In-Memory OLTP überhaupt verwenden können, müssen Sie in Ihrer Datenbank im ersten Schritt eine FILESTREAM-Dateigruppe anlegen, die In-

www.dotnetpro.de 5.201461

Backend SQL Server 2014: Das ist neu, Teil 2 Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

Listing 1

Listing 2

Anlegen einer In-Memory-OLTPFilegroup.

Anlegen einer Memory ­Optimized Table.

CREATE DATABASE TestDatabase GO ALTER DATABASE TestDatabase ADD FILEGROUP HekatonFileGroup CONTAINS MEMORY_OPTIMIZED_DATA GO USE TestDatabase GO ALTER DATABASE TestDatabase ADD FILE ( NAME = N'HekatonContainer', FILENAME = N'C:\Program Files\ Microsoft SQL Server\ MSSQL12.MSSQLSERVER\MSSQL\ DATA\HekatonContainer' ) TO FILEGROUP [HekatonFileGroup] GO

Memory-OLTP-Daten beinhalten kann. Listing 1 zeigt, wie das funktioniert. Wie Sie erkennen können, handelt es sich bei einer In-Memory-OLTP-Filegroup um eine traditionelle FILESTREAM-Filegroup, deren Funktionalität bereits seit dem SQL Server 2008 zur Verfügung steht. Der einzige Unterschied ist, dass Sie hier die Eigenschaft CONTAINS MEMORY_OPTIMIZED_DATA angeben müssen. Innerhalb der In-Memory-OLTP-Datei­ gruppe können Sie auch wie gewohnt mehrere FILESTREAM-Container angeben. Das ist zum Beispiel dann von Vorteil, wenn sich die Container auf unterschiedlichen Festplatten befinden: Das Recovery Ihrer Memory Optimized Tables kann beim Startup des SQL Servers dann parallelisiert von allen Containern gleichzeitig durchgeführt werden. Nachdem Sie die Vorbereitungen auf Datenbankebene nun abgeschlossen haben, können Sie im nächsten Schritt Ihre erste Memory Optimized Table anlegen (Listing 2). Um die Tabelle als Memory Optimized Table anzulegen, müssen Sie bei der WITH-Option nur die Eigenschaft MEMORY_OPTIMIZED angeben. Zusätzlich ist noch mindestens ein Hash-Index über die Syntax NONCLUSTERED HASH anzulegen. Auf die Eigenschaft BUCKET_COUNT werden wir später noch eingehen. 62

CREATE TABLE TestTable ( Col1 INT NOT NULL, Col2 VARCHAR(100) NOT NULL, Col3 VARCHAR(100) NOT NULL CONSTRAINT chk_PrimaryKey PRIMARY KEY NONCLUSTERED HASH (Col1) WITH (BUCKET_ COUNT = 1024) ) WITH (MEMORY_OPTIMIZED = ON) GO

Das Interessante ist, was nun im Hintergrund im SQL Server passiert, wenn Sie das CREATE TABLE-Statement ausführen. Der SQL Server erstellt nämlich für Ihre Memory Optimized Table eine eigenständige DLL-Datei, die in den Prozessraum des SQL Servers geladen wird! Im Detail passiert hier Folgendes: 1. Die Tabellen-Definition des T-SQLStatements CREATE TABLE wird über mehrere Zwischenschritte in C-Code konvertiert. 2. Der C-Code wird über den C++-Compiler (cl.exe) und den Linker (link.exe) zu einer DLL kompiliert. 3. Die generierte DLL schließlich wird zur Laufzeit in den Prozessraum des SQL Servers geladen. Als Resultat wird der komplette Zugriff auf die speicheroptimierte Tabelle über nativ kompilierten Maschinencode durchgeführt – und die begrenzt verfügbaren CPU-Zyklen (CPU-Taktraten skalieren nicht unendlich) dadurch so effektiv wie möglich ausgenutzt. Ein Nebeneffekt dabei: Es ist auch nicht mehr möglich, bei einer Memory Optimized Table zu einem späteren Zeitpunkt einen Index zu definieren. Sämtliche Indizes, Tabelleneigenschaften und Constraints müssen Sie direkt im T-SQL-Statement CREATE TABLE definieren, da dieser komplette Codeblock in einem Schritt zu einer DLL kompiliert wird. Den daraus resultierenden C-Code können Sie sich sogar ansehen. Er wird in einem Unterverzeichnis im Ordner C:\ Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\xtp abgelegt. Die Zahl des Unterverzeichnisses stellt die entsprechende interne Datenbank-ID dar. Wenn Sie das T-SQL-State-

ment CRE­ATE TABLE ausgeführt haben, sehen Sie auch in der Dynamic Management View sys.dm_os_loaded_modules, dass die daraus resultierende DLL in den Prozessraum des SQL Servers geladen wurde. Bei all diesen Vorteilen von speicheroptimierten Tabellen gibt es auch Nachteile, da in der finalen Version des SQL Server 2014 nicht sämtliche Funktionalitäten unterstützt werden, die Sie von unseren klassischen Disk-Based Tables kennen: ◼ D  ie Datensatzlänge ist auf 8 KByte limitiert. ◼ T  RUNCATE TABLE und ALTER TABLE werden nicht unterstützt. ◼ K  eine Unterstützung für Fremdschlüssel und LOB-Datentypen. ◼ N  icht alle Datentypen werden unterstützt. Nachdem Sie eine Memory Optimized Table angelegt haben, können Sie ganz normal Datensätze einfügen, aktualisieren und löschen. Mit dem großen Unterschied, dass sich alles im Hauptspeicher abspielt und Sie mit dem eigentlichen Datenfile nicht mehr interagieren (zum Beispiel im Rahmen des CHECKPOINT-Prozesses). Trotzdem interagiert In-Memory OLTP immer noch mit Ihrem Transaktionslog. Standardmäßig werden hier alle Datenveränderungen in Ihren Memory Optimized Tables mitprotokolliert, da diese für ein mögliches Crash Recovery Ihrer Datenbank benötigt werden. Der große Unterschied zu traditionellen Disk-Based Tables ist, dass hier nicht auf der Granularität der verschiedenen Indizes mitprotokolliert wird, sondern auf der Granularität der Tabelle. Wenn Sie zum Beispiel auf Ihrer Tabelle acht HashIndizes definiert haben und Sie fügen einen Datensatz in die Tabelle ein, wird diese Einfüge-Operation genau ein Mal im Transaktionslog mitprotokolliert. Bei traditionellen Tabellen hingegen wird für jeden Index (Clustered/Non-Clustered Index) separat im Transaktionslog mitgeschrieben. Das Transaktionslog lässt sich bei In-Memory OLTP daher um einiges effizienter schreiben und verwenden. Wenn Sie mit In-Memory OLTP den Flaschenhals des Transaktionslogs ebenfalls eliminieren möchten, bieten Ihnen Memory Optimized Tables die Möglichkeit, sogenannte Schema-only Tables zu definieren. Dadurch wird nur die Tabellendefinition selbst in der Datenbank persistiert (das Schema), aber nicht mehr die Daten. Daher müssen Datenverände-

5.2014 www.dotnetpro.de

Backend Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

Listing 3 Schema-only-Tabellen. CREATE TABLE Orders ( OrderID UNIQUEIDENTIFIER NOT NULL, CustomerID INT NOT NULL, ProductID INT NOT NULL, Quantity INT NOT NULL, Price DECIMAL(18, 2) NOT NULL CONSTRAINT chk_PrimaryKey PRIMARY KEY NONCLUSTERED HASH (OrderID) WITH (BUCKET_COUNT = 1048576) ) WITH ( MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY ) GO

rungen auch nicht mehr im Transaktionsprotokoll mitgeschrieben werden. Der Nachteil? Sobald Sie Ihren SQL Server neu starten, haben Sie die kompletten Daten der Tabelle verloren und die Tabelle ist leer. Daraus folgt, dass diese Funktionalität nicht für alle denkbaren Szenarien geeignet ist. Sie eignet sich vorwiegend dann, wenn Sie die Daten in der Tabelle reproduzieren können. Denken Sie etwa an einen ETL-Prozess, der Ihr Data Warehouse jede Woche belädt. Die hier involvierten Staging-Tabellen könnten Sie ohne Probleme als Schema-only definieren, weil Sie im Fehlerfall die Daten einfach nochmals aus den Quellsystemen laden können. Listing 3 zeigt, wie Sie eine solche Tabelle erstellen. Sie geben hier bei der Eigenschaft DURABILITY einfach SCHEMA_ONLY an. Dadurch werden die Tabellendaten nur mehr im Hauptspeicher gehalten und zu keiner Zeit physisch in den Storage geschrieben. Wie bereits erwähnt, müssen Sie im Hinterkopf behalten, dass die Daten in der Tabelle verloren sind, sobald der SQL Server neu gestartet wird.

wiederum zur Laufzeit in den Prozessraum des SQL Servers geladen wird. Die Kompilierung zu nativem Maschinencode bringt folgende Performance-Vorteile : ◼ T  -SQL Stored Procedures werden nicht mehr während ihrer Ausführung interpretiert, sondern laufen mit nativem Maschinencode. ◼ Z  usätzliche, teure CPU-Instructions durch die notwendigen C++-VirtualFunction-Calls eines traditionell ausgeführten Ausführungsplans können vermieden werden. Abbildung 2 zeigt, wie aus einer normalen in T-SQL geschriebenen Stored Procedure eine C-DLL generiert wird. Der genaue Ablauf der Generierung der C-DLL gestaltet sich wie folgt : 1. Im ersten Schritt wird ein „normaler“ Execution Plan über den SQL Server Query Optimizer erzeugt. 2. Danach wird dieser Ausführungsplan in einen sogenannten „Mixed Abstract Tree“ (MAT) konvertiert. 3. Unter Zuhilfenahme der Tabellen-Metadaten wird der MAT in einen „Pure Imperative Tree“ (PIT) konvertiert. Hier werden zum Beispiel alle T-SQL-Datentypen in die C-Äquivalente transformiert. 4. Der PIT wird anschließend zu C-Code transformiert, der dann wiederum über den C-Compiler und den Linker zu einer DLL kompiliert wird. 5. Die generierte DLL wird in den Prozessraum des SQL Servers geladen. Wenn Sie anschließend Ihre Stored Procedure ausführen, wird nicht Ihre T-SQL

Stored Procedure interpretiert, sondern Sie führen nativ kompilierten, performanten Maschinencode aus. Dadurch können die CPU-Zyklen so effektiv wie möglich ausgenutzt und die Performance gesteigert werden. Der generierte C-Code der Stored Procedure wird wiederum im Ordner C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\xtp abgelegt. Wenn Sie hier einen Blick in die generierte C-Datei werfen, werden Sie feststellen, dass Spaghetticode erzeugt wurde, der sehr viele goto-Statements beinhaltet. Was nicht heißt, dass schlechter Code erzeugt wurde – goto-Statements wurden hier bewusst gewählt, weil sich die generierte CDLL dadurch klein halten lässt. Aufrufe von gemeinsam genutzten Funktionen kosten entsprechende zusätzliche CPU-Instructions (der Callstack muss gepflegt, Rücksprung-Adressen müssen gespeichert werden et cetera), während ein goto-Statement ein einziger AssemblerBefehl ist. Denken Sie also daran, wenn Sie das nächste Mal ein goto in Ihrem eigenen Code verwenden. Eine Native Compiled Stored Procedure wird bereits bei der Erstellung vollständig kompiliert. Das ist einer der großen Unterschiede zu traditionellen gespeicherten Prozeduren, die erst bei der ersten Ausführung kompiliert werden, wodurch der generierte Ausführungsplan für weitere Ausführungen im Plan Cache gecacht wird. Listing 4 zeigt, wie Sie eine Native Compiled Stored Procedure im SQL Server 2014 erstellen.

Native Compiled Stored Procedures Eine weitere Säule von In-Memory OLTP im SQL Server 2014 sind die sogenannten „Native Compiled Stored Procedures“. Die Namensgebung lässt schon erahnen, welcher Tricks sich der SQL Server hier bedient: Ihre in T-SQL geschriebenen Stored Procedures (gespeicherten Prozeduren) werden zu nativem Maschinencode in Form einer C-DLL kompiliert, die

[Abb. 2] Aus einer C-DLL wird eine T-SQL Stored ­ Pro­cedure [3].

www.dotnetpro.de 5.201463

Backend SQL Server 2014: Das ist neu, Teil 2 Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

Listing 4 Native Compiled Stored Procedure. CREATE PROCEDURE HekatonProcedure ( @Param INT ) WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = 'us_english' ) INSERT INTO dbo.TestTable (Col1, Col2, Col3) VALUES (@param, 'Klaus', 'Aschenbrenner') SELECT Col1, Col2, Col3 FROM dbo. TestTable END GO

Sie müssen hier mit dem WITH-Schlüsselwort die Optionen SCHEMABINDING, EXECUTE AS und NATIVE_COMPILATION angeben. Zusätzlich müssen Sie noch einen Atomic-Block definieren, der den gewünschten Isolation Level und die Sprache angibt. Zu beachten ist hierbei, dass die Isolation Level von In-Memory OLTP nicht mit den traditionellen Isolation­Leveln des SQL Servers gleichzusetzen sind. In-Memory OLTP unterstützt die Isolation Level SNAPSHOT, REPEATABLEREAD und SERIALIZABLE, wobei SNAPSHOT dem traditionellen Isolation Level Read Committed entspricht. Eine der größten Einschränkungen von Native Compiled Stored Procedures ist, dass Sie damit nur auf Memory Optimized Tables zugreifen können – nicht aber auf normale Disk-Based Tables. Native Code kann nur mit Native Code zusammenarbeiten. Ebenso wenig wie bei Memory Optimized Tables können Sie die Implementierung der Stored Procedure durch ein ALTER PROCEDURE ändern, da dieser Befehl nicht unterstützt wird. Sie müssen daher die Native Compiled Stored Procedure löschen und anschließend über CREATE PROCEDURE neu anlegen. Da die Implementierung der T-SQL Stored Procedure zu einer C-DLL kompiliert wird, gibt es derzeit auch keine Mög64

lichkeit, ein Recompile der Stored Procedure während der Laufzeit durchzuführen, wenn sich zum Beispiel die Statistiken geändert haben. Sie können also durchaus Native Compiled Stored Procedures laufen haben, die ineffektiv ausgeführt werden, weil sich in der Zwischenzeit die Datenverteilung in den Tabellen geändert hat. Dadurch ist der generierte C-Code nicht mehr der effektivste. Der einzige Ausweg ist hier ein DROP und anschließendes CREATE der Stored Procedure. Alles im allem gibt es hier noch sehr viele Einschränkungen und Fallstricke, die Sie für einen produktiven Einsatz im Vorfeld beachten und validieren müssen.

Lock & Latch Free Data Structures Wie eingangs bereits erwähnt, können traditionell implementierte relationale Datenbanken wie der SQL Server nicht ohne Probleme skalieren, weil der Zugriff auf gemeinsam genutzte Datenstrukturen im Hauptspeicher serialisiert zwischen verschiedenen Threads ausgeführt werden muss. Dieses Problem nennt sich im SQL Server „Latch Contention“ und kann unter sehr hoher Nutzerlast auftreten. Aus diesem Grund gibt es in der Multithreaded-Programmierung den Ansatz der sogenannten „Wait & Lock Free Algorithm & Data Structures“ [4]. Dabei handelt es sich um Programmierprinzipien, die ohne den Einsatz von Critical Sections eine sichere Multithreading-Programmierung erlauben – unter Einsatz von „Atomic CAS Operations“ (Atomic Compare-and-Swap Operations) [5]. Auf genau solchen Prinzipien und Datenstrukturen setzt auch In-Memory OLTP im SQL Server 2014 auf. Im Speziellen verwendet hier der SQL Server Hash-Indizes und Range-Indizes für die Datenspeicherung in Memory Optimized Tables. Ein Hash-Index basiert intern auf einer Hash Table; ein Range-Index ist intern über einen Bw-Tree implementiert.

Beide Datenstrukturen sind Lock- und Latch-frei; das heißt, sie können für Multithreaded-Anwendungen ohne Critical Sections implementiert werden. Der BwTree verwendet zusätzlich noch AtomicCAS-Operationen, um Änderungen in der Baumstruktur threadsicher ohne den Einsatz von Latches zu ermöglichen. Sehen wir uns den Hash-Index näher an. Wie schon erwähnt speichert ein Hash-Index die Daten in einer Hash Table ab. Der Zugriff auf die Hash Table kann wiederum ohne Latches erfolgen, wodurch eine hohe Skalierbarkeit erreichbar ist. Wie Sie in Listing 2 gesehen haben, müssen Sie bei der Erstellung eines HashIndex einen Bucket Count angeben. Intern ist eine Hash Table in sogenannte Hash Buckets unterteilt und der Bucket Count gibt an, wie viele Hash Buckets erzeugt werden sollen. Der Inhalt der Tabellenspalten, wo Sie den Hash-Index definiert haben, wird über eine sogenannte Hash-Funktion gleichmäßig zwischen den verschiedenen Hash Buckets verteilt. Nehmen wir an, wir haben einen Hash-Index auf einer Spalte LastName definiert und der SQL Server verwendet eine Hash-Funktion, die aufgrund des ersten Buchstabens definiert, in welches Hash Bucket der entsprechende Datensatz abgespeichert wird. In diesem Fall werden unsere Datensätze über 26 verschiedene Hash Buckets verteilt (A bis Z). Tatsächlich verwendet der SQL Server eine komplexere Hash-Funktion, die auch gewährleistet, dass die Daten zwischen den verschiedenen Hash Buckets gleichmäßig aufgeteilt werden. Welche HashFunktionen hier verwendet werden, ist undokumentiert. Natürlich kann es vorkommen, dass Datensätze aufgrund der Spaltenwerte in gleiche Hash Buckets gemappt werden (mehrere Namen, die mit dem gleichen Buchstaben beginnen). Wir sprechen von einer Hash Collision. Bei einer Hash Collision

[Abb. 3] Clustered Index: Hotspot durch Latching im Hauptspeicher.

5.2014 www.dotnetpro.de

n e r T

ds

u s ö L

Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

web & mobile

DEVELOPER

präsentieren:

n nge

Kn

o

Ho w

w

Unsere Leser spar en

€ 149,– mit Code DWX14dnp

14.-17. Juli 2014 NCC Ost, Nürnberg

DDC ■

.NET Developer Conference

MDC

3-Tages-Konferenz

– 250 Vorträge – 40 Thementracks – Networking auf Abendveranstaltungen ■

Top-Referenten

über 150 Experten aus den Themenbereichen Web-, Mobile- und .NET-Entwicklung

www.developer-week.de Aussteller & Sponsoren:

Mobile Developer Conference

WDC

Web Developer Conference

10 parallele Workshops am 17. Juli 2014

■ 



– Ganztägig – Vertiefend



Fachausstellung

mehr als 40 Partner präsentieren sich in der begleitenden Fachausstellung vom 14.-16. Juli 2014

DeveloperWeek

Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

Programm Developer Week 2014

Tag 1: Montag, 14. Juli 2014 Architektur

Visual Studio

Webentwicklung

09.00 – 09.15

Begrüßung

09.15 – 10.00

Eröffnungs-Keynote

10.00 – 10.30

Kaffeepause

10.30 – 11.30

Design Patterns sind Naturgesetze, Thomas Mentzel

VisualStudio – Ein Überblick, David Tielke

Die Architektur der ASP.NET Web API, Marius Schulz

Architecting the Cloud, Robert Eichenseer

Rapid Application Development – Nur Spielerei? Constantin Klein

OWIN – der Microsoft Web Stack erfindet sich neu, Robert Mühsig

11.30 – 11.45 11.45 – 12.45

Von den Anforderungen zur Architektur: Leitfaden für einen guten Softwareentwurf

7 Jahre Visual Studio TFS – Tipps & Ausblick, Neno Loje

Flexible verteilte Anwendungen mit Micro-Service, Mike Bild

Visual Studio 2013 – Produktiver werden, David Tielke

ab 19.00

Datenbackends in der Cloud und deren Integration, Peter Kirchner

Erfolgreiche Rewrites, Johann-Peter Hartmann

Enterprise-Webanwendungen mit Ext JS / EXT.NET, Johannes Hoppe

Debugging im Zeichen der Cloud, Robert Eichenseer

‘Triple-E‘ class Continuous Delivery, Werner Keil

Real Time Anbindung an SAP ERP, Rainer Barthels, Otto Neff

Connected Web, Damir Dobric

ALM konkret, Sebastian Rölz

Was ist neu in Windows Azure Mobile Services? Damir Dobric

Sourcingstrategien für nationale und internationale Projekte, Reiner Hörger

Mobile Games mit Windows Azure, Jürgen Gutsch

Zentrales Build & Release Management, Thomas Rümmler, Christian Schlag

Kaffeepause Schnee von gestern – Was ist ein Event Store? Jan Fellien

Visual Studio Online IDE, Patrick Boscolo

17.30 – 17.45 17.45 – 18.45

Continuous Delivery und Deployment in der Praxis, Martin Aschoff

Raumwechsel

16.00 – 16.30 16.30 – 17.30

Einführung in die Windows Azure Plattform, Sascha Dittmann

Mittagspause

14.45 – 15.00 15.00 – 16.00

ALM

Raumwechsel

12.45 – 13.45 13.45 – 14.45

Azure

Eine moderne RESTful basierte Web-Anwendung, Marc André Zhou

Raumwechsel Weißbuch der ArchitekturDokumentation, Stefan Zörner

Testmanagement mit Visual Studio 2013, Nico Orschel

Webanwendungen in Minuten hochskalierbar bereitstellen, Peter Kirchner Abendveranstaltung

Ausführliches Programm, alle Abstracts, Referenten und die Anmeldung online unter:

developer-week.de

Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

JavaScript

Webarchitekturen Web-Frameworks Android

iOS

Begrüßung

09.00 – 09.15

Eröffnungs-Keynote

09.15 – 10.00

Kaffeepause

10.00 – 10.30

Code-Qualität trotz JavaScript, Niko Köbler, Heiko Spindler

Das Märchen vom agilen Architekten, Stefan Zörner

SinglePageApplications mit Ember.js, Christian Ringler, Robert Rieger

JavaScript Debugging und Profiling, Sebastian Springer

REST und RESTful HTTP: Was es ist – und was nicht, Stefan Tilkov

Datenvisualisierung, Martin Walter

Integration von Google+ in iOS- und Android-Apps, Peter Friese

CoreBluetooth in iOS 7, Tammo Freese

Android Builds automatisieren, Janusz Leidgens

iBeacons allüberall und in der Praxis, Ivo Wessel

Raumwechsel

11.30 – 11.45

Mittagspause JavaScript für .NET-Entwickler, Tilman Börner, Golo Roden

Prinzipien für skalierbare Architekturen, Sven Günther, Andreas Havenstein

Tools und Tipps für den modernen Frontend-Workflow, Sven Wolfermann

Autos verkaufen mit CQRS und Event Sourcing, Marco Stechl, Philipp Garbe

Web Services mit Symfony2, Paul Seiffert

Testing mit Robolectric und FEST in Android Studio, Onur Güngören

iOS meets Arduino – Electronics prototyping mit iOS, Jens Meder

Offline-Architekturen für mobile Endgeräte, Christian Pöcher

A Better CSS: LESS is More

Bildbearbeitung für iOS und Android mit OpenCV, Uwe Frieser

Modular iOS-Apps Piet Brauer

High performance websites, Stefan Priebsch Arne Blankerts

Twig – Eine PHP Template Engine, Timo Haberkern

Abendveranstaltung

15.00 – 16.00

16.00 – 16.30 Oberflächendesign für Android Apps

Automatisiertes Testing mit iOS, Felix Schulze

Raumwechsel Mit Angular.js schnell zur Single Page Application

13.45 – 14.45

14.45 – 15.00

Kaffeepause Meteor JS – Eine flexible JavaScript Plattform, Niko Köbler, Heiko Spindler

11.45 – 12.45

12.45 – 13.45

Raumwechsel Überlebenswichtig: Die wichtigsten Frameworks für JavaScript

10.30 – 11.30

16.30 – 17.30

17.30 – 17.45 Modularer Android Code mit Dagger, Onur Güngören

Der einzig wahre Objective-C Stil, Tammo Freese

17.45 – 18.45

ab 19.00 Programmänderung vorbehalten

Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

Programm Developer Week 2014

Tag 2: Dienstag, 15. Juli 2014 ArchitekturPraxis 09.00 – 10.00

Das Event im Mittelpunkt: EDA und CEP, Tobias Richling

.NET-Praxis

Next.NET

Daten

Trends

Standardsoftware – Wege aus dem Verwaltungschaos, Boris Wehrle

LoB Windows 8 Apps, Lars Heinrich

MapReduce in der Praxis, Sascha Dittmann

Kommunikation im Internet der Dinge mit MQTT, Christian Götz

Professionelle Datenbankentwicklung mit den SSDT, Constantin Klein

Internet der Dinge – mit Webtechnologien, Timo Haberkern

Herausforderungen im Datenzeitalter, Constantin Klein

Wearable Android – Developing for Google Glass, Sebastian Kaspari

Twitter insights mit StreamInsight und HDinsight, Olivia Klose, Patric Boscolo

3D-Druck für Entwickler

Entkopplung und Datenqualität in Datenbanken, Thomas Worm

Raspberry Pi für Entwickler

Anwendungsfälle für Elasticsearch, Florian Hopf

Smartwatch Hacking, Robert Virkus

Entity Framework 6.x – Erweiterungsmöglichkeiten ausloten, Thomas Haug

Spaß und Freude mit Kinect, Tam Hanna

10.00 – 10.30 10.30 – 11.30

Kaffeepause Extreme Domain Modelling, Dennis Traub

Code Reviews – Jeder kennts, keiner machts, Boris Wehrle

11.30 – 11.45 11.45 – 12.45

Raumwechsel Die mystische CRUD-3-SchichtenApplikation, Tobias Richling

Prototyping und Entwicklung mit dem SharePoint Designer, Alexander Tews

12.45 – 13.45 13.45 – 14.45

SeekYouRS – Happy Path CQRS Framework, Jan Fellien

CodedUI in der Praxis: Lokalisierung bis Nachhaltigkeit, Nico Orschel

Architecting .NET Solutions for the Enterprise, Dino Esposito

OAuth2 und OpenID Connect, Daniel Basler, André Meier

ab 19.00

Basics of hardware programming in .NET, Marcin Kawalerowicz

Kaffeepause Gießen beliebiger Datenstrukturen mit Events, Ralf Westphal

Reactive Extensions, Mike Bild

17.30 – 17.45 17.45 – 18.45

Roslyn – Compiler as a Service, Christoph Wille

Raumwechsel

16.00 – 16.30 16.30 – 17.30

Cross-Plattform Entwicklung mit C#, Christian Lang, Loek van den Ouweland Mittagspause

14.45 – 15.00 15.00 – 16.00

Erstellung einer prototypischen Windows 8.1 App, Peggy Reuter-Heinrich, Lars Heinrich

Libs, ohne die ich nicht mehr programmieren will, Timothée Bourguignon Raumwechsel

Softwareentwurf Live, Ralf Westphal

Usability praktisch, Bernhard Pichler

Tasks – Wie funktionieren die? Bernd Marquardt

Abendveranstaltung

Ausführliches Programm, alle Abstracts, Referenten und die Anmeldung online unter:

developer-week.de

Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

Node.js Node.js-Anwendungen mit Visual Studio, Peter Hecker

Datenbanken / Datenzugriff

Responsive Webdesign

Cross-Plattform

Mobile Praxis

Wie halte ich meine Daten synchron?

Responsive Webdesign – Status Quo, Roberto Bez

Vermeiden der Top 10 Entwicklungsfehler, Thomas Gronbach

App Marketing: Nobody loves my App, Gregor Biswanger, Alexander Witkowski

Kaffeepause Building libraries using Coffee Script, Node.js, Thorsten Hans

ArangoDB – A different approach to NoSQL, Lucas Dohmen

Responsive Webdesign verkaufen, Patrick Lobacher

10.00 – 10.30 jQuery Mobile WebApp an SAP ERP anbinden, Philipp Friberg

Lessons Learned: Building a Mobile CRM, Patrick Blitz

Raumwechsel Leistungssteigernde Maßnahmen: Streams, Golo Roden

Datenbankentwicklung für Webentwickler

Fiese Fallstricke und sexy Strategien, Johannes Weber

Entkopplung und Datenqualität in Datenbanken, Thomas Worm

Responsive Design mit Bootstrap, Gregor Biswanger

Plattformübergreifende App Usability, Thorsten Stark, Michal Gralak

Mobile Testing, Felix Schulze

11.45 – 12.45

12.45 – 13.45 Firefox OS – A (mobile) Web Developer´s dream, Carsten Sandtner

Smartere Web-Apps entwickeln, Dr. Michael Nolting

Raumwechsel Node.js für Webapplikationen, Sebastian Springer

Event Sourcing in der Praxis, Benjamin Reitzammer, Johannes Seitz

Responsive Webdesign testen/debuggen, Sven Wolfermann

Worauf kommt es beim Design von Datenbanken an?

Neue Techniken für Responsive Design

Qualität und Sicherheit aus der Cloud, Peter Bruhn, Richard Süselbeck

Cross-Platform Levels, Udo Trappe

Skalieren mit Amazon Web Services

Anbindung an das CMS

Abendveranstaltung

15.00 – 16.00

16.00 – 16.30 Native multiplattform Apps mit Enterprise Scope, Martin Wieschollek, Christopher Klewes

Apache Cordova und Frameworks für hybride Apps, Johannes Hoppe

Raumwechsel Node.js versus .NET – Teil 2, Jürgen Gutsch, Golo Roden

13.45 – 14.45

14.45 – 15.00

Kaffeepause Node.js versus .NET – Teil 1, Jürgen Gutsch, Golo Roden

10.30 – 11.30

11.30 – 11.45

Mittagspause Richtig arbeiten mit npm

09.00 – 10.00

16.30 – 17.30

17.30 – 17.45 Cross-PlattformEntwicklung mit XAMARIN und .NET, Sebastian Seidel

Copyright für Developer, Claus Volke

17.45 – 18.45

ab 19.00 Programmänderung vorbehalten

Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

Programm Developer Week 2014

Tag 3: Mittwoch, 16. Juli 2014

09.00 – 10.00

.NET-Tools

Craftsmanship

Desktop

Sprachen

Vorgehensmodelle

Codeanalyse Marke Eigenbau, Thomas Haug

Clean Code – Code als kleinster gemeinsamer Nenner, Ilias Foukis

WPF UI Development Unchained, David C.Thömmes, André Lanninger

C# Dynamics in freier Wildbahn, Timothée Bourguignon

Produktentwicklung für die intelligente Gebäudetechnik, Urs Boehm

Hitchhiker‘s Guide to Functional Programming, Sergey Shishkin, Steffen Forkmann

Srum, Kanban oder doch beides? Ilias Foukis

F# im Web und auf dem Client, Carsten König

Agiles Vorgehen in traditionellen Projekten, Steve Graegert

Die JavaScript Engine V8 in .NETAnwendungen nutzen, Torsten Zimmerman

Football, Poker, PM oder: Wir führen Srum ein! Marcus Jacob

Monaden durch Beispiele begreifen, Carsten König

Definition of almost done, Dominik Jungowski

Noch eine!? – Eine neue Hochsprache für JVM und CLR, Michael Wiedeking

Best Practices für globale Scrum Teams, Jürgen Toth

10.00 – 10.30 10.30 – 11.30

Kaffeepause Päckchen packen mit NuGet, Thomas Schissler

ATDD – Der Weg zur lebenden Dokumentation, Hendrik Lösch

11.30 – 11.45 11.45 – 12.45

Raumwechsel Code Generierung mit .NET, Philip Jander

The Black Art of GUI Testing, Christoph Thelen

12.45 – 13.45 13.45 – 14.45

FAKE: Echt starkes Build für .NET, mit .NET, Philip Jander

Mit agilen Praktiken SOLIDe Systeme bauen, Sven Günther

17.45 – 18.45

Building Rich Media Apps, Robert Eichenseer

Raumwechsel Unit Testing und Mocking mit Microsoft FAKE, Christian Jacob

SOLIDe Prinzipien des objektorientierten Entwurfs, Dennis Traub

16.00 – 16.30 16.30 – 17.30

Missverständnisse bei der WPF Look & Feel Entwicklung, Alexander Keller

Mittagspause

14.45 – 15.00 15.00 – 16.00

WPF – Deep Data Binding, Bernd Marquardt

Die eigene App mit dem Cloud AD verbinden, Robert Mühsig

Kaffeepause Installer bauen leicht gemacht, Marcus Jacob

Qualitätsmanagement für kleine und mittlere Unternehmen, Matthis Radke

Win 8.1 Apps mit Hardware verbinden, Alexander Witkowski

Abschlusskeynote

Ausführliches Programm, alle Abstracts, Referenten und die Anmeldung online unter:

developer-week.de

Created for Ralf Zumbrunn ([email protected]) - 15322 on 30.07.2014 23:37:17 Please do not make illegal copies!

Softskills

Websprachen

Schnittstellen

Windows Phone

Mobile-Tools

Überleben im Projektdschungel als Softwareentwickler, Dr. Christian Heiss

Das streichzarte Web, Paul Bakaus

HTML5 Video: Curing plugin maladies since 2007, Matthew George McClure

Windows Phone und Windows AppEntwicklung, Daniel Meixner

Mit Touch Develop in die Zukunft, Christian Jacob

Kaffeepause Verhaltensmuster in der IT-Systementwicklung, Chris Rupp, Ulrike Friedrich

TestDriven Development.php, Dominik Jungowski, Jakob Ketterl

Frontend First Development, Mike Bild

10.00 – 10.30 Windows Phone
View more...

Comments

Copyright � 2017 NANOPDF Inc.
SUPPORT NANOPDF