Christoph Muthmann: Come chat with the Tigers...

Have you ever wanted the opportunity to ask the MSSQLTIGER team about SQL Server? Join the SQL Server Tiger team for a Twitter Chat on Monday, June 27th from 10 -11 AM PST. You can ask anything about Query Performance on SQL Server for our first Twitter chat.

Ganze Geschichte »

Sascha Lorenz: SQL Server 2016 - in-Memory OLTP

Die letzten Monate habe ich recht viel Zeit damit verbraucht Kunden im Rahmen von Workshops, PoCs und Projekten das Thema in-Memory OLTP und unsere Erfahrungen damit im SQL Server 2014 und SQL Server 2016 näher zu bringen. Bekannt wurde das Feature ja vor einiger Zeit als Projekt “Hekaton” für den SQL Server 2012.

Seinerzeit war das Interesse bei den Kunden sehr verhalten. Sowohl Endkunden als auch ISVs haben das Thema zwar wahrgenommen, aber da es ja erst mit 2014 realisierbar war, führte dieses bei den meisten zu einer “Das ist etwas für später…”-Meinung. Wenige haben für sich das Potenzial von in-Memory OLTP erkannt.

Das letzte halbe Jahr hat sich dieses geändert. Mit der Sichtbarkeit des Commitments von Microsoft in diese Technologie, von einem Feature mag ich da gar nicht mehr sprechen wollen, wurde vielen Nutzern des SQL Servers klar, dass sich das Spiel ändern wird bzw. eigentlich schon geändert hatte.

Nun, im SQL Server 2016, durch die Kombination von Technologien (Columnstore Index und in-Memory OLTP) zu Operational Analytics ist der Umfang der Änderungen bzw. Erweiterungen an der Architektur der SQL Server Engine deutlich sichtbarer geworden. Marketing ist halt doch alles. Hier mal ein gutes Beispiel.

Und für viele ist damit nun ein Wettbewerbsvorteil möglich, welchen man nicht mehr ignorieren kann.

Was machen wir da draußen schon mit in-Memory OLTP?

In den Workshops und PoCs erfahren und erleben die Kunden, wie leicht es geworden ist eine für sie bisher unvorstellbare Geschwindigkeit ihres Workloads auf ihrer bestehenden Hardware zu realisieren. Und ja, es ist kein “ein-und-läuft”-Feature. Viele Kunden entwickeln mittlerweile ihre LoB Systeme zum Teil selber und sind sehr darauf bedacht sich am Ende keinen Flaschenhals bei der Datenbank einzubauen.

In Projekten werden meist partiell Tabellen vom sogenannten “disk-based” Modell übertragen in die in-Memory Welt. Dabei sind häufig gar nicht die eigentliche Tabelle und die neuen Formen der Indizierung die Herausforderung, sondern ist eher die intellektuelle Hürde, dass nun mit einem Versionstore gearbeitet wird und sich die Isolationslevel ein wenig anders anfühlen. Hilft ja alles nichts. Da kommt ja auch ein wesentlicher Teil der Geschwindigkeit her.

Des Weiteren leiten wir Teams an sich dieser Technologie kreativ zu nähern. Zwar steht ja OLTP drauf, aber das heißt ja nichts. Gerade mit der Möglichkeit auf die “Durability” bewusst zu verzichten, können ganz besondere Number Cruncher in T-SQL entstehen. Besonders, wenn der T-SQL Code dann auch kompiliert werden konnte.

Und wir bringen in-Memory OLTP in Produktion. Das ist nicht immer ganz einfach, da bei dieser spezialisierten Engine ein wenig von der Flexibilität des SQL Servers abhanden kam. Dieses ist aber meist verkraftbar, wenn man sich die Vorteile vor Augen führt. Speziell Deployment Szenarien beim rund-um-die-Uhr-Betrieb können dabei Herausforderungen sein, welchen man bereits in der Designphase einer Lösung begegnen muss. Wobei, DevOps lässt hier grüßen. Und wer schon mal mit unseren Entwicklern in Berührung gekommen ist, kennt unsere repository-driven Ansätze für größere Umgebungen.

Resümee von mir: in-Memory OLTP lebt!

Christoph Muthmann: SQL Saturday #525 Review

Wenn man so lange wie ich bereits dabei ist, dann ist so ein SQL Saturday fast schon ein Familientreffen.

Ganze Geschichte »

Christoph Muthmann: Announcing SQL Server 2014 SP2

Im kommenden Monat erscheint das SP2 für SQL Server 2014.

Ganze Geschichte »

Christoph Muthmann: Cannot connect to WMI provider. (2016)

Nach der Installation des SQL Server Clients 2016 auf einer Windows 10 64-Bit Maschine erhält man diese Fehlermeldung, wenn man den Client Configuration Manager öffnet: Cannot connect to WMI provider. You do not have permission or the server is unreachable

Ganze Geschichte »

Sascha Lorenz: SQL Server Missing Indexes Feature – Vorsicht!

Dieser kurze Post richtet sich primär an DBAs und Entwickler, welche vielleicht gerade damit begonnen haben sich mit dem Themen SQL Server, Performance Optimierung usw. zu beschäftigen.

Vielen dürfte das Missing Index Feature bekannt sein. Der Query Plan wird bei der Kompilierung durch den Query Optimizer um einen Index Vorschlag angereichert.

https://technet.microsoft.com/en-us/library/ms345417(v=sql.105).aspx 

Dieser Vorschlag wird auch prominent im Management Studio dargestellt.

image

Diese “Empfehlungen” entstehen im Bruchteil einer Sekunde beim Kompilieren eines SQL Statements. Und beziehen sich einzig allein das eine Statement bzw. die eine Prozedur. Schauen also nicht nach links und rechts.

Ich sehe in ihnen eher den plakativen Hinweis, dass selbst dem Query Optimizer in der Kürze der Zeit aufgefallen ist, dass es deutliches Potenzial gibt. Mehr sollte es nicht sein.

Also nicht jeden Vorschlag unreflektiert umsetzen! Ist ja eigentlich klar, oder?

Nun durfte ich bei einem Kunden die Erfahrung machen, dass im Internet (es ist doch böse, wusste es immer…) Skripte zu finden gibt, welche den Plancache des SQL Server für eine komplette Instanz auslesen, die Missing Indexes Informationen extrahieren und automatisch ALLE Empfehlungen umsetzen. Es werden also in allen Datenbanken einer Instanz ungeprüft neue Indexe erzeugt.

Das mag auf den aller ersten Blick ja eine super Idee sein, nur so hat selbst Microsoft dieses Feature nicht gemeint. Viel hilft nicht immer viel…

Indexe, speziell sogenannte abdeckende Indexe, sind eine gewollte Form der Redundanz von Daten. Es wird also Speicher belegt und Indexe müssen auch bei Schreibvorgängen gepflegt werden. Speziell komplexere Systeme wie zum Beispiel ein SharePoint mögen so etwas gar nicht.

Bei diesem Kunden führte eine solche “Maßnahme” dazu, dass quasi alle Anwendungen danach deutlich langsamer liefen als vorher. Von dem plötzlichen Wachstum um 2/3 auf dem Storage ganz zu schweigen.

Ich verzichte bewusst auf eine Verlinkung zu den Skripten, um diese nicht noch relevanter zum Thema erscheinen zu lassen.

Dirk Hondong: SQLSaturday #525 Rheinland–leider ohne den Paparazzo

Hallo liebe PASS Gemeinde,

der nächste SQLSaturday Rheinland steht vor der Tür.  Ich beneide die Besucher, die dabei sein werden. Bei den Sessions, die dieses Jahr anstehen, ist das auch kein Wunder. Auch dieses mal wird es wieder einen tollen Mix aus nationalen und internationalen Sprechern geben.

Ich schaffe es jedoch dieses Jahr aus privaten Gründen leider nicht an der Fachhochschule Bonn-Rhein-Sieg vorbeizuschauen um ein paar Fotos zu schießen, wofür ich ja sonst bekannt bin. Aber seid gewarnt: Fotos werden dennoch gemacht…  Smiley

Ich wünsche allen Teilnehmern ganz viel Spaß. Ich denke bei dem #555 bin ich dann wieder dabei.

 

Gruß

“SQLPaparazzo”


Sascha Lorenz: SQL Server 2016 – Business Intelligence Edition?

Nachdem nun der SQL Server 2016 verfügbar ist, schauen Kunden der SQL Server 2014 Business Intelligence Edition ein wenig ungläubig drein. Die BI Edition gibt es nicht mehr. Habe mir dazu die Hinweise auf der Lizenzierungsseite von Microsoft angeschaut.

Hier der O-Ton aus dem Licensing Guide für SQL 2016:

For SQL Server Business Intelligence Edition Licenses with Software Assurance

SQL Server 2014 was the last version of the SQL Server Business Intelligence Edition. Customers with active SA coverage on qualifying Business Intelligence Edition server licenses on June 1, 2016 are eligible to upgrade to and use SQL Server 2016 Enterprise (Server+CAL) software with those licenses.

During the current term of SA coverage (effective on or before June 1, 2016), customers who are licensing SQL Server 2014 Business Intelligence Edition can, for a given deployment, upgrade to and use the SQL Server 2016 Enterprise Edition (Server+CAL) software in place of the licensed SQL Server 2014 edition. Note: Customers who upgrade to SQL Server 2016 software are subject to current version Enterprise Edition server license product terms. 

Customers with Enterprise Agreements effective on or before June 1, 2016 can continue to acquire additional SQL Server 2014 Business Intelligence server licenses—and upgrade those licenses to SQL Server 2016—through the end of their current enrollment term, as long as the number of new licenses acquired does not exceed more than 25% of the number of qualifying licenses acquired as of May 1, 2016. 

After their current term expires, SA coverage can be renewed and maintained on SQL Server Enterprise Edition server licenses to provide continued access to SA benefits, including License Mobility rights, Failover Server rights, and access to future releases.

Denke mal, dass das fair klingt, oder?

Wie immer sind alle Lizenzierungshinweise hier von mir ohne jegliche Gewähr!

Sascha Lorenz: SQL Server 2016 ist verfügbar – Was ist in welcher Edition?

SQL Server 2016 ist verfügbar. *jubel*

Selten wurde eine Version so von mir intensiv im Vorfeld verfolgt, weil sie gefühlt für jeden etwas spannendes Neues dabei hat.

Kommen wir zur Frage, welche Features haben es ins Release bzw. in welche Edition (Standard oder Enterprise) geschafft?

Zwar habe ich aufgrund meiner Kommunikation mit Microsoft als MVP und durch die weltweite SQL Community vor dem Release Einiges erfahren. Dieser Artikel geht aber bewusst unbefangen an das Thema und nimmt einzig und allein die offizielle Microsoft Seite dazu als Quelle.

https://msdn.microsoft.com/en-us/library/cc645993.aspx (Stand 02.06.2016)

Blättern wir also mal gemeinsam durch die Liste. Was fällt als Erstes auf? Wo ist die BI Edition hin?

image

Ein kurzer Blick auf die 2014 Version des oben genannten Links zeigt diese noch:

image

Das könnte evtl. zu Unruhe im Feld führen.

Abschnitt “Cross-Box Scale Limits”

Ein Blick auf “Maximum Compute Capacity” zeigt, dass die Standard Edition 2016 nun “Limited to lesser of 4 sockets or 24 cores” statt wie bei der 2014 “Limited to lesser of 4 Sockets or 16 cores” nutzen kann. Könnte sich als nützlich erweisen.

Nun wird es aber gleich richtig spannend:

image

Die Standard Edition der SQL Server Analysis Services (SSAS) unterstützt nun auch Tabular als Modell, wenn auch “nur” für 16 GB. Das ist sehr schön und war auch meiner Sicht auch schon ein wenig überfällig. Guter Zug, Microsoft!

Immer wieder schön zu lesen, dass die maximale Datenbank Größe 524 PB ist. Aber das nur am Rande.

Abschnitt “RDBMS High Availability”

Auf den ersten Blick keine Änderungen. Wobei mir mal so war, als sollten die Verfügbarkeitsgruppen in abgespeckter Form auch für die Standard Edition kommen. Das behalte ich mal im Auge und recherchiere dazu ein wenig nach.

Abschnitt “RDBMS Scalability and Performance”

Okay, dass es “Operational analytics” nicht in die Standard schafft, war klar, da sich hier ja sowohl “In-Memory Column Store” als auch “In Memory OLTP” die Hand geben. Dennoch, cooler Kram ist!

Und eine kleine Überraschung, dass es die “Stretch Database” in die Standard geschafft hat. Wobei, kurz drauf rum denken, macht Sinn, da es sich hier um den Einstieg in die Azure Welt für die SQL Server Kunden handelt. Nützliches Feature auf jeden Fall.

Und wo wir hier gerade sind, wem “Delayed Durability” noch Nichts sagt, mal nachlesen. Kann SEHR nützlich sein, wenn man sich bewusst ist, was man da tut.

Abschnitt “RDBMS Security”

Jetzt wird es schon wieder aufregend. Sowohl “Row-level security” als auch “Dynamic data masking” haben es in die Standard Edition geschafft. Wieder ein guter Zug. Dass es “Always Encrypted” nur für Enterprise gibt, nun ja, ist doch eigentlich auch ein Cloud Treiber, oder?

Abschnitt “Replication”

Noch ein Cloud Feature ist “Transactional replication to Azure”. Gibt es auch für Alle.

Abschnitt “Management Tools”

Da ist mir Nichts aufgefallen.

Abschnitt “Manageability”

Wieder Nichts. Vielleicht brauche ich auch nur einen weiteren Kaffee…

Abschnitt “Development Tools”

Bin mal kurz in der Teeküche. Wieder Nichts.

Abschnitt “Programmability”

Jetzt wird es ja richtig cool. Okay, Kaffee hilft halt immer.

image

Denke mal, dass dieses Bild für sich spricht, oder? Was ist denn jetzt eigentlich der Unterschied zwischen Basic und Advanced R ist, werde ich noch mit meinem Kollegen Tom Martens bei Gelegenheit näher erklären.

JSON, yeah…

Query Store, wow…

Temporal, Hammer… (und dann noch Strech…)

Microsoft, da habt ihr ja mal alles richtig gemacht!

Abschnitt “Integration Services”

image

Azure, Hadoop und HDFS. Schön, machst rund.

Abschnitt “Integration Services – Advanced Adapters”

Okay, da ist Name halt Programm. Mach ja auch Sinn.

Abschnitt “Integration Services – Advanced Transformations”

Okay, halt auch was für den größeren Geldbeutel. Wobei, da hätte ich mir auch mal etwas Neues gewünscht.

Abschnitt “Master Data Services”

Gibst weiterhin nur in der Enterprise Edition. Hat ja auch diverse Neuerungen erfahren. Es lebt zumindest.

Abschnitt “Data Warehouse”

Hat sich Nichts geändert.

Abschnitt “Analysis Services”

Nichts Neues.

Abschnitt “BI Semantic Model (Multidimensional)”

Auch hier nichts Neues.

Abschnitt “BI Semantic Model (Tabular)”

Jetzt aber, Tabular im Standard. Aber…

Keine Perspektiven, Partitionen und kein DirectQuery (Mist…). Wobei, dennoch ein guter Schritt.

Abschnitt “Power Pivot für SharePoint”

Alles weiterhin nur für die Enterprise Edition. Interessant wie sich der Teil weiter entwickeln wird, dank PowerBI.

Abschnitt “Data Mining”

Weiterhin gehen die Basics mit der Standard, der Rest mit der Enterprise. Hat da jemand gerade R gesagt?

Abschnitt “Reporting Services”

Nun gut, Mobile Reports, sprich das Datazen Universum, gibt es nur für die Enterprise. Damit war aber auch zu rechnen.

Abschnitt “Bussines Intelligence Clients”

Dieser Abschnitt ist nach wie vor ein wenig verwirrend. Klar, dass die Clients für mobile Reporting auch nur mittels der Enterprise Edition genutzt werden können.

Das mit PowerBI hätte man geschickter formulieren können, sonst denkt noch jemand, dass man dafür zwingend einen SQL Server Enterprise Edition bräuchte. Was natürlich nicht so ist. Das geht auch ganz ohne SQL Server und macht dennoch Spaß. Das sage ich nicht von Vielem!

Abschnitt “Spatial und Location Services”

Alles bleibt wie es war.

Abschnitt “Additional Database Services”

Nichts Neues.

Abschnitt “Other Components”

Schade, dass man hier ganz hinten im Bus “Data Quality Services” und “StreamInsight” findet. Hätte mir für beide Technologien mehr gewünscht. Zumindest sind sie noch dabei. Inwiefern der Einsatz für die breite Masse Sinn macht, sei dahin gestellt.

Und schon sind wir durch. In Summe hat Microsoft die Standard Edition aufgewertet und vieles von dem coolem Kram nicht nur in der Enterprise gelassen.

Natürlich sind alle Angaben in diesem Artikel unverbindlich und ohne Gewähr !

Robert Panther: SQL Server 2016 RTM jetzt verfügbar

Im Laufe des gestrigen Tages ist nun endlich die finale Version des SQL Server 2016 erschienen und über die üblichen Quellen (MSDN etc. verfügbar).

Verfügbare Editionen

An den verfügbaren Editionen hat sich einiges geändert. So gibt es mittlerweile nur noch 64-Bit Versionen. Die Business Intelligence Edition fällt ebenfalls weg und auch die verfügbaren Varianten der Express Edition wurden etwas bereinigt (die mittlere Variante „Express mit Tools“ fällt weg, man muss sich nun nur noch zwischen „Express“ und „Express mit Advanced Services“ entscheiden). Am unteren Ende der „Nahrungskette“ ist auch weiterhin die SQL Server LocaldB verfügbar. Am anderen Ende ist allerdings auch die Developer Edition inzwischen kostenfrei verfügbar (darf natürlich wie bisher nicht produktiv eingesetzt werden).

Als kommerzielle Editionen gibt es wie gewohnt die Standard, Web und Enterprise Edition, die nun noch um eine Enterprise Core Edition ergänzt wurden.

Verwaltungstools

Etwas gewöhnungsbedürftig ist die Tatsache, dass das SQL Server Management Studio nun nicht automatisch mitinstalliert wird, sondern eine separate Installation erfordert. Der Link der in der deutschen Version des SQL Server-Installationscenters angegeben ist, verweist leider noch auf die Januar-Preview des Management Studios. Die entsprechende englischsprachige Seite enthält allerdings den korrekten Link, über den auch die deutsche Variante der finalen Verwaltungstools heruntergeladen werden kann: https://msdn.microsoft.com/en-us/library/mt238290.aspx

Dasselbe Spiel wiederholt sich bei den SQL Server Data Tools. Auch hier verweist die deutschsprachige Seite auf eine Preview vom November 2015, während über die englischsprachige Seite bereits die finale Version (ebenfalls in deutsch) verfügbar ist: https://msdn.microsoft.com/en-us/library/mt204009.aspx

(Die aktuellen SQL Server Data Tools nutzen übrigens noch die Visual Studio 2015 Shell, da Visual Studio 2016 noch nicht final released ist.)

Weitere Informationen

Weitere Informationen zu SQL Server 2016 gibt es auf der offiziellen Produktseite:
https://www.microsoft.com/en-us/server-cloud/products/sql-server
(die deutschsprachige Variante derselben Seite ist noch nicht auf SQL 2016 umgestellt)

Dazu ist wieder ein kostenfreies eBook von Microsoft verfügbar, in dem auf 215 Seiten alle wesentlichen Neuerungen detailliert beschrieben werden:
https://info.microsoft.com/Introducing-SQL-Server-2016-eBook.html

 


Christoph Muthmann: Treffen der PASS RG Rheinland am 13.6.2016

Das nächste Treffen der Regionalgruppe Rheinland findet am Montag, den 13.6.2016 um 18:00 bei Microsoft in Köln statt. Wie immer freuen wir uns über eine zahlreiche Teilnahme.

Ganze Geschichte »

Andreas Wolter: SQL Server 2016 general availability and Feature-Support // allgemeine Verfügbarkeit und Feature-Support

 

(DE)
Es ist soweit: Der neue SQL Server, in meinen Augen das beste Release seit vielen, wenn nicht gar überhaupt, ist allgemein verfügbar.
(Blog-Artikel von Joseph Sirosh, Corporate Vice President, Data Group, Microsoft)
Die Built-Nummer ist 12.0.1601.5.

(EN)
Finally: The new SQL Server 2016, in my eyes the best release since many, if not ever, is generally available.
(Blog-Artikel by Joseph Sirosh, Corporate Vice President, Data Group, Microsoft)

The Built-Number is 12.0.1601.5.

Bei MSDN kann man die entsprechende Edition (Enterprise, Standard, Web, Developer, Express – die Business Intelligence Edition fällt weg) herunterladen. Die Developer Edition ist mittlerweile sogar kostenfrei (Blog –Artikel dazu).

Download-Link:

One can download the respective version (Enterprise, Standard, Web, Developer, Express – the Business Intelligence Edition ceases to exist) at MSDN. The Developer Edition is even free of charge by now (Blog-Article on that).

Download-Link:

(DE)
https://msdn.microsoft.com/de-de/subscriptions/downloads/#searchTerm=&ProductFamilyId=650&Languages=de

(EN)
https://msdn.microsoft.com/en-us/subscriptions/downloads/#searchTerm=&ProductFamilyId=650&Languages=en

 

Über die neuen Datenbank-Engine-Features habe ich bereits hier geschrieben:
SQL Server 2016 – ein Sicherheits- und Performance-Release

I wrote about the new Database-Engine-Features before here:
SQL Server 2016 – the Security & Performance Release

Hier ein Blick auf die Von den Editionen von SQLServer 2016 unterstützte Funktionen:

msdn.microsoft.com/en-us/library/cc645993.aspx

Hervorzuheben ist hier, dass die Gerüchte um den Support von Availability Groups in der Standard Edition sich bewahrheitet haben, und sogenannte „Basic Availability Groups“ mit Unterstützung für 2 Knoten und je eine Replika je AG – ähnlich der Datenbankspiegelung – dort einsetzbar sind.

Im Sicherheits-Bereich haben es „Row-level Security“ als auch „Data Masking“ in die Standard Edition geschafft, „Always Encrypted“ jedoch nicht – diese ist nur in der Enterprise-Edition verfügbar.

Die viel-gelobte „Query Store“ ist in allen Editionen verfügbar(!) („Danke Connor“), ebenso wie „Temporal Tables“, und JSON. „R“ ist nur in einer „Basic-Variante“ allgemein verfügbar, „Stretch Database“ wiederum in allen Editionen.

In-Memory OLTP“ und „Operational Analytics“ bleiben leider der Enterprise-Edition vorbehalten.

Bei den BI-Komponenten hervorzuheben ist, dass der Analysis Services Tabular-Mode nun auch in der Standard Edition verfügbar ist. Das ist sehr hilfreich, da diese Variante gerade auch bei kleineren Projekten Sinn macht

Here a look at the Features Supported by the Editions of SQL Server 2016:

msdn.microsoft.com/en-us/library/cc645993.aspx

I want to highlight that the rumors about the support of Availability Groups in Standard Edition have been proven true and so-called „Basic Availability Groups“ with support of 2 nodes and one replica per AG – similar to Database Mirroring – can be used there.

In the Security area „Row-level Security“ and also „Data Masking“ made it into Standard Edition, but „Always Encrypted“ did not – this feature is only available in Enterprise-Edition.

The much-praised „Query Store“ is available in all Editions(!) (“Thank you, Connor”),as are „Temporal Tables“, and JSON. „R“ is available only as a „Basic-variation“ generally available, „Stretch Database“ on the other hand in all in Editions.

In-Memory OLTP“ and „Operational Analytics“ unfortunately remain reserved for Enterprise-Edition.

It should be pointed out that from the BI components the Analysis Services Tabular-Mode is now available in Standard Edition as well. This is very helpful as this type makes a lot of sense especially in small projects.

Die offizielle Seite zu SQL Server 2016 mit weiteren Informationen und Links zu Whitepapers befindet sich hier:
www.microsoft.com/de-de/server-cloud/products/sql-server/

You can find the official Page on SQL Server 2016 with further information and links to Whitepapers here:
www.microsoft.com/en-us/server-cloud/products/sql-server/

Enjoy the next generation of Microsofts Data Platform Flagship: SQL Server 2016

Andreas Wolter

Christoph Muthmann: SQL Server 2016 ist verfügbar

Wie bereits vorab angekündigt, ist die neue Version SQL Server 2016 ab dem 1. Juni (9 am PST) verfügbar.

Ganze Geschichte »

Christoph Muthmann: CU6 für SQL Server 2014 SP1 zurückgezogen

Kurzfristig wurde das CU6 von April wieder zurückgezogen.

Ganze Geschichte »

Christoph Muthmann: Direktes Upgrade von 2005 auf 2016

Der Mythos besteht weiterhin, dass ein Upgrade nur über zwei Versionen hinweg möglich ist. Das entspricht aber nicht der Wahrheit und Paul Randall zeigt in seinem blog, wie der Upgrade laufen kann.

Ganze Geschichte »

Andreas Wolter: Konferenzen im SQL Server Sommer 2016 – Conferences in SQL Server summer 2016

Andreas Wolter: Sarpedon Quality Lab presenting SQL Server 2016 In-Memory and Security Features in Arabia at SQL Gulf 3


مرحبا


(“MARR-hah-bah”, Arabic: Hello)

This year takes me to yet another part of the world:

I have been invited to speak at THE SQL Server Conference in the Middle East: at SQL Gulf 3 taking place in Riyadh, Saudi Arabia on April 23rd.

I feel very much honored to be among the selected speakers: Denny Cherry, Victor Isakov, Peter Myers, Satya Shyam K and Shehap El-Nagar the organizer himself, who has done a great job pulling this off the third time!
For example about 7 TV stations are expected to cover this event!

(“MARR-hah-bah”, Arabisch: Hallo)

Dieses Jahr bringt mich an eine weitere Gegend dieser Welt:

Ich bin eingeladen worden auf DER SQL Server Konferenz im Nahen Osten: auf der SQL Gulf 3, die am 23. April in Riad Saudi Arabien stattfindet, als Sprecher aufzutreten.

Ich fühle mich sehr geehrt unter den ausgewählten Sprechern zu sein: Denny Cherry, Victor Isakov, Peter Myers, Satya Shyam K und Shehap El-Nagar dem Organisator selbst, der einen tollen Job gemacht hat, das zum dritten Mal zu leisten.
So werden zum Beispiel ca. 7 TV-Sender werden von diesem Event berichten!

 

 

I will be giving two presentations. The first one is on the new In-Memory capabilities of SQL Server 2016, which have been tremendously enhanced, and the second one is on the new Security features which represent one of the pillars of this release:

Ich werde zwei Vorträge halten. Einen über die neuen In-Memory Fähigkeiten von SQL Server 2016, die enorm verbessert worden sind und den zweiten zu den neuen Sicherheitsfeatures, die eine der drei Säulen dieses Releases darstellen: 

 

SQL Server 2016 – the evolution of In-Memory technologies

For SQL Server 2014 a completely new In-Memory Engine for memory optimized table & indexes was integrated into SQL Server with in fact very limited functionality.

For SQL Server 2016 the In-Memory engine is being extensively improved in terms of both scalability and T-SQL language support. Moreover, the ColumnStore index technology has been improved and can now even be combined with memory-optimized tables.

In this session I will provide an overview of the new possibilities and demonstrate where a particular technology may help – or where you cannot expect benefits. If you are planning to go on SQL Server 2016 any time soon, this session shows you two of the most important features that SQL Server 2016 brings.

 

SQL Server 2016 – the Security Release

In this session I will give insights into the most important security features of SQL Server 2016. In fact, this release will introduce completely new features that serve data security on different levels. The top 3 features are: Dynamic Data Masking, Row Level Security, and, as a highlight: Always Encrypted. Also, the new possibilities in Azure will not remain unmentioned either. The session will provide technical insights and demos but also hints to security traps. In the end a system is only as secure as its weakest spot. 
This session aims to assist Administrators as well as Developers in determining the right technologies for their needs.

 

I am looking forward to making many new contacts with people from this region of the world that is striving for modernization in many aspects and already reached the top in several.

Ich freue mich darauf, viele neue Kontakte mit Menschen aus dieser Region, die in vielerlei Hinsicht nach Modernisierung strebt und in einigen bereits Spitzenklasse erreicht hat, zu machen.

 

مع السلامة (Ma’a salama)

Andreas

Andreas Wolter: Reporting Services 2016 – Back in the game: the new capabilities & features // Zurück im Spiel: die neuen Möglichkeiten und Features

(DE)
Meine letzten Veröffentlichungen und Vorträge zu Reporting Services sind schon Jahre her. Kein Wunder, denn seit dem 2008 R2-Release ist dort nichts passiert. Nun mit SQL Server 2016 erfahren die Reporting Services endlich wieder Zuwendung, wie ich im Mai letzten Jahres bereits am Rande vorangekündigt hatte („SQL Server 2016 – ein Sicherheits- und Performance-Release“). Wird es genug sein für ein Revival? Das kann jeder für sich entscheiden. In diesem Artikel stelle ich vor, was es Neues gibt.

 (EN)
It has been years since my last publications and presentations on Reporting Services. This is no surprise, because since the 2008 R2-release nothing has happened there. With SQL Server 2016, the Reporting Services finally get attention again, as I had preannounced in passing already last May („SQL Server 2016 – the Security & Performance Release“). Will it be enough for a revival? You can decide for yourselves. In this article I will introduce what’s new.

Report-Typen

Eine der wichtigsten Neuerungen ist die Integration der DataZen-Technologie. Damit lassen sich für mobile Geräte wie Smartphones und Tablets optimierte Berichte, „Mobile Reports“ entwickeln. Dafür gibt es ein eigenes Entwicklungstool, den „Mobile Report Publisher“, das ähnlich wie der Report Builder, bei dem sich neben der Optik im Wesentlichen nichts geändert hat, aber wesentlich besser als die alte Click-Once Anwendung performt, Berichte lokal als auch auf dem Report Server speichern kann.

 Report types

One of the most important innovations is the integration of the DataZen technology. By means of this technology, optimized reports, i.e. “Mobile Reports,” can be developed for mobile devices such as smartphones and tablets. For this purpose, a particular development tool is available, the “Mobile Report Publisher,” which, similar to the Report Builder (in which, aside from the optic, basically nothing has changed, but it performs much better than the old Click-Once application), can store reports locally as well as on the Report Server.

 

 Reporting_Services_2016_Mobile_Report_Publisher

 

Reporting Services Web Portal

Die offensichtlichste Neuerung bei SSRS ist das neue „Reporting Services Web Portal“, das den alten Report Manager ablöst und auf Html5 basiert. Es unterstützt nun auch Chrome und Firefox vollständig und skaliert automatisch auf allen Bildschirmgrößen. So sieht das neue Portal aus:

 Reporting Services Web Portal

The most obvious innovation in SSRS is the new “Reporting Services Web Portal,” which replaces the old Report Manager and is based on Html5. It now also completely supports Chrome and Firefox and automatically scales to all screen sizes. This is what the new portal looks like:

 Reporting_Services_2016_Web_Portal

 

Hier sieht man auch, dass, zusätzlich zu Ordnern (oben), KPIs und Mobile Reports von den nun sogenannten „Paginated Reports“ (im deutschen „seitenbasierte Berichte) getrennt aufgeführt werden.

Here you can see that in addition to folders (above), KPIs and Mobile Reports are separately listed by the now so-called “Paginated Reports” (i.e. page-based reports).

Das neue Portal unterstützt außerdem nun auch die Möglichkeit, das Design leicht anzupassen. Das nennt sich Custom Branding.
Technisch basiert das Ganze auf einer xml-Datei, die wiederum auf eine json-Datei mit den Farbangaben und optional auf ein logo verweist. Diese 3 Dateien werden als zip-Datei verpackt und dann als „brand package“ im Portal hochgeladen werden. Dabei wird jeweils die vorherige Version einfach ersetzt.

Furthermore, the new portal now also supports the option to slightly adjust the design. This is called Custom Branding.

Technically, it is all based on an xml-file which in turn refers to a json-file containing the color specifications, and, optionally, to a logo. These 3 files are packed as a zip-file and can then be uploaded as a “brand package” in the portal. The corresponding former version is thus simply replaced.

 Reporting_Services_2016_Custom_Branding

 

Das Ergebnis im Vergleich zum Original-Design oben:

The result in comparison to the original design above:

 Reporting_Services_2016_Custom_Brand_SarpedonQualityLab

 

So praktisch das ist, und wenngleich es Reporting Services auch ohne Sharepoint-Integration attraktiver macht, so enttäuschend finde ich persönlich, dass das auch alles ist, was in Sachen Design-Standardisierung möglich ist: Berichte sind davon nämlich nicht betroffen, wie ursprünglich erhofft. Dort ist in der Richtung nichts Neues gekommen. :-(

Vielleicht finde ich also doch noch Gelegenheit, meine damals begonnene Blog-Reihe, wie man Berichts-Layout + Design am besten standardisieren und zentralisieren kann, zu vervollständigen. Die hier (Standardizing and Centralizing Report Design (or: creating style sheets for reports) Part 1: The possibilities) von mir vorgestellte Technik ist also tragischerweise immer noch „State of the Art“ für seitenbasierte Berichte.

Mobile Reports sind hier im Vorteil: diese werden durch dieses Template mit abgedeckt – sie sind ja auch deutlich einfacher und von sich aus nicht so variabel, so dass das einfacher zu implementieren war.

As practical as this may be, and while it makes Reporting Services more attractive even without Sharepoint integration, I personally find it quite disappointing that this is all that’s possible in terms of design standardization: In fact, unlike initially anticipated, reports are not affected by it. This area has not seen anything new. :-(

Perhaps I will get an opportunity after all to complete my blog series on how best to standardize and centralize report layouts and designs, which I had started back then. Tragically, the technique I presented here (Standardizing and Centralizing Report Design (or: creating style sheets for reports) Part 1: The possibilities) is thus still “state of the art” for paginated reports. 

Mobile Reports have an advantage here: they are covered by these templates – they are considerably more simple and not as variable to begin with, which made it easier to implement.

Weitere Neuerungen im Portal sind die Möglichkeit jegliche Form von Bericht als Favorit markieren und in einem gesonderten Ordner „Favoriten“ wiederzufinden, Export nach Powerpoint, sowie die Abkehr von dem problematischen Active-X Control für den Ausdruck hin zu einem Druck nach pdf:

Further innovations in the portal include the possibility to mark any report form as favorite and find them in a specific “Favorites” folder; Export to Powerpoint; and the moving away from the problematic Active-X Control for printing towards Print to PDF:

 

 Reporting_Services_2016_Print_to_pdf

 

Die Abonnements haben einige kleinere Verbesserungen erfahren und lassen sich nun zB. leicht via Knopfdruck deaktivieren. Der Besitzer lässt sich ändern und für die Auslieferung in Dateifreigeben lassen sich nun „Shared Credentials“ verwenden.

The subscriptions have seen some smaller improvements and now can, for example, be easily deactivated at the push of a button. The owner can be changed, and for delivery to fileshares “Shared Credentials” can now be used.

 

Neuerungen für seitenbasierte Berichte

-           An diese Formulierung zur Abgrenzung von Mobile Reports werden wir uns wohl gewöhnen müssen…

Viel Neues hat sich in der rdl nicht getan.
Aber das Thema „Parameter-Bereich“ wurde angegangen und ist nun deutlich flexibler. Genauer gesagt, die Anordnung der Parameter kann nun freier bestimmt werden, indem ein System an Spalten und Zeilen implementiert wurde, in denen man die Parameter frei anordnen kann.

-           Früher waren ja immer 2 Parameter nebeneinander und einer nach dem anderen ohne Lücke automatisch angeordnet und nur die Reihenfolge bestimmbar.

Mit dem neuen System kann man also auch Platz zwischen einzelnen Parametern lassen und in bis zu 8 horizontalen und bis zu 45 vertikalen Spalten anordnen – bzw. eine entsprechende Anzahl an freien Feldern Abstand lassen, wenn man das denn möchte. So sieht das Parameter-Grid aus:

Nothing much has happened in the rdl.

However, the topic “Parameter area” was tackled and is now considerably more flexible.

More precisely, the arrangement of the parameters can now be freely determined. This was made possible by implementing a system of columns and lines in which the parameters can be freely arranged.

-           Previously, 2 parameters were always arranged next to each other and one after the other without a gap, and only the order could be determined.

With the new system, it is now possible to leave space between individual parameters and arrange them in up to 8 horizontal columns and up to 45 vertical columns – or you can leave a gap of a corresponding number of free fields if you wish. This is what the parameter grid looks like:

 Reporting_Services_2016_Parameter_Grid

 

Das Grid ist jedoch nicht flexibel. Die Breite der einzelnen Spalten und Höhe der Zeilen ist fix und wird nur bei Bedarf (zu langem Text) erweitert. Auch die Farbe kann man wie zuvor nicht beeinflussen.

However, the grid is not flexible. The width of the individual columns and the height of the cells is fixed and is only increased if necessary (in case of a too long text). As before, the color cannot be changed either.

Daneben gibt es zwei neue Diagramm-Typen: „Tree Map“ und „Sunburst“. Mit ersterem lassen sich Zahlen gut und nach Hichert-Regeln ins Verhältnis setzen. Auch „Heat Maps“ sollten damit deutlich leichter zu implementieren sein. Bisher hat man sich mit spatial Daten und den entsprechenden Karten-Diagrammen beholfen. So kann eine Tree Map aussehen, die Umsätze je Land nach Kategorien verteilt darstellt:

Besides this, there are two new types of diagrams: “Tree Map” and “Sunburst.” With the former, numbers can be put in relation easily and according to Few’s rules. It should also be much more easy to implement “Heat Maps” with it. Prior to this, one had to make do with spatial data and the corresponding map diagrams. This is what a Tree Map that illustrates sales per country, and placed in categories, can look like:

 Reporting_Services_2016_TreeMap_Chart

 

Und hier ein Beispiel für ein „Sunburst“-Diagramm, mit dem sich besonders schöne psychedelische Effekte erzielen lassen. Man sagt ja, dass Visualisierungen großen Einfluss auf Entscheidungen haben können. Mit etwas Knowhow lässt sich das sicher ausbauen… ;-)

Next follows an example of a „Sunburst“-diagram with which especially beautiful psychedelic effects can be achieved. It is said that visualizations may have a great influence on decisions. With a little knowhow this could surely be enhanced… ;-)

 

 Reporting_Services_2016_Sunburst_Chart_psych

 

Kleiner Spaß…

Der Einsatz ist für Hierarchien geeignet, speziell auch für „unausgeglichene“. Hier ein Standard-Beispiel mit einer unausgeglichenen Hierarchie mit einem Sunburst-Diagramm dargestellt:

Just kidding…

Its application is suitable for hierarchies, and, in particular, also for „ragged“ hierarchies. Below, a standard example of a ragged hierarchy is illustrated with a sunburst-diagram:

 

 Reporting_Services_2016_Sunburst_Chart_ragged

 

Das war’s zu den Neuerungen auch fast schon.

Eines bleibt noch zu erwähnen: Report-Elemente wie Diagramme, Tachos, Karten oder Bilder lassen sich nun auch in Power BI Dashboards integrieren.

Well, that is about all there is on innovations.

One more thing: Report elements such as diagrams, speedometers, maps or images can now also be integrated in Power BI Dashboards.

 

Zum Abschluss noch einige Links zum Weiterlesen:

In closing, here are a couple of links for further reference:

 

 

Happy Reporting – finally :-)

Andreas

Christoph Müller-Spengler: Create failed for Availability Group Listener

Problem

Today I tried to create an AlwaysOn Availability Group. Everything went fine until I configured the Availability Group Listener.

It failed with the error message:

Create failed for Availability Group Listener <ListenerName>.
Microsoft SQL Server, Error 19471.

AvailabilityGroups_CreateListenerError

The Windows Application Event Log is a little bit more helpful on that:

Cluster network name resource <ClusterName> failed to create its
associated computer object in domain. [...]
verify that the Cluster Identity <ClusterName> has 'Full Control' permission
to that computer object using the Active Directory Users and Computers tool.

AvailabilityGroups_CreateListener_EventLog

There we go.

Solution

If you have the rights in your domain to do so, just help yourself out of this, otherwise you have to contact your Domain Administrator to help you.

On your Domain Controller:

  • Open “Active Directory Users and Computers”
  • In menu “View” check “Advanced Features” to be able to find the OU where your Cluster object is located in.
  • On the root of your domain right click and choose “Find…”
  • In drop down meny “Find” select “Computers”
  • In the text box for “Computer name” type your Cluster name and click button [ Find Now ]
  • View the “Properties” of your Cluster object that was found.
  • On tab “Object” you will find the location (OU) where your Cluster object is located in.
  • Close all popups.
  • Navigate to the location you just figured out, perform a right click and choose “Properties”.
  • In tab “Security” click the button [ Add… ]
  • Click the button [ Object Types… ] , mark the checkbox next to “Computers” and leave the popup with a click on [ OK ].
  • In the textbox enter the name of your Cluster, check the name and leave the popup with a click on button [ OK ].
  • In the field for the permissions mark the check box for “Full control” and click Apply.
  • Leave the Dialog open.

 

Go to SQL Server Management Studio and repeat the attempt to create the Availability Group Listener.

Go back to the Domain Controller (or ask your Domain Admin to do so) and remove the “Full control” permission for the Cluster.

 

Happy listening to your Availability Groups:-)

Christoph


Robert Panther: Neue Features für künftige Versionen von SQL Server

SQL Server 2016 steht vor der Tür und wird voraussichtlich noch in diesem Quartal veröffentlicht. Die Release Candidates sind schon verfügbar und auch die Features sind mittlerweile weitgehend bekannt. Allerdings wird bereits an der darauf folgenden Version gearbeitet, zu der nun die ersten Infos zu möglichen Features durchgesickert sind:

Gefilterte gruppierte Indizes

Die Daten der Tabelle werden in zwei verschiedenen Arten vorgehalten. Die Zeilen, die der WHERE-Klausel entsprechen werden in Form eines gruppierten Indexes abgelegt, während die restlichen Zeilen als Heap gespeichert werden. Somit können bei passenden Abfragen die Vorteile eines gruppierten Indexes mit denen eines gefilterten Indexes kombiniert genutzt werden. Im Notfall ist aber auch noch die Gesamtheit der Daten abfragbar, ohne die indizierten Daten doppelt speichern zu müssen.

Beispiel:

CREATE CLUSTERED INDEX CX_PersonPhone_BusinessEntityID_CellPhoneNumber
ON Person.PersonPhone(PhoneNumber)
WHERE PhoneNumberTypeID=1

Der neue DISLIKE-Operator

Mit dem neuen DISLIKE Vergleichsoperator steht bald eine kompaktere Form des NOT LIKE zur Verfügung.
Während die alte Variante aber eine Kombination aus zwei Operatoren ist (LIKE-Operator mit anschließender Negierung durch NOT), wird der neue DISLIKE-Operator in einem Schritt ausgeführt und arbeitet daher auch deutlich performanter.

Beispiel:

SELECT * FROM Person.Person
WHERE LastName DISLIKE ‚Brown%‘

Da es sich bei diesem neuen Operator um eine T-SQL Erweiterung handelt, dürfte dieses Feature (auch wenn es ein Performance-Feature ist) nicht nur der Enterprise Edition vorbehalten sein, sondern stattdessen auch für die kleineren Editionen von SQL Server (bis hin zu Express) zur Verfügung stehen.

Neue Datentypen: CHAR(MAX), NCHAR(MAX), BINARY(MAX)

Beim Einfügen eines Datensatzes mit einem der so deklarierten Felder, wird nach dem Speichern der übrigen Spalten der maximal verfügbare Platz auf der jeweiligen 8 KB-Speicherseite für dieses Feld belegt und mit Leerzeichen (bzw. 0-Bytes bei BINARY(MAX)) aufgefüllt. Daraus ergibt sich die Einschränkung, dass nur ein Feld pro Tabelle einen der drei genannten Datentypen verwenden kann, da sonst nicht eindeutig geregelt ist, welches Feld den verfügbaren Platz belegen kann.

Das hat zur Folge, dass ein Datensatz, der einen der genannten Datentypen verwendet, genau eine Speicherseite belegt, wodurch Themen wie Füllfaktor und Index-Padding für diese Tabellen dann nicht mehr relevant sind. Durch die daraus resultierende direkte Beziehung (Anzahl Datensätze = Anzahl Speicherseiten) kann SQL Server deutlich genauere Vorhersagen treffen, wie viele Speicherseiten für die Ausführung einer Abfrage zu lesen sind, was wiederum bessere Ausführungspläne zur Folge haben kann.

Sinnvoll einzusetzen ist dieses Feature aber sicherlich nur dann, wenn die Tabelle ohnehin so breit ist, dass nicht allzu viele Zeilen auf eine Speicherseite passen würden, da ansonsten der Vorteil der insgesamt weniger zu lesenden Speicherseiten überwiegt.

Unklar ist zum jetzigen Zeitpunkt noch, wann diese Features in SQL Server Berücksichtigung finden. Nach den bisherigen Releasezyklen wäre etwa 2018 mit der nächsten Version von SQL Server zu rechnen, wobei es bei Microsoft auch im Bereich der Serverprodukte Ansätze gibt, häufigere aber dafür kleinere Releases zu veröffentlichen.

 


Christoph Müller-Spengler: redgate SQL Monitor – The RPC Server is unavailable

Lucky me, I am setting up redgate SQL Monitor to monitor SQL Server Instances. First to say – as ever – redgate is developing ingeniously simple tools. So the installation just took minutes, the services on one VM, the repository database on another.

After having this successfully finished i logged into the Web GUI and configured my first target Host where the SQL Server Instance is running that i want to monitor.

As expected everything went fine and the windows metrics appeared like “Disk avg. write time”.

Problem

But i was not able to have a look at the SQL Server metrics. So something must have gone wrong. I had a look at Configuration -> Monitoring: “Monitored servers” and found an unconnected machine.

But wait – the first few seconds there was a “Monitoring connected” message, so something must have gone wrong a couple of seconds later on. In column “Actions” i chose the link “Show log”.

redgate_SQLMonitor_Errorlog

Of course i googled “The RPC server is unavailable” along with “0x800706BA”. As I am currently dealing with a Windows Server Failover Cluster Instance I tried the  workaround mentioned in Warning Event ID 5605 is Logged in Application log when querying MSCluster namespace through WMI and edited the ClusWMI.mof adding the value FALSE to [RequiresEncryption(FALSE)]. But that did not help.

I also followed the advice from redgate support to check all methods that SQL Monitor uses to connect to the target Host and also the SQL Server Instance.

I also checked the firewall settings allowing tcp communication on port 135 and > 1024. Everything open.

When it came to WMI test using WbemTest I tried to connect to my target Host, but also received the well known error:

redgate_SQLMonitor_Wbem

So I consulted a colleague of mine to double check if my target Host was available from another VM.

Guess what: It was. So it must have had something to do with the configuration of the two VMs we were trying to connect to the target Host.

She mentioned that she had configured the DNS suffixes in the local search list.

That did the trick. With all my unsuccessful attempts to connect to my target Host I always defined it fqdn in SQL Monitor. But i guess that the WMI security settings on my target Host prevented me from getting the right response.

Solution

As the target Host is not in the same domain that my monitoring VM is in, i had to put the IP Address of the very target Host into the hosts file on the monitoring VM in location “C:\Windows\System32\drivers\etc\hosts”


123.45.67.89    SERVERNAME

Please note that I just put in the NetBIOS Name of the Server.

That did the trick.

Going back to SQL Monitor, deleting my unsuccessfully configured taret Host and configuring it once again, but this time not fqdn but only with the SERVERNAME it all worked well and finally i got everything up and running.

Happy monitoring to all of you:-)

Thank you for reading,

Christoph

 

 

 


Robert Panther: SQL Server 2016 RC1 verfügbar

Die Schlagzahl erhöht sich spürbar. Nachdem am 9. März der erste Release Candidate (RC0) von SQL Server erschienen ist, legte Microsoft lediglich 9 Tage später bereits nach und hat den Release Candidate 1 zum Download bereitgestellt:

https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016

Wie beim ersten Release Candidate handelt es sich um eine 180 Tage-Testversion (bis dahin dürfte die finale Version ja auf jeden Fall verfügbar sein).

Die wesentlichen Änderungen zum RC0 scheinen im Reporting Services Bereich zu liegen, wobei man bei den Release Candidates davon ausgehen sollte, dass sich an den Features ohnehin nicht mehr viel ändert, sondern vorrangig an der Beseitigung von Fehlern gearbeitet wird.

 


Robert Panther: Teil 2 der Artikelserie zum Thema SQL Server Indizes in der Windows Developer

In der aktuellen Ausgabe (4.16) der Zeitschrift Windows Developer ist inzwischen der zweite Teil meiner vierteiligen Artikelserie zum Thema SQL Server Indizes erschienen. Darin geht es um zusätzliche Indexoptionen sowie die Wartung von Indizes (und Indexstatistiken).

Nähere Infos dazu auf der Verlags-Website:
https://entwickler.de/windows-developer-magazin/windows-developer-4-16-210713.html

 


Robert Panther: Nachlese zur SQL Konferenz 2016 in Darmstadt

Die SQL Server Konferenz 2016 in Darmstadt ist zu Ende. 3 Tage Konferenz (davon ein PreCon Workshop Tag), ca. 50 Speaker (darunter auch viele MVPs aus dem In- und Ausland) und etwa 500 Teilnehmer machten das darmstadtium für eine kurze Zeit zum Zentrum der deutschen SQL Server Szene.

Die (nachträglich noch etwas ergänzten) Slides zu meinem Vortrag zum Thema Datenqualität können hier heruntergeladen werden: Datenqualität_Panther

SQLKonferenz2016_Panther


Robert Panther: Virtuelles SQL Server Launch Event

In Kürze (10.03.2016, 10:00 Eastern Standard Time = 16:00 deutscher Zeit) beginnt das Data Driven SQL Event in New York, bei dem Satya Nadella und Scott Guthrie den neuen SQL Server 2016 launchen. Das Event kann über folgenden Link per Live-Stream mitverfolgt werden: msft.it/6010Bw5Tk

Dies impliziert allerdings noch nicht zwingend die Verfügbarkeit der RTM-Version von SQL Server 2016, die für das zweite Quartal (Gerüchten zufolge im Mai) erwartet wird.

Ergänzung (vom 15.03.2016):

Inzwischen ist über denselben Link auch die Aufzeichnung der Veranstaltung abrufbar (aufgeteilt in mehrere kleine Videos). Dazu ist seit dem 09.03.2016 auch der erste Release Candidate (RC0) von SQL Server 2016 verfügbar. Ein Link zum Download der 180 Tage Testversion ist ebenfalls auf der genannten Seite zu finden.

 


Andreas Wolter: Sessions submitted for major conferences 2016. Topics: Security – Performance – In-Memory

Vorträge für die großen Konferenzen 2016 eingereicht. Themen: Sicherheit - Performance - In-Memory

(DE)
Nach dem tollen Verlauf der deutschen SQLKonferenz im Februar, wo ich die Ehre hatte, zusammen mit Joachim Hammer, dem Program Manager der Security-Teams für die relationalen SQL Engines bei Microsoft in Redmond die neuen Sicherheitsfeatures des SQL Server 2016 vorzustellen (mehr Infos), habe ich nun endlich Zeit gefunden, die nächsten großen Konferenzen dieses Jahres anzugehen.

(EN)
After the great success of the German SQLKonferenz in February, where I had the honor of presenting the new security features of SQL Server 2016 together with Joachim Hammer, the Program Manager of the security teams of the relational SQL Engines at Microsoft in Redmond (more info), I finally found time to go about the next big conferences this year.

Für den PASS Summit 2016, der wieder in Seattle/USA stattfindet, und auch für den SQLServerGeeks Annual Summit 2016, der in Bangalore/Indien stattfindet habe ich insgesamt 6 Sessions aus den Themengebieten „Sicherheit“, „Performance Analyse“ und „In-Memory“ ausgearbeitet und eingereicht. Dazu kommen 2 ganztägige PreCons zum Thema „Sicherheit“ und „In-Memory“.
Wen es interessiert, zu sehen, was ich diesmal „in Petto“ habe, kann die Abstracts hier einsehen.

For the PASS Summit 2016 which is again taking place in Seattle/USA as well as for the SQLServerGeeks Annual Summit 2016 which is taking place in Bangalore/India, I worked out and submitted 6 sessions altogether from the subject areas “Security,” “Performance Analysis” and “In-Memory.” Added to that 2 full-day PreCons with the topics “Security” and “In-Memory.”
For whoever is interested to see what I have “up my sleeve” this time, can review the abstracts here.

 

Pre-Conferences:

SQL Server Security black belt – attack, protect and keep secure

Security Hardening is a subject which, sooner or later, every DBA will face. Microsoft SQL Server, according to the NIST vulnerability database the most secure RDBMS for years, contains many features that help keep the data secure on different layers. At the same time, ever-new applications which use databases on your servers, support-personnel, deployment-processes, auditors, and other processes and real people are constantly demanding access to your Server.

At this full-day pre-conference you will see how external and internal attackers can gain access to sensitive data. You will then learn how to secure the different attack surfaces of a typical SQL Server, and protect not only Data at Rest but also Data in Use and Data in Transit and learn best practices to prevent common vulnerabilities.

In the second part you will get to know fundamental security principles such as

  • Least Privilege;
  • Segregation of Duties;
  • Reconstruction of Events;
  • Delegation of Authority;

and you will learn how to use built-in functionalities of SQL Server (some limited to v2016) to build your own security frameworks to secure Deployment and Monitoring, separate Job-permissions; how to implement time-based permissions and which techniques can help reconstruct security-relevant events.

If you are in charge of creating or implementing security concepts or need a full picture of attack surface protection and concepts, this session is exactly right for you.

 

In-Memory in SQL Server 2016 – from 0 to Operational Analytics Hero

The Columnstore Index technology came with SQL Server 2012 in the form of Nonclustered Columnstore, and SQL Server 2014 brought us updatable Clustered Columnstore Indexes and a completely new In-Memory Engine for memory optimized table & indexes.

SQL Server 2016 is adding the updatable Nonclustered Columnstore Indexes that can both operate on row store as well as on memory-optimized tables, called In-Memory Operational Analytics. With the In-Memory engine being extensively improved in terms of both scalability and T-SQL language support, In-Memory will become a viable option in many projects.

On this training day, attendees will be given a complete picture on the current state of technology and how and where to use either In-Memory OLTP or ColumnStore or both for efficient queries and data store.

 

General sessions:

Extended Events – The Top Features for efficient Traces

Extended Events, which entered the product in SQL Server 2008, are replacing the old SQL Trace & Profiler - and there are many good reasons for that. In this session you will see a selection of the most fascinating possibilities using this Tracing Framework. If you want to find out how to trace in a flexible and lightweight way, how to do advanced analysis directly inside the GUI, how to audit Database and Table-access without Auditing, how to analyze deadlocks without old-fashioned TraceFlags based on the built-in system_health session, this session is just for you. You will also learn how to use the GUI in an effective way for top-down-analysis and what is possible with some XQuery scripting.

 

Performance Analyzing SQL Server workloads with DMVs and XEvents

This session you will be lead you through an example performance-analysis using mainly DMVs and Extended Events. You will see how a top-down analysis using built-in tools can be conducted. This will include wait statistics on different scopes to identify performance problems and bottlenecks up to identifying query plan changes – with & without using the Query Store of SQL Server 2016. If you are new to performance analyzing this session will give you a practical insight into how to methodically approach performance troubleshooting.

 

SQL Server 2016 – the evolution of In-Memory technologies

For SQL Server 2014 a completely new In-Memory Engine for memory optimized table & indexes was integrated into SQL Server with in fact very limited functionality.

For SQL Server 2016 the In-Memory engine is being extensively improved in terms of both scalability as well as T-SQL language support. Moreover the ColumnStore index technology has been improved and can now even be combined with memory-optimized tables.

This session will provide an overview of the new possibilities and demonstrate where a particular technology may help – or where you cannot expect benefits. If you are planning to go on SQL Server 2016 any time soon, this session shows you two of the most important features that SQL Server 2016 brings.

 

 

SQL Server Security black belt series: Securing Data

You have installed SQL Server and have heard about several “best practices,” maybe renamed the sa account, but now what?

In this session you will see demos of several methods how an attacker can get access to data in Use & in Transit and see which available built-in technologies provide help in mitigating such attacks. You will be given guidance on how to systematically identify possible threats and ne given best practices at hand.

Among the technologies that can be seen are Network sniffing, a Threat Modeling Tool, TDE and the new Always Encrypted technology of SQL Server 2016. This session is mainly targeting Administrators but many concepts and samples should be valuable knowledge for developers as well.

 

SQL Server Security black belt series: Securing Operations

You got SQL Server up and running and thought you could easily secure it by completely denying all access to everybody else except you and your co-admin, but you realize that there are many more individuals demanding access for daily or weekly operations. You have heard about “Segregation of Duties” and “Least Privilege” and are looking into how you can properly implement it with SQL Server.

In this session you will learn about techniques and approaches on how to implement secure processes in order to ensure both “Least Privilege” and “Segregation of Duties” and at the same time “Reconstruction of Events.” Among the techniques shown are “time based-permissions” and custom server roles for performance analysis and job-monitoring.

 

“SQL Attack…ed” – SQL Server under attack via SQL Injection

One of the most frequently attacked targets is the data that resides in a database server. SQL Server is considered “secure by default,” but this is only relevant until the first databases and configurations have been changed. This is why most of the exploited weaknesses are due to misconfiguration or weak coding practices as opposed to security bugs in SQL Server itself, of which we had only a few in the last 10 years.

In this purely demo-based session you will see samples of several real-life attacks, from mere reading up to disrupting service availability via various types of manual and automated SQL Injection, including a broadly unknown elevation of privileges attack for a non-sa account.

If you have a database-server which is accessible by processes beyond your direct control or which even can be reached by some kind of frontend applications, and you are unsure what the possible security implications to watch out for, this session is meant for you.

 

Ich werde natürlich posten, wenn meine Vorträge für 2016 feststehen. Vielleicht sieht man sich ja auf der einen oder anderen Konferenz. :-)

Of course I will post when my presentations for 2016 are fixed. Maybe you can meet me at one or another conference. :-)

 

Andreas

Philipp Lenz: SYNOPTIC DESIGNER FOR POWER BI – CUSTOM VISUALS

Mit dem Synoptic Designer für Power BI können individuelle Grafiken erstellt und integriert werden. Hierfür nutzen ich den Power BI Designer (Desktop Version)  für Windows.
[Download: https://powerbi.microsoft.com/de-de/desktop/]

Aufbau

In diesem Artikel möchte ich demonstrieren wie ein Fußballfeld in einen Bericht integriert wird, um Statistiken aus einem Fußball-Spiel visuell besser darstellen zu können.

Das Spielfeld ist schnell selbst gezeichnet oder aus dem Internet geladen und auf der Synoptic Webseite [https://synoptic.design/ ] wird dies eingefügt und die Bereiche werden markiert:1

Daten

Die korrespondierende Excel Tabelle mit den Daten ist folgendermaßen aufgebaut:

2

Die Spalte „Area“ gibt auch den Namen im Designer, dadurch erfolgt die Zuordnung der Daten auf das Spielfeld, bzw. die Grafik.

Integration

Im Designer exportiert man nun die Grafik mit den Markierungen via „Export to Power BI“ als SVG Datei.

Zuerst wird aber die Excel Tabelle in den Power BI Designer importiert:

3

Anschließend erstellen wir noch folgende Measures zum zählen des Spielstandes:

  1. Tore Team B = CALCULATE(COUNTA(Spieldaten[Aktion]); Spieldaten[Aktion]=“Tor“; Spieldaten[Team] =“B“)
  2. Tore Team A = CALCULATE(COUNTA(Spieldaten[Aktion]); Spieldaten[Aktion]=“Tor“; Spieldaten[Team] =“A“)
  3. Tore Gesamt = [Tore Team A]+[Tore Team B]

 

Der nächste Schritt ist, die sogenannten Custom Visuals in den Designer zu verankern, dafür wählt man auf der Webseite „Get the latest Version“ und lädt die Datei herunter. Anschließend wird diese integriert:

4

Nun kann dieses Panel in den Bericht integriert werden.

Design und Aufbereitung

Nachdem das Panel positioniert wurde, werden die Felder aus den Daten eingesetzt:

Area -> Legend

Aktion -> Values

5

 

 

 

 

 

 

 

 

Anschließend wird via „select map“ die heruntergeladene Karte (SVG Datei) ausgewählt.

Nun werden noch weitere Grafiken positioniert und befüllt:

6

 

 

 

 

 

Okay, anschließend noch das Dashboard auf das kostenlose Power BI Konto hochladen und im Web veröffentlichen:
Link

Philipp Lenz: User defined types in SQL Server

Zuletzt hatte ich das Problem, dass ich temporäre Daten in einer TABLE-Variable hatte und diese in einer Tabellenwert Funktion weiter verarbeiten musste. Problem dabei war, wie gebe ich meine Tabelle an die Funktion weiter?

Die erste Idee war, dass ich eine temporäre Tabelle erstelle und die Daten dort platziere und dann in der Funktion lese – tsja, dass geht leider nicht, bzw. dies lässt der SQL Server nicht zu.

Okay, und nun? Da diese Funktionalität ständig zur Verfügung (zur Verwendung in einem SSRS Bericht) stehen musste, brauchte ich eine stabile und multiuser-fähige Lösung.

Nächste Idee wäre, eine physische Tabelle zu erstellen und darin die Daten zu speichern. Für die multiuser-Fähigkeit könnte ich Prozess- oder die Benutzer ID aufnehmen… ist aber irgendwie umständlich, da einerseits Berechtigungen auf die Tabelle erteilt werden müssen, Indizierung, Speicher etc …

Die Lösung war nun, benutzerdefinierte Typen im SQL Server zu erstellen. Bisher kannte ich das mehr von CLR’s, aber der SQL Server bietet bereits seit Version 2008 die Möglichkeit, eigene Typen für Tabellenwert-Variablen zu erstellen.

Via CREATE TYPE wird der Typ mit der entsprechenden Definition erstellt, bspw.:

CREATE TYPE tmpDataType As Table (
 data VARCHAR(255));
GO

Aus diesem Type kann dann ein entsprechendes Objekt erstellt werden:

DECLARE @tmpDataTable As tmpDataType;

Dieses Objekt kann dann wie eine bisherige Tabellenwert Variable mit Daten befüllt werden. Das Verhalten ist völlig identisch mit den bisherigen Tabellewert Variablen, die Daten können darin manipuliert, ergänzt oder gelöscht werden.  Der eigentliche Vorteil ist nun, dass ich dieses Objekt an eine Funktion weitergeben kann:

CREATE FUNCTION dbo.testFunc(@tmpDataTable tmpDataType READONLY)
RETURNS TABLE
RETURN (
 -- return the data or do somethin else ...
 SELECT data FROM @tmpDataTable
);
GO
DECLARE @tmpDataTable As tmpDataType;
INSERT INTO @tmpDataTable
SELECT data FROM dbo.data;
SELECT * FROM dbo.testFunc(@tmpDataTable);
GO

 

Das war’s schon!

 

 

Vollständiges Demo-Script (Verwendung auf eigene Gefahr!)

-- create a tmp.-DB
CREATE DATABASE TYPETEST;
GO
USE TYPETEST;
GO
-- create a demo table
CREATE TABLE dbo.data (
 id INT not null primary key identity(1,1)
 , data VARCHAR(255));
GO
-- insert demo data
INSERT INTO dbo.data (data) VALUES ('VAL1'), ('VAL2'), ('VAL3');
GO
-- create a temp table
CREATE TABLE ##tmpData (data VARCHAR(255));
GO
-- fill the demo table
INSERT INTO ##tmpData
SELECT data FROM dbo.data;
GO
-- create a function to read the demo data from the temp table
--CREATE FUNCTION dbo.testFunc()
--RETURNS TABLE
--RETURN (
-- SELECT data FROM ##tmpData
--);
--GO
-- Does not work, in functions you do not have the option to read from temporaly tables ...
-- and now?!
-- but how can i move my temporally data to my function?
-- one option is to create a pyhsically table with the process id ... but do you need this for sure?!
-- NO!
-- create a user type table variable in the database (be carefull, this is in the database a global type!!
CREATE TYPE tmpDataType As Table (
 data VARCHAR(255));
GO
-- create a function with a parameter from the user defined typ
CREATE FUNCTION dbo.testFunc(@tmpDataTable tmpDataType READONLY)
RETURNS TABLE
RETURN (
 -- return the data or do somethin else ...
 SELECT data FROM @tmpDataTable
);
GO
-- create a object from our new type
DECLARE @tmpDataTable As tmpDataType;
-- fill our object with demo data
INSERT INTO @tmpDataTable
SELECT data FROM dbo.data;
-- execute our new function
SELECT * FROM dbo.testFunc(@tmpDataTable);
GO
-- clean up
DROP TABLE ##tmpData;
GO
USE tempdb;
GO
DROP DATABASE TYPETEST;

Andreas Wolter: Schema-design for SQL Server: recommendations for Schema-design with security in mind

Andreas Wolter: SQLKonferenz in Darmstadt: Vorstellung der Security Features von SQL Server 2016 mit dem Leiter des Security-Teams aus Redmond

Uwe Ricken: AUTO_UPDATE_STATISTICS wird nicht immer ausgeführt

Der von mir sehr geschätzte Kollege und Kenner der SQL Server Engine Torsten Strauss kam mit einer sehr interessanten Beobachtung auf mich zu. Dabei ging es um die Frage, wann Statistiken aktualisiert werden, wenn für die Datenbank die entsprechende Option aktiviert ist. Dieser Artikel zeigt, dass es bestimmte Situationen gibt, in denen eine automatische Aktualisierung der Statistiken nicht durchgeführt wird.

Statistiken

Der Abfrageoptimierer verwendet Statistiken zum Erstellen von Abfrageplänen, die die Abfrageleistung verbessern. In den meisten Fällen generiert der Abfrageoptimierer automatisch die erforderlichen Statistiken; in anderen Fällen müssen weitere Statistiken erstellen werden, um optimale Ergebnisse zu erzielen. Statistiken können veraltet sein, wenn die Datenverteilung in der Tabelle durch Datenänderungsvorgänge geändert wird.

Wenn die Option „AUTO_UPDATE_STATISTICS“ aktiviert ist, prüft der Abfrageoptimierer, wann Statistiken veraltet sein könnten, und aktualisiert diese Statistiken, sobald sie von einer Abfrage verwendet werden. Der Abfrageoptimierer stellt fest, wann Statistiken veraltet sein könnten, indem er die Anzahl der Datenänderungen seit des letzten Statistikupdates ermittelt und sie mit einem Schwellenwert vergleicht. Der Schwellenwert basiert auf der Anzahl von Zeilen in der Tabelle oder indizierten Sicht. Pauschal gilt eine Statistik als veraltet, wenn mehr als 20% + 500 Datenänderungen durchgeführt wurden. Weitere Informationen zu den Schwellenwerten finden sich hier: https://support.microsoft.com/de-de/kb/195565.

Hinweis

Im nachfolgenden Artikel werden Traceflags verwendet, die nicht von Microsoft dokumentiert sind. Es wird darauf hingewiesen, dass eigene Beispiele nicht in einer Produktionsumgebung ausgeführt werden. Folgende Traceflags werden in den Codes verwendet:

  • 3604: Aktiviert die Ausgabe von Meldungen in den Client statt ins Fehlerprotokoll
  • 9204: Zeigt die für den Abfrageoptimierer „interessanten“ Statistiken, die geladen werden
  • 9292: Zeigt die Statistiken an, die der Abfrageoptimierer in der Kompilephase für „interessant“ hält
  • 8666: Speichert Informationen über verwendete Statistiken im Ausführungsplan

Testumgebung

Das die obige Aussage bezüglich der Aktualisierung von Statistiken nicht pauschal angewendet werden kann, zeigt das nachfolgende Beispiel. Dazu wird eine Tabelle [dbo].[Customer] angelegt und mit ~10.500 Datensätzen gefüllt. Die Tabelle [dbo].[Customer] besitzt zwei Indexe; zum einen wird ein eindeutiger Clustered Index auf dem Attribut [Id] verwendet und zum anderen wird das Attribut [ZIP] mit einem nonclustered Index versehen.

-- Create the demo table 
IF OBJECT_ID(N'dbo.Customer', N'U') IS NOT NULL
   DROP TABLE dbo.Customer;
   GO

CREATE TABLE dbo.Customer  
(
   Id     INT          NOT NULL IDENTITY (1, 1),  
   Name   VARCHAR(100) NOT NULL,  
   Street VARCHAR(100) NOT NULL,  
   ZIP    CHAR(5)      NOT NULL,  
   City   VARCHAR(100) NOT NULL  
);
GO  

-- and fill it with ~10,000 records 
INSERT INTO dbo.Customer WITH (TABLOCK)
(Name, Street, ZIP, CIty)
SELECT 'Customer ' + CAST(message_id AS VARCHAR(10)),  
       'Street ' + CAST(severity AS VARCHAR(10)),  
       severity * 1000,  
       LEFT(text, 100)  
FROM   sys.messages  
WHERE  language_id = 1033;  
GO  

-- than we create two indexes for accurate statistics 
CREATE UNIQUE INDEX ix_Customer_ID ON dbo.Customer (Id);
CREATE NONCLUSTERED INDEX ix_Customer_ZIP ON dbo.Customer (ZIP);
GO 

-- what statistics will be used by different queries
-- result of implemented statistics 
SELECT S.object_id, 
       S.name, 
       DDSP.last_updated, 
       DDSP.rows, 
       DDSP.modification_counter 
FROM   sys.stats AS S 
       CROSS APPLY sys.dm_db_stats_properties(S.object_id, S.stats_id) AS DDSP 
WHERE  S.object_id = OBJECT_ID(N'dbo.Customer', N'U'); 
GO

STATISTICS_DATA_01

Die Abbildung zeigt, dass für die Tabelle zwei Statistik-Objekte existieren. Insgesamt sind 10.557 Datensätze in der Tabelle und es wurden noch keine weiteren Modifikationen an den Daten vorgenommen. Da der zweite Index nicht eindeutig ist, gilt das Augenmerk der Verteilung der Daten in diesem Index. Dazu wird der folgende T-SQL-Befehl ausgeführt:

-- show the distribution of data in the statistics 
DBCC SHOW_STATISTICS ('dbo.Customer', 'ix_Customer_ZIP') WITH HISTOGRAM; 
GO 

DBCC_SHOW_STATISTICS_01

Die Verteilung der Schlüsselwerte ist sehr heterogen. Während für den ZIP-Code „12000“ lediglich ein Eintrag vorhanden ist, sind es für den ZIP-Code „16000“ mehr als 7.500 Datensätze. Abhängig vom zu suchenden ZIP-Code besteht zusätzlich die Gefahr von „Parameter Sniffing“; das soll aber in diesem Beitrag nicht weiter thematisiert werden.

Abfragen

Sobald die Tabelle erstellt wurde, kann mit den Abfragen begonnen werden. Es werden zwei Abfragen auf die Tabelle ausgeführt, die jeweils unterschiedliche Indexe adressieren. Bei den Abfragen gilt die besondere Beachtung dem Umstand, dass sie hoch selektiv sind; sie verwenden einen „=“-Operator für die Suche nach Datensätzen.

DBCC TRACEON (3604, 9204, 9292, 8666);  
GO 

DECLARE @stmt NVARCHAR(1000) = N'SELECT * FROM dbo.Customer WHERE Id = @Id;';
DECLARE @parm NVARCHAR(100) = N'@Id INT';
EXEC sp_executesql @stmt, @parm, 10;
GO 

DECLARE @stmt NVARCHAR(1000) = N'SELECT * FROM dbo.Customer WHERE ZIP = @ZIP;';
DECLARE @parm NVARCHAR(100) = N'@ZIP CHAR(5)';
EXEC sp_executesql @stmt, @parm, '18000';
GO 

Die erste Abfrage verwendet den eindeutigen Index [ix_Customer_Id] während die zweite Abfrage einen performanten INDES SEEK auf den Index [ix_Customer_ZIP] ausführt. Die aus den Abfragen resultierenden Ausführungspläne stellen sich wie folgt dar:

EXECUTION_PLAN_01

Eindeutiger Index

Die Abfrage auf eine bestimmte ID in der Tabelle führt IMMER zu einem INDEX SEEK auf dem Index [ix_Customer_ID]. Durch den „=“-Operator in Verbindung mit dem eindeutigen Index ist gewährleistet, dass immer nur ein Datensatz geliefert werden kann.

Nicht eindeutiger Index

Die Abfrage auf einen bestimmten ZIP-Code kann zu unterschiedlichen Ausführungsplänen führen. Welcher Ausführungsplan verwendet wird, hängt von der Distribution der Kardinalitäten ab. Wenn es sich nur um sehr wenige Datensätze handelt, wird ein INDEX SEEK verwendet; sind jedoch die mit einem INDEX SEEK einhergehenden Lookups zu hoch, wird sich der Abfrageoptimierer für einen TABLE SCAN entscheiden. Man kann also beim ZIP-Code von einem „instabilen“ und „nicht vorhersehbaren“ Ausführungsplan sprechen.

Manipulation der Daten

Basierend auf den Statistiken entscheidet sich der Abfrageoptimierer von Microsoft SQL Server für eine entsprechende Ausführungsstrategie. Werden mehr als 20% der Daten einer Statistik (+500) geändert, so wird eine Statistik invalide.

Das nachfolgende Skript fügt weitere 4.000 Datensätze zur Tabelle hinzu. Bei 10.557 bereits in der Tabelle vorhandenen Datensätzen müssen mindestens 2.612 Datensätze geändert / hinzugefügt werden, damit die Statistiken als veraltet gekennzeichnet werden (10.557 * 20% + 500). Mit den hinzugefügten 4.000 Datensätzen ist dieser Schwellwert auf jeden Fall überschritten.

-- now additional 4,000 records will be filled into the table 
-- to make the stats invalid! 
INSERT INTO dbo.Customer WITH (TABLOCK)  
(Name, Street, ZIP, City)
SELECT TOP 4000 
       'Customer ' + CAST(message_id AS VARCHAR(10)),  
       'Street ' + CAST(severity AS VARCHAR(10)),  
       severity * 1000,  
       LEFT(text, 100)  
FROM   sys.messages  
WHERE  language_id = 1033;  
GO 

STATISTICS_DATA_02

Wie in der Abbildung zu erkennen ist, wurden die 4.000 Datenmanipulationen registriert; diese Aktualisierungen verbleiben so lange in den Statistiken, bis sie erneut abgerufen werden und ggfls. aktualisiert werden.

In der Online-Dokumentation von Microsoft SQL Server heißt es: „Bevor der Abfrageoptimierer eine Abfrage kompiliert und einen zwischengespeicherten Abfrageplan ausführt, sucht er nach veralteten Statistiken. … Vor dem Ausführen eines zwischengespeicherten Abfrageplans überprüft die Database Engine, ob der Abfrageplan auf aktuelle Statistiken verweist.“.

Folgt man der Beschreibung aus der Online-Dokumentation, so müsste bei erneuter Ausführung der zuvor erstellten Abfragen eine Prüfung der Statistiken durchgeführt werden und die Statistiken – auf Grund der Änderungsquote von mehr als 20% – aktualisiert werden.

DBCC TRACEON (3604, 9204, 9292, 8666); 
GO 

DECLARE @stmt NVARCHAR(1000) = N'SELECT * FROM dbo.Customer WHERE Id = @Id;';
DECLARE @parm NVARCHAR(100) = N'@Id INT';
EXEC sp_executesql @stmt, @parm, 10;
GO 

DECLARE @stmt NVARCHAR(1000) = N'SELECT * FROM dbo.Customer WHERE ZIP = @ZIP;';
DECLARE @parm NVARCHAR(100) = N'@ZIP CHAR(5)';
EXEC sp_executesql @stmt, @parm, '18000'; 
GO 

DBCC TRACEOFF (3604, 9204, 9292, 8666); 
GO 

STATISTICS_USAGE_01

Die Abbildung zeigt, dass für die erste Abfrage auf die [ID] die Statistiken nicht erneut überprüft wurden. Für die zweite Abfrage wurden die Statistiken erneut überprüft. Im Ergebnis zeigt dieses Verhalten auch die Abfrage nach den Zuständen der Statistiken der betroffenen Tabelle.

 SELECT S.object_id, 
       S.name, 
       DDSP.last_updated, 
       DDSP.rows, 
       DDSP.modification_counter 
FROM   sys.stats AS S 
       CROSS APPLY sys.dm_db_stats_properties(S.object_id, S.stats_id) AS DDSP 
WHERE  S.object_id = OBJECT_ID(N'dbo.Customer', N'U'); 
GO

STATISTICS_DATA_03

Die Statistiken für den Index [ix_Customer_ZIP] wurden aktualisiert und die 4.000 neuen Datensätze sind in der Statistik enthalten. Für den eindeutigen Index [ix_Customer_ID] wurde diese Aktualisierung jedoch nicht vorgenommen. Der Grund für dieses Verhalten ist relativ einfach zu erklären:

Begründung für das Verhalten

Eindeutiger Index

Wen ein eindeutiger Index auf dem Schlüsselattribut abgefragt wird, muss Microsoft SQL Server keine Statistiken bemühen, da IMMER davon ausgegangen werden kann, dass ein gesuchter Wert nur einmal in im Index erscheint. Bei der ersten Ausführung der Abfrage wurde ein NEUER Ausführungsplan generiert. Insofern stimmt die Aussage aus der Online-Dokumentation. Bevor die Abfrage kompiliert und ein Plan generiert werden kann, müssen die Statistiken überprüft werden. Bei der zweiten Ausführung dieser Abfrage lag der Plan bereits vor; warum sollte Microsoft SQL Server hier die Strategie ändern? Da auf Grund der Eindeutigkeit der Indexwerte niemals mehr als ein Datensatz im Ergebnis erscheinen kann, muss der Plan nicht erneut überprüft werden – er ist „stabil“

Nichteindeutiger Index

Bei der zweiten Abfrage sieht die Stabilität des Plans etwas anders aus. Der Index ist nicht als UNIQUE erstellt worden; es können also pro Schlüsselwert mehrere Daten im Index vorhanden sein. Wenn tatsächlich die Anzahl der Datensätze zu einem Schlüsselattribut variieren, dann ist der Plan „instabil“; er ist abhängig von der Anzahl der vorhandenen Datensätze. In diesem Fall trifft die zweite Aussage aus der Online-Dokumentation zu – der Plan muss auf Validität überprüft werden. Dazu gehört das Überprüfen der veralteten Statistiken. Nun stellt Microsoft SQL Server fest, dass die Statistiken Änderungen erfahren haben, die über dem Schwellwert liegen und somit werden die Statistiken vor der Erstellung des Plans aktualisiert.

Zusammenfassung

Statistiken sind bei Performance-Problemen immer ein Punkt, der überprüft werden sollte. Statistiken werden aber – entgegen der Aussage von Microsoft – nicht grundsätzlich aktualisiert, sobald der definierte Schwellwert überschritten ist. Statistiken werden auch nicht durch einen Background-Task aktualisiert. Die Aktualisierung von Statistiken beruht darauf, wie stabil / instabil ein gespeicherter Plan ist. Wird – auf Grund der Stabilität – bei der Ermittlung der Datensätze erkannt, dass sich die Datenmenge nicht verändern kann, kann es passieren, dass Statistiken so lange nicht aktualisiert werden, bis entweder ein bestehender Plan aus dem Cache gelöscht wird oder aber eine Abfrage mit RECOMPILE dazu gezwungen wird, einen neuen Plan zu verwenden.

Herzlichen Dank fürs Lesen!

Bernd Jungbluth: 5. SQL Server und .NET-Enwickler-Konferenz

Das Programm zur diesjährigen SNEK ist komplett:

Analyse und Bewertung von Wait Stats - Warum muss der SQL Server warten?
Entzauberung von Clustered Indexen
beide von Uwe Ricken

Sicher?
von Thomas Trefz

.NET Core
Git für Softwareentwickler
beide von Rainer Stropek

Backend in der Cloud: API Apps und Logic Apps in Azure
Universal Windows 10 Apps
beide von Thomas Mutzl

In meinem Vortrag zeige ich einige ausgewählte Neuerungen von SQL Server 2016.

Die Konferenz findet wie jedes Jahr in Nürnberg statt.
Weitere Informationen zu den Vorträgen, rund um die Veranstaltung und eine Anmeldemöglichkeit stehen unter http://www.donkarl.com/snek/ bereit.

Aktuell gibt es nur noch 20 freie Plätze!

Wie jedes Jahr freue ich mich auf die Vorträge und ganz besonders auf das Wiedersehen mit den vielen Stammgästen.

Robert Panther: Ankündigung: BASTA! Spring in Darmstadt

Auch auf der diesjährigen Spring-BASTA! werde ich mit einem eigenen Vortrag vertreten sein und zwar am 03. März ab 14:00 Uhr mit dem Thema „Datenqualität konsequent umgesetzt“. Dabei werden verschiedene Ansätze aufgezeigt, wie man mit den Mitteln, die SQL Server in den verschiedenen Versionen (bis hin zu SQL Server 2016) zur Verfügung stellt, eine möglichst gute Datenqualität erreicht. Dabei wird stets die Praxistauglichkeit im Vordergrund stehen. Es geht also weniger darum, was alles theoretisch machbar ist, sondern eher, wie man mit vertretbarem Aufwand die bestmögliche Datenqualität erzielt. Auch der Aspekt, wie man aus Entwicklersicht zu einer möglichst guten Datenqualität beitragen kann, wird dabei eine wichtige Rolle spielen.

Official Speaker at BASTA! 2016 Spring Edition

Die BASTA! Spring mit dem Themenschwerpunkt „The Best of Best Practices!“ findet vom 29. Februar bis 4. März im Maritim Rhein-Main Hotel in Darmstadt statt, wobei der erste und letzte Tag Workshoptage sind, während die anderen drei Tage klassische Konferenztage mit zahlreichen kürzeren Vorträgen sind.

Weitere Infos sind auf der Veranstaltungswebsite zu finden: https://basta.net


Robert Panther: Artikelserie zum Thema SQL Server Indizes in der Windows Developer

In der aktuellen Ausgabe (3.16) der Zeitschrift Windows Developer startet meine vierteilige Artikelserie zum Thema SQL Server Indizes.
Im ersten Teil geht es vor allem um Index-Grundlagen der klassischen gruppierten und nicht-gruppierten Indizes. In den folgenden Teilen werden die Themen Indexoptionen, Wartung von Indizes, spezielle Indexformen bis hin zu Columnstore Indizes behandelt, so dass alle wesentlichen Indexthemen abgedeckt sind.

Nähere Infos dazu auf der Verlags-Website:
https://entwickler.de/windows-developer-magazin/windows-developer-3-16-196957.html


Bernd Jungbluth: Seminar - SQL Server Integration Services

Nach langer Zeit findet das Seminar SQL Server Integration Services wieder statt:

26. + 27. April 2016 im Hotel Ebertor in Boppard am Rhein

SQL Server Integration Services - kurz SSIS - ist das ETL-Tool von Microsoft zur Integration von Daten unterschiedlicher Quellen in ein Datawarehouse-System. Das Füllen und Aktualisieren von Datawarehouse-Systemen ist jedoch nicht die einzige Einsatzmöglichkeit von SSIS.

SSIS lässt sich immer dann einsetzen, wenn es darum geht, Daten zu importieren, exportieren, transformieren, aufzubereiten, migrieren, konsolidieren oder zu integrieren - ob nun als einfache Datentransfers, Import-/Export-Routinen, ETL-Lösungen oder als komplexe Datenintegrationslösungen.

In diesem 2-tägigen Seminar wird die Realisierung von SSIS-Projekten behandelt.
Dabei steht die Entwicklung dieser Projekte im Mittelpunkt, ergänzt mit deren Bereitstellung und Betrieb.

Das Seminar basiert auf SQL Server Integration Services in den Versionen 2012 und 2014.

Preis: 700 Euro inkl. Mittagessen und Getränke zzgl. MwSt.

Die Teilnehmerzahl ist auf 8 Personen begrenzt.

Weitere Informationen zum Seminar gibt es unter www.berndjungbluth.de/ssis.pdf.

Uwe Ricken: Zusammenhang zwischen dynamischem SQL und veralteten Statistiken

In einem aktuellen Projekt bin ich auf eine Technik gestoßen, die – LEIDER – noch viel zu häufig von Programmierern im Umfeld von Microsoft SQL Server angewendet wird; Konkatenation von Texten zu vollständigen SQL-Befehlen und deren Ausführung mittels EXEC(). Dieser Artikel beschreibt einen – von vielen – Nachteil, der sich aus dieser Technik ergibt und zeigt einen Lösungsweg, die in den nachfolgenden Beispielen gezeigten Nachteile zu umgehen.

Dynamisches SQL

Unter “dynamischem SQL“ versteht man eine Technik, mit der man SQL-Fragmente mit variablen Werten (meistens aus zuvor deklarierten Variablen) zur Laufzeit zusammensetzt so dass sich aus den Einzelteilen am Ende ein vollständiges SQL Statement gebildet hat. Dieser “SQL-Text“ wird entweder mit EXEC() oder mit sp_executesql ausgeführt. Das nachfolgende Code-Beispiel zeigt die – generelle – Vorgehensweise:

-- Erstellen einer Demotabelle mit verschiedenen Attributen
CREATE TABLE dbo.demo_table
(
    Id        INT          NOT NULL    IDENTITY (1, 1),
    KundenNo  CHAR(5)      NOT NULL,
    Vorname   VARCHAR(20)  NOT NULL,
    Nachname  VARCHAR(20)  NOT NULL,
    Strasse   VARCHAR(20)  NOT NULL,
    PLZ       VARCHAR(10)  NOT NULL,
    Ort       VARCHAR(20)  NOT NULL
);
GO
 
/* Eintragen von 5 Beispieldatensätzen */
SET NOCOUNT ON;
GO
 
INSERT INTO dbo.demo_table (KundenNo, Vorname, Nachname, Strasse, PLZ, Ort)
VALUES
('00001', 'Uwe', 'Ricken', 'Musterweg 10', '12345', 'Musterhausen'),
('00002', 'Berthold', 'Meyer', 'Parkstrasse 5', '98765', 'Musterburg'),
('00003', 'Beate', 'Ricken', 'Badstrasse 15', '87654', 'Monopoly'),
('00004', 'Emma', 'Ricken', 'Badstrasse 15', '87654', 'Monopoly'),
('00005', 'Udo', 'Lohmeyer', 'Brühlgasse 57', '01234', 'Irgendwo');
GO

Der Code erstellt eine Beispieltabelle und füllt sie mit 5 Datensätzen. Dynamisches SQL wird anschließend wie folgt angewendet:

DECLARE @stmt  NVARCHAR(4000);
DECLARE @col   NVARCHAR(100);
DECLARE @Value NVARCHAR(100);
 
SET @Col   = N'Nachname';
SET @Value = N'Ricken';
 
SET @stmt = N'SELECT * FROM dbo.demo_table ' +
CASE WHEN @Col IS NOT NULL
     THEN N'WHERE ' + @Col + N' = ' + QUOTENAME(@Value, '''') + N';'
     ELSE N''
END
 
SELECT @stmt;
EXEC sp_executesql @stmt;
 
SET @Col = N'PLZ';
SET @Value = N'87654';
 
SET @stmt = N'SELECT * FROM dbo.demo_table ' +
CASE WHEN @Col IS NOT NULL
     THEN N'WHERE ' + @Col + N' = ' + QUOTENAME(@Value, '''') + N';'
     ELSE N''
END
 
SELECT @stmt;
EXEC sp_executesql @stmt;

Den deklarierten Variablen werden Parameterwerte zugewiesen und anschließend wird aus diesen Parametern ein SQL-Statement generiert. Dieses SQL-Statement wird im Anschluss ausgeführt und das Ergebnis ausgegeben.

Dynamic_Results_01

Statistiken

Basierend auf Statistiken generiert Microsoft SQL Server einen Ausführungsplan für die Durchführung einer Abfrage. Wenn Statistiken nicht akkurat/aktuell sind, kann im Ergebnis die Abfrage unperformant sein, da Microsoft SQL Server zum Beispiel zu wenig Speicher für die Durchführung reserviert hat. Wie unterschiedlich Ausführungspläne sein können, wenn Microsoft SQL Server weiß, wie viele Datensätze zu erwarten sind, zeigt das nächste Beispiel:

CREATE TABLE dbo.Addresses
(
    Id       INT          NOT NULL IDENTITY (1, 1),
    Strasse  CHAR(500)    NOT NULL DEFAULT ('Einfach nur ein Füller'),
    PLZ      CHAR(5)      NOT NULL,
    Ort      VARCHAR(100) NOT NULL
);
GO
 
CREATE UNIQUE CLUSTERED INDEX cix_Addresses_Id ON dbo.Addresses (Id);
GO
 
/* 5000 Adressen aus Frankfurt */
INSERT INTO dbo.Addresses (PLZ, Ort) VALUES ('60313', 'Frankfurt am Main');
GO 5000
 
/* 1000 Adressen aus Darmstadt */
INSERT INTO dbo.Addresses (PLZ, Ort) VALUES ('64283', 'Darmstadt');
GO 1000
 
/* 100 Adressen aus Hamburg */
INSERT INTO dbo.Addresses (PLZ, Ort) VALUES ('20095', 'Hamburg');
GO 100
 
/* 100 Adressen aus Erzhausen */
INSERT INTO dbo.Addresses (PLZ, Ort) VALUES ('64390', 'Erzhausen');
GO 100
 
/* Erstellung eines Index auf ZIP*/
CREATE NONCLUSTERED INDEX ix_Addresses_ZIP ON dbo.Addresses (PLZ);
GO

Der Code erstellt eine Tabelle mit dem Namen [dbo].[Addresses] und füllt sie mit unterschiedlichen Mengen verschiedener Adressen. Während für eine Großstadt wie Frankfurt am Main sehr viele Adressen in der Tabelle vorhanden sind, sind das für ein Dorf nur wenige Datensätze. Sobald alle Datensätze in die Tabelle eingetragen wurden, wird zu Guter Letzt auf dem Attribut [ZIP] ein Index erstellt, um effizient nach der PLZ zu suchen.

/* Beispiel für viele Datensätze */
SELECT * FROM dbo.Addresses WHERE PLZ = '60313';
GO
 
/* Beispiel für wenige Datensätze */
SELECT * FROM dbo.Addresses WHERE PLZ = '64390';
GO

Die beiden Abfragen erzeugen unterschiedliche Abfragepläne, da – je nach Datenmenge – die Suche durch die gesamte Tabelle effizienter sein kann, als jeden Datensatz einzeln zu suchen.

Execution_Plan_01

Die Abbildung zeigt, dass für eine große Datenmenge (5.000 Datensätze) ein Suchmuster über die komplette Tabelle für den Query Optimizer die schnellste Möglichkeit ist, die gewünschten Daten zu liefern. Bei einer – deutlich – kleineren Datenmenge entscheidet sich der Query Optimizer für eine Strategie, die den Index auf [ix_Adresses_ZIP] berücksichtigt aber dafür in Kauf nimmt, dass fehlende Informationen aus der Tabelle entnommen werden müssen (Schlüsselsuche/Key Lookup).
Die entsprechende Abfragestrategie wird unter Zuhilfenahme von Statistiken realisiert. Microsoft SQL Server überprüft die Verteilung der Daten im Index [ix_Addresses_ZIP] und entscheidet sich – basierend auf dem Ergebnis – anschließend für eine geeignete Abfragestrategie.

DBCC SHOW_STATISTICS ('dbo.Addresses', 'ix_Adresses_ZIP') WITH HISTOGRAM;

DBCC_STATISTICS_01

Testumfeld

Im der Testumgebung wird eine Tabelle mit dem Namen [dbo].[Orders] angelegt. Diese Tabelle besitzt 10.000.000 Datensätze, die pro Handelstag die Orders aus einem Internetportal speichert. Dazu werden die Käufe jede Nacht von der Produktionsdatenbank in die Reporting-Datenbank übertragen. Insgesamt sind Bestellungen vom 01.01.2015 bis zum 10.01.2016 in der [dbo].[Orders] gespeichert. Pro Tag kommen 25.000 – 30.000 Bestellungen dazu. Die Tabelle hat folgende Struktur:

CREATE TABLE dbo.Orders
(
    Order_Id      INT     NOT NULL   IDENTITY (1, 1),
    Customer_No   CHAR(5) NOT NULL,
    OrderDate     DATE    NOT NULL,
    ShippingDate  DATE    NULL,
    Cancelled     BIT     NOT NULL   DEFAULT (0)
);
GO
 
CREATE UNIQUE CLUSTERED INDEX cix_Orders_Order_Id ON dbo.Orders(Order_ID);
CREATE NONCLUSTERED INDEX ix_Orders_Customer_No ON dbo.Orders (Customer_No);
CREATE NONCLUSTERED INDEX ix_Orders_OrderDate ON dbo.Orders (OrderDate);
GO

Die – aktuellen – Statistiken für das Bestelldatum (OrderDate) sind bis zum 10.01.2016 gepflegt!

DBCC_STATISTICS_02

Für die Abfrage(n) aus dieser Tabelle wird eine Stored Procedure mit dem folgenden Code programmiert:

CREATE PROC dbo.proc_SearchOrders
    @Search_Shipping    BIT,
    @Search_Date        DATE,
    @Additional_Column  NVARCHAR(64),
    @Additional_Value   VARCHAR(64)
AS
BEGIN
    SET NOCOUNT ON
 
    DECLARE @stmt NVARCHAR(4000) = N'SELECT * FROM dbo.Orders'
    IF @Search_Shipping = 1
        SET @stmt = @stmt + N' WHERE ShippingDate = ''' + CONVERT(CHAR(8), @Search_Date, 112) + N''''
    ELSE
        SET @stmt = @stmt + N' WHERE OrderDate = ''' + CONVERT(CHAR(8), @Search_Date, 112) + N''''
 
    IF @Additional_Column IS NOT NULL
        SET @stmt = @stmt + N' AND ' + @Additional_Column + N' = ''' + @Additional_Value + ''''
 
    EXEC sp_executesql @stmt;
 
    SET NOCOUNT OFF;
END
GO

Der Code verwendet dynamisches SQL, um einen ausführbaren Abfragebefehl zu konkatenieren. Dabei werden nicht nur die zu verwendenden Spalten konkateniert sondern auch die abzufragenden Werte werden dynamisch dem SQL-String hinzugefügt. Somit ergibt sich bei der Ausführung der Prozedur je nach Parameter immer ein unterschiedlicher Abfragebefehl wie die folgenden Beispiele zeigen:

EXEC dbo.proc_SearchOrders
    @Search_Shipping = 0,
    @Search_Date = '20160101',
    @Additional_Column = NULL,
    @Additional_Value = NULL;
GO
 
EXEC dbo.proc_SearchOrders
    @Search_Shipping = 0,
    @Search_Date = '20160101',
    @Additional_Column = 'Customer_No',
    @Additional_Value = '44196';

Dynamic_Results_02

Problem

Abhängig von den Parametern werden unterschiedliche Abfragebefehle konkateniert. Microsoft SQL Server kann – bedingt durch die unterschiedlichen Kombinationen aus abzufragenden Spalten und abzufragenden Werten – keinen einheitlichen Ausführungsplan für die Abfrage erstellen. Sobald ein ausführbarer SQL Code geringster Abweichungen (Kommentare, Leerzeichen, Werte) besitzt, behandelt Microsoft SQL Server den Ausführungstext wie eine NEUE Abfrage und erstellt für die auszuführende Abfrage einen neuen Ausführungsplan.

EXEC dbo.proc_SearchOrders
    @Search_Shipping = 0,
    @Search_Date = '20160105',
    @Additional_Column = NULL,
    @Additional_Value = NULL;
GO

Die Prozedur erzeugt den folgenden Ausführungsplan:

Dynamic_Results_03

Microsoft SQL Server prüft die Daten für den 05.01.2016 im Histogramm und schätzt, dass ca. 26.600 Datensätze zurückgeliefert werden. Diese “Schätzung“ ist sehr nah an den realen Daten und die Abfrage wird mittels INDEX SCAN durchgeführt. Je nach Datum werden immer wieder NEUE Ausführungspläne generiert und im Prozedur Cache abgelegt.
Statistiken werden von Microsoft SQL Server automatisch aktualisiert, wenn mindestens 20% der Daten in einem Index geändert wurden. Sind sehr viele Datensätze in einem Index, dann kann diese Aktualisierung recht lange auf sich warten lassen.
Wenn Microsoft SQL Server mit einem Abfragewert konfrontiert wird, der NICHT in den Statistiken vorhanden ist, dann „schätzt“ Microsoft SQL Server immer, dass sich 1 Datensatz in der Tabelle befindet. Dieses Problem kommt im obigen Beispiel zum tragen. Jeden Tag werden die aktuellsten Orders in die Tabelle eingetragen. In der Tabelle befinden sich 10.000.000 Datensätze. Insgesamt müssten nun 2.000.000 Datenänderungen durchgeführt werden, um die Statistiken automatisch zu aktualisieren.
Die Stored Procedure wird im nächsten Beispiel für den 11.01.2016 aufgerufen. Wie aus der Abbildung erkennbar ist, sind Werte nach dem 10.01.2016 noch nicht in der Statistik vorhanden. Sollten also Werte in der Tabelle sein, dann verarbeitet Microsoft SQL Server die Anfrage wie folgt:

  • Da der Parameter für das OrderDate im Abfragetext konkateniert wird, wird ein NEUER Abfrageplan erstellt
  • Bei der Erstellung des Plans schaut Microsoft SQL Server in die Statistiken zum OrderDate und stellt fest, dass der letzte Eintrag vom 10.01.2016 ist
  • Microsoft SQL Server geht davon aus, dass für den 11.01.2016 lediglich 1 Datensatz in der Datenbank vorhanden ist
  • Der Ausführungsplan wird für 1 Datensatz geplant und gespeichert

Dynamic_Results_04

Die Abbildung zeigt den Ausführungsplan in Microsoft SQL Server, wie er für den 11.01.2016 geplant wurde. Es ist erkennbar, dass die geschätzte Anzahl von Datensätzen DEUTLICH unter dem tatsächlichen Ergebnis liegt. Solche Fehleinschätzungen haben in einem Ausführungsplan Seiteneffekte:

  • Der geplante Speicher für die Ausführung der Abfrage wird niedriger berechnet als er tatsächlich benötigt wird. Da nachträglich kein Speicher mehr allokiert werden kann, werden einige Operatoren die Daten in TEMPDB zwischenspeichern (SORT / HASH Spills)
  • Nested Loops sind ideal für wenige Datensätze. Ein Nested Loop geht für jeden Datensatz aus der “OUTER TABLE“ in die “INNER TABLE“ und fragt dort über das Schlüsselattribut Informationen ab. Im obigen Beispiel hat sich Microsoft SQL Server für einen Nested Loop entschieden, da das geschätzte IO für einen Datensatz deutlich unter einem INDEX SCAN liegt. Tatsächlich müssen aber nicht 1 Datensatz aus dem Clustered Index gesucht werden sondern 2.701 Datensätze!

Konkatenierte SQL Strings verhalten sich wie Ad Hoc Abfragen. Sie führen dazu, dass der Prozedur/Plan Cache übermäßig gefüllt wird. Ebenfalls geht wertvolle Zeit verloren, da für jede neue Konkatentation ein neuer Plan berechnet und gespeichert werden muss!
Die nächste Abfrage ermittelt – aus den obigen Beispielen – die gespeicherten Ausführungspläne.

SELECT DEST.text,
       DECP.usecounts,
       DECP.size_in_bytes,
       DECP.cacheobjtype
FROM   sys.dm_exec_cached_plans AS DECP
       CROSS APPLY sys.dm_exec_sql_text (DECP.plan_handle) AS DEST
WHERE  DEST.text LIKE '%Orders%' AND
       DEST.text NOT LIKE '%dm_exec_sql_text%';

RESULTSET_01

Das Ergebnis zeigt, dass die Prozedur zwei Mal aufgerufen wurde. Dennoch musste für JEDEN konkatenierten Ausführungstext ein eigener Plan erstellt und gespeichert werden.

Lösung

Nicht immer kann man auf dynamisches SQL verzichten. Es wird immer Situationen geben, in denen man mit den Herausforderungen von dynamischen SQL konfrontiert wird. In diesen Situationen ist es wichtig, zu verstehen, welchen Einfluss solche Entscheidungen auf die Performance der Abfragen haben. Im gezeigten Fall sind – unter anderem – Statistiken ein Problem. Es muss also eine Lösung geschaffen werden, die darauf baut, dass Pläne wiederverwendet werden können – Parameter! Es muss eine Lösung gefunden werden, bei der zwei wichtige Voraussetzungen erfüllt werden:

  • Der auszuführende Befehl darf sich nicht mehr verändern
  • Ein einmal generierter Plan muss wiederverwendbar sein

Beide Voraussetzungen kann man mit leichten Modifikationen innerhalb der Prozedur schnell und einfach erfüllen.

ALTER PROC dbo.proc_SearchOrders
    @Search_Shipping    BIT,
    @Search_Date        DATE,
    @Additional_Column  NVARCHAR(64),
    @Additional_Value   VARCHAR(64)
AS
BEGIN
    SET NOCOUNT ON
 
    DECLARE @stmt NVARCHAR(4000) = N'SELECT * FROM dbo.Orders';
    DECLARE @vars NVARCHAR(1000) = N'@Search_Date DATE, @Additional_Value VARCHAR(64)';
 
    IF @Search_Shipping = 1
        SET @stmt = @stmt + N' WHERE ShippingDate = @Search_Date';
    ELSE
        SET @stmt = @stmt + N' WHERE OrderDate = @Search_Date';
 
    IF @Additional_Column IS NOT NULL
        SET @stmt = @stmt + N' AND ' + QUOTENAME(@Additional_Column) + N' = @Additional_Value';
 
    SET @stmt = @stmt + N';'
    SELECT    @stmt;
    EXEC sp_executesql @stmt, @vars, @Search_Date, @Additional_Value;
 
    SET NOCOUNT OFF;
END
GO

Nachdem der Prozedur Cache gelöscht wurde, wird die Prozedur erneut in verschiedenen Varianten ausgeführt und die Abfragepläne werden analysiert:

EXEC dbo.proc_SearchOrders
    @Search_Shipping = 0,
    @Search_Date = '20160105',
    @Additional_Column = NULL,
    @Additional_Value = NULL;
GO

Dynamic_Results_05

EXEC dbo.proc_SearchOrders
    @Search_Shipping = 0,
    @Search_Date = '20160111',
    @Additional_Column = NULL,
    @Additional_Value = NULL;
GO

Dynamic_Results_06

Obwohl nun ein Datum verwendet wird, dass nachweislich noch nicht in den Statistiken erfasst ist, wird dennoch ein identischer Plan verwendet. Ursächlich für dieses Verhalten ist, dass Microsoft SQL Server für beide Ausführungen auf ein identisches Statement verweisen kann – somit kann ein bereits im ersten Durchlauf verwendeter Ausführungsplan angewendet werden. Dieses “Phänomen“ wird Parameter Sniffing genannt. Auch dieses Verfahren hat seine Vor- und Nachteile, die ich im nächsten Artikel beschreiben werde.

EXEC dbo.proc_SearchOrders
    @Search_Shipping = 0,
    @Search_Date = '20160105',
    @Additional_Column = 'Customer_No',
    @Additional_Value = '94485';
GO

Dynamic_Results_07

EXEC dbo.proc_SearchOrders
    @Search_Shipping = 0,
    @Search_Date = '20160105',
    @Additional_Column = 'Cancelled',
    @Additional_Value = '1';
GO

Dynamic_Results_08

Die nächsten zwei Beispiele zeigen die Ausführungspläne mit jeweils unterschiedlichen – zusätzlichen – Kriterien. Es ist erkennbar, dass Microsoft SQL Server nun für beide Ausführungen jeweils unterschiedliche Ausführungspläne verwendet. Unabhängig von dieser Tatsache werden nun aber nicht mehr für jeden unterschiedlichen Kunden EINZELNE Pläne gespeichert sondern der bei der ersten Ausführung gespeicherte Ausführungsplan wiederverwendet. Die nachfolgende Abfrage zeigt im Ergebnis die gespeicherten Ausführungspläne, die für 10 weitere – unterschiedliche – Kundennummern verwendet wurden:

SELECT DEST.text,
       DECP.usecounts,
       DECP.size_in_bytes,
       DECP.cacheobjtype
FROM   sys.dm_exec_cached_plans AS DECP
       CROSS APPLY sys.dm_exec_sql_text (DECP.plan_handle) AS DEST
WHERE  DEST.text LIKE '%Orders%' AND
       DEST.text NOT LIKE '%dm_exec_sql_text%';
GO

RESULTSET_02

Statt – wie bisher – für jede Ausführung mit unterschiedlichen Kundennummern einen eigenen Plan zu speichern, kann der einmal generierte Plan verwendet werden.

Zusammenfassung

Dynamisches SQL wird recht häufig verwendet, um mit möglichst einer – zentralen – Prozedur mehrere Möglichkeiten abzudecken. So legitim dieser Ansatz ist, so gefährlich ist er aber, wenn man dynamisches SQL und Konkatenation wie “gewöhnlichen“ Code in einer Hochsprache verwendet. Microsoft SQL Server muss dann für JEDE Abfrage einen Ausführungsplan generieren. Dieser Ausführungsplan beruht auf Statistiken, die für einen idealen Plan benötigt werden. Sind die Statistiken veraltet, werden unter Umständen schlechte Pläne generiert. Sind die Daten regelmäßig verteilt, bietet es sich an, mit Parametern statt konkatenierten SQL Statements zu arbeiten. Durch die Verwendung von Parametern wird einerseits der Plan Cache entlastet und andererseits muss Microsoft SQL Server bei wiederholter Ausführung mit anderen Werten nicht erneut einen Ausführungsplan erstellen und eine Prüfung der Statistiken entfällt.
Wo Licht ist, ist natürlich auch Schatten! Die oben beschriebene Methode bietet sich nur dann an, wenn die Daten regelmäßig verteilt sind. Wenn die abzufragenden Daten in der Anzahl ihrer Schlüsselattribute zu stark variieren, ist auch diese Lösung mangelhaft! Für das Projekt konnten wir mit dieser Methode sicherstellen, dass NEUE Daten geladen werden konnten und Statistiken nicht notwendiger Weise aktualisiert sein mussten. Die Verteilung der Daten ist für jeden Tag nahezu identisch!
Herzlichen Dank fürs Lesen!

Constantin Klein: Kumulative Updates für SQL Server 2012 SP2 und SQL Server 2012 SP3 veröffentlicht

Mit guten Vorsätzen ins neue Jahr. Nachdem es hier lange Zeit sehr ruhig war, möchte ich Euch in diesem Jahr wieder häufiger mit neuen Artikeln beglücken. Los geht es mit neuen kumulativen Updates für SQL Server 2012. Microsoft hat zwei neue kumulative Updates für SQL Server veröffentlicht: Update KB Artikel Build Nr. Anzahl Fixes SQL […]

Uwe Ricken: Änderung der Sortierung und Einfluss auf das Transaktionsprotokoll

Ein von mir sehr geschätzter Kollege – der SQL Paparazzi der PASS Deutschland – Dirk Hondong (t | w) – hat mich während meines Vortrags bei der PASS Usergroup in Köln gefragt, inwieweit man belegen kann, ob die Änderung der Sortierung einer Spalte eine reine Metadaten-Operation ist oder ob eine solche Änderung auch die Änderung von Daten nach sich zieht. Die Frage fand ich so interessant, dass ich mich gleich an die Untersuchung gemacht hatte, um selbst festzustellen, welche Auswirkungen die Änderung der Sortierung auf die entstehenden Transaktionen haben.

Warum eine Datenbank oder ein Objekt eine Sortierung braucht.

Sobald mit einem Datenbanksystem gearbeitet wird, werden Tabellen angelegt, Daten gespeichert und mit Hilfe von Indexen organisiert. Für die Reihenfolge der Daten in einem Index gibt es zwei grobe Richtungen. Handelt es sich um numerische Werte, ist die Sortierung einer Datenbank oder einer Spalte irrelevant. Sobald jedoch ein Index auf ein nicht numerisches Feld angewendet wird, muss Microsoft SQL Server für die richtige Sortierung der Werte im Index die Datenbank- oder Spaltensortierung berücksichtigen. Das nachfolgende Beispiel zeigt eine Tabelle mit zwei Textspalten. Beide Textspalten haben unterschiedliche Sortierungen und werden mit einem dedizierten Index pro Spalte versehen.

/* Create the demo table with different collations */
CREATE TABLE dbo.demo_table
(
    Id    INT      NOT NULL,
    c1    CHAR(1)  COLLATE Latin1_General_CI_AS    NOT NULL,
    c2    CHAR(1)  COLLATE Latin1_General_BIN      NOT NULL
);
 
/* Create an index on each different column */
CREATE INDEX ix_demo_table_c1 ON dbo.demo_table (c1);
CREATE INDEX ix_demo_table_c2 ON dbo.demo_table (c2);
GO
 
/* fill the table with A-Z and a-z */
DECLARE @i INT = 65;
WHILE @i <= 90
BEGIN
    INSERT INTO dbo.demo_table (Id, C1, C2)
    SELECT @i, CHAR(@i), CHAR(@i)
    UNION ALL
    SELECT @i + 32, CHAR(@i + 32), CHAR(@i + 32)
 
    SET @i += 1;
END
GO
 
/* Select the different columns by usage of it's index */
SELECT c1 FROM dbo.demo_table;
SELECT c2 FROM dbo.demo_table;
GO

Für die beiden Abfragen werden die auf den Spalten befindlichen Indexe verwendet und man kann im Ergebnis deutlich erkennen, dass beide Spalten nach unterschiedlichen Mustern sortiert werden.

Rowsets_01

Die nebenstehende Abbildung zeigt auf der linken Seite die Spalte [c1]. Diese Spalte verwendet eine Sortierung, die Groß- und Kleinschreibung nicht unterscheidet (“_CI_” = Case Insensitive) während die Spalte [c2] eine binäre Sortierung anwendet. Bei der binären Sortierung werden die Werte in der Spalte nach ihrem Binärwert sortiert. Da die Kleinbuchstaben einen höheren Binärwert haben (Großbuchstaben beginnen bei 0x41 und Kleinbuchstaben beginnen bei 0x5B) werden sie erst NACH den Großbuchstaben einsortiert.

Die einstellte Sortierung für eine Spalte, die alphanumerische Werte enthält ist beim Einsatz eines Indexes (egal ob Clustered Index oder Nonclustered Index) ein ausschlaggebendes Moment für die Einordnung der Werte, die in diese Spalte gespeichert werden sollen.

Ändern einer Sortierung

Man kann jederzeit für einzelne Attribute, eine Datenbank oder für den Server die Sortierung ändern. Während die Änderung für Datenbanken und Tabellen nachträglich mit ertragbarem Aufwand verbunden ist, ist die Änderung der Sortierung für den Server mit deutlich mehr Aufwand verbunden. Weitere Informationen zum Ändern der Sortierungen finden sich hier:

Sobald eine Datenbank Daten enthält und es sollen nachträglich Änderungen an der Sortierung vorgenommen werden, dann ist es nur recht, dass man sich Gedanken darüber macht, wie hoch wohl das Transaktionsvolumen dieser Transaktion ist. Sofern es sich nur um Änderungen am Schema handelt (Schemaänderungen), wird das Transaktionsvolumen in einem verträglichen Rahmen bleiben; sollten jedoch die gespeicherten Daten betroffen sein, muss man sich eine entsprechende Strategie zurechtlegen, um die Änderungen sorgfältig zu planen.

Beispielszenario

Um zu prüfen, welche Ressourcen bei der Änderung der Sortierung an der Spalte einer Tabelle beteiligt sind, wird zunächst eine Beispieltabelle mit 1.000 Datensätzen erstellt. Diese Tabelle besitzt – im ersten Beispiel – keine Indexe; es handelt sich also um einen HEAP.

/* Create a HEAP with a few demo data and default collation */
CREATE TABLE dbo.demo_table
(
    Id    INT        NOT NULL    IDENTITY(1, 1),
    C1    CHAR(3)    NOT NULL    DEFAULT ('DE'),
    C2    CHAR(5)    NOT NULL    DEFAULT ('12345')
);
GO
 
/* what is the collation of the string attributes? */
SELECT  C.name            AS column_name,
        S.name            AS type_name,
        C.max_length      AS data_length,
        C.collation_name  AS collation_name
FROM    sys.tables AS T INNER JOIN sys.columns AS C
        ON (T.object_id = C.object_Id) INNER JOIN sys.types AS S
        ON  (
               C.user_type_id = S.user_type_id AND
               C.system_type_id = S.system_type_id
            )
WHERE   T.name = 'demo_table'
ORDER BY
        C.column_id;
GO

Zunächst wird die Tabelle mit der Sortierung der Datenbank angelegt. Die Abfrage zeigt, welche Sortierung für die einzelnen Spalten verwendet werden (in meinem Beispiel ist es Latin1_General_CI_AS).

Rowsets_02

Anschließend wird diese Tabelle mit 1.000 Datensätzen gefüllt und die Test können beginnen.

Änderung der Sortierung in HEAP

Die Tabelle besitzt keine Indexe – sie ist ein HEAP. Um für eine Spalte eine Eigenschaft zu ändern, muss mit Hilfe von ALTER TABLE … ALTER COLUMN die Eigenschaft angepasst werden. Das nachfolgende Beispiel verwendet eine explizite Transaktion für diese Anpassungen. Diese explizite Transaktion muss verwendet werden, um nach der Aktion festzustellen, welche Ressourcen durch die Aktion gesperrt/verwendet werden. Gleichfalls kann mit Hilfe einer benannten Transaktion der entsprechende Eintrag im Transaktionsprotokoll gefunden werden (siehe Code).

/* to monitor the behavior of the transaction we wrap it in a named transaction */
BEGIN TRANSACTION ChangeCollation;
GO
    ALTER TABLE demo_table ALTER COLUMN C1 CHAR(3) COLLATE Latin1_General_BIN NOT NULL;
    GO
 
-- what resources are blocked by the transaction?
SELECT  DTL.resource_type,
        DTL.resource_description,
        DTL.request_mode,
        DTL.request_type,
        DTL.request_status,
        CASE WHEN DTL.resource_type = N'OBJECT'
             THEN OBJECT_NAME(DTL.resource_associated_entity_id)
             ELSE NULL
        END        AS resource_Object_Name
FROM    sys.dm_tran_locks AS DTL
WHERE   DTL.request_session_id = @@SPID AND
        DTL.resource_type != N'DATABASE';

-- what has happend in the transaction log?
SELECT  Operation,
        Context,
        AllocUnitName,
        [Page ID],
        [Slot ID]
FROM    sys.fn_dblog(NULL, NULL)
WHERE   [TRANSACTION ID] IN
        (
            SELECT [Transaction ID]
            FROM sys.fn_dblog(NULL, NULL)
            WHERE [Transaction Name] = N'ChangeCollation'
) AND
Context != N'LCX_NULL'
ORDER BY
        [Current LSN],
    [Transaction ID];
 
COMMIT TRANSACTION ChangeCollation;
GO

Zunächst wird die Sortierung der Spalte [C1] umgestellt. Um festzustellen, welche Ressourcen dabei von Microsoft SQL Server verwendet werden, hilft die Funktion [sys].[dm_tran_locks]. Sie zeigt, welche Ressourcen aktuell von offenen Transaktionen verwendet werden.

Rowsets_03

Die obige Abbildung zeigt, welche Objekte durch die Transaktion gesperrt sind. Die Beispieltabelle [dbo].[demo_table] wird mit einer SCH-M-Sperre versehen. Hierbei handelt es sich um eine Sperre, die gesetzt werden muss, um Änderungen an den Objekten (Schemata) vornehmen zu können. Ebenfalls ist zu erkennen, dass X-Sperren (Exklusivsperren) auf Datensätzen (KEY) liegen. Da es sich nicht um die Benutzertabelle handelt (die ist mit einer SCH-M-Sperre versehen), kann es sich nur um die drei Systemtabellen handeln, die mit einer IX-Sperre versehen wurden.

Ein Blick in das aktive Transaktionsprotokoll bestätigt diesen Verdacht. Tatsächlich befindet sich im Transaktionsprotokoll lediglich EIN Transaktionseintrag, der im Zusammenhang mit der Änderung der Sortierung steht!

Rowsets_04

Änderung der Sortierung in einem Clustered Index

Wie sieht es mit der Änderung der Sortierung aus, wenn die Tabelle ein Clustered Index ist und der Schlüssel selbst eine Textspalte ist? Das nachfolgende Skript erstellt eine Tabelle mit einem Clustered Index auf der Spalte [Id]. In diese Tabelle werden ein paar Datensätze eingetragen um anschließend die Sortierung anzupassen.

CREATE TABLE dbo.demo_table
(
    Id    CHAR(4) COLLATE Latin1_General_CS_AI NOT NULL PRIMARY KEY CLUSTERED,
    C1    CHAR(300)    NOT NULL,
    C2    CHAR(500)    NOT NULL
);
GO
 
/* Fill the table with a few values */
DECLARE @i INT = 65;
WHILE @i <= 90
BEGIN
    INSERT INTO dbo.demo_table (Id, C1, C2)
    SELECT CHAR(@i), 'Das ist ein Test', 'Ja, das ist ein Test'
    UNION ALL
    SELECT CHAR(@i + 32), 'Das ist ein Test', 'Ja, das ist ein Test';
 
    SET @i += 1;
END
GO

Versucht man, nachträglich die Sortierung der Spalte [Id] zu ändern, erhält man einen “klassischen” Fehler, der eindeutig darauf hinweist, dass Sortierungen auf indexierte Spalten nicht anwendbar sind.

ALTER_COLUMN_FAILURE_5074

Diese Fehlermeldung macht im Zusammenhang mit der Effizienz einer DDL-Operation Sinn. Würde Microsoft SQL Server erlauben, dass Sortierungen in Spalten geändert werden, die von einem Index berücksichtigt werden, dann müsste Microsoft SQL Server die Schemasperre auf dem Tabellenobjekt so lange aufrecht erhalten, bis die geänderte Sortierung in jedem betroffenen Index berücksichtigt wurde. Das bedeutet für die Indexe jedoch eine vollständige Neusortierung, da sich – bedingt durch Groß-/Kleinschreibung, Akzente, etc – die Sortierung der Einträge ändert.

Damit die Schemasperre so schnell wie möglich wieder aufgehoben werden kann, sind solche lang laufenden Transaktionen in Microsoft SQL Server nicht erlaubt! Andere Prozesse können auf die Tabelle nicht zugreifen und die Applikationen müssten warten, bis der Sortiervorgang und Neuaufbau der Indexe abgeschlossen ist.

Zusammenfassung

Die Änderung der Sortierung ist ein DDL-Befehl und setzt voraus, dass die betroffenen Spalten einer Tabelle nicht von Indexen verwendet werden. Die eigentliche Operation der Änderung der Sortierung geht mit minimalem Aufwand, da ausschließlich Metadaten geändert werden.

Herzlichen Dank fürs Lesen!

Uwe Ricken: Don’t trust sys.dm_db_database_page_allocations

Seit Microsoft SQL Server 2012 gibt es eine neue Möglichkeit, die allokierten Datenseiten eines Objekts mit Hilfe der Systemfunktion [sys].[dm_db_database_page_allocations] zu ermitteln. Über die Verwendung habe ich bereits im Artikel “Neue DMF für Aufteilung von Datenseiten” geschrieben. Diese Systemfunktion ist keine offiziell dokumentierte Funktion. Ich benutze diese Funktion sehr gern, da sie – anders als DBCC IND die Daten als Tabelle zurück liefert, dessen Ergebnis durch Prädikate eingegrenzt werden können. Eher durch Zufall ist aufgefallen, dass diese Funktion nicht immer zuverlässig arbeitet.

Verwendung von sys.dm_db_database_page_allocations

sys.dm_db_database_page_allocation wird verwendet, um sich einen Überblick über die durch ein Objekt belegten Datenseiten zu verschaffen. Hierbei handelt es sich um eine Funktion; die grundsätzliche Filterung findet bereits durch die übergebenen Parameter statt. Der grundsätzliche Aufruf der Funktion sieht wie folgt aus:

SELECT *
FROM sys.dm_db_database_page_allocations
     (
        @DatabaseId   SMALLINT,
        @TableId      INT          = NULL,
        @IndexId      INT          = NULL,
        @PartitionId  BIGINT       = NULL,
        @Mode         NVARCHAR(64) = 'LIMITED'
     );

Das Ergebnis dieser Funktion ist eine Tabelle mit allen durch ein Objekt belegten Datenseiten; oder sollte es sein. Der “Fehler” ist mir in einer Demo-Datenbank aufgefallen, die ich als Grundlage eines zu produzierenden Video-Workshops verwende. Diese Datenbank – mit den Fehlern – kann hier heruntergeladen werden: http://1drv.ms/1ZNxEXH. Die betroffene Tabelle ist [dbo].[Customers]. Diese Tabelle – wie alle anderen auch – ist ein HEAP und besitzt 75.000 Datensätze.

Demonstration

Mit den nachfolgenden Skripten wird zunächst ermittelt, wie viele Datenseiten durch die Tabelle [dbo].[Customers] belegt sind. Die einfachste Art der Feststellung ist das gemessene IO für einen TABLE SCAN.

SET STATISTICS IO ON

USE CustomerOrders;
GO
 
SET STATISTICS IO ON;
GO
 
SELECT * FROM dbo.Customers AS C;
GO
 
SET STATISTICS IO OFF;
GO

STATISTICS_IO_01

Ein direkter Vergleich mit den allokierten Datenseiten bestätigt, dass diese Tabelle 682 Datenseiten belegt.

sys.system_internals_allocation_units

Die Systemsicht sys.system_internals_allocation_units ist nur für die interne Verwendung durch Microsoft SQL Server reserviert. Jede Partition einer Tabelle, eines Indexes oder einer indizierten Sicht hat eine Zeile in sys.system_internals_allocation_units, die eindeutig durch eine Container-ID (container_id) identifiziert ist. Die Container-ID besitzt eine 1:1-Zuordnung zur [partition_id] in der Katalogsicht [sys].[partitions], mit der die Beziehung zwischen den in einer Partition gespeicherten Daten der Tabelle, des Indexes oder der indizierten Sicht und den Zuordnungseinheiten bestimmt wird, die zum Verwalten der Daten in der Partition verwendet werden.

SELECT IAU.total_pages,
       IAU.used_pages,
       IAU.data_pages
FROM   sys.partitions AS P INNER JOIN sys.system_internals_allocation_units AS IAU
       ON (P.partition_id = IAU.container_id)
WHERE  P.object_id = OBJECT_ID(N'dbo.Customers', N'U');

USED_DATA_PAGES_01

Insgesamt belegt die Tabelle 689 Datenseiten; davon sind 688 REINE Datenseiten und eine IAM-Datenseite belegt. Dass Datenseiten belegt sind, obwohl sie nicht verwendet werden, liegt an dem Umstand, dass Microsoft SQL Server automatisch vollständige Extents belegt, wenn eine Tabelle mehr als 8 Datenseiten belegt! Von den 688 Datenseiten sind 682 Datenseiten mit Daten belegt. Somit stimmt die Ausgabe des SELECT-Befehls. Insgesamt müssen 682 Datenseiten ausgegeben werden.

sys.dm_db_database_page_allocations

Eine Abfrage auf die Systemfunktion sys.dm_db_database_page_allocations zeigt jedoch ein anderes Ergebnis:

SELECT DDDPA.allocation_unit_type_desc,
       DDDPA.allocated_page_page_id,
       DDDPA.page_free_space_percent 
FROM   sys.dm_db_database_page_allocations
       (
          DB_ID(),
          OBJECT_ID(N'dbo.Customers', N'U'),
          NULL,
          NULL,
          N'DETAILED'
       ) AS DDDPA 
WHERE  DDDPA.is_allocated = 1 AND 
       DDDPA.page_type = 1 
ORDER BY 
       DDDPA.page_type DESC, 
       DDDPA.allocated_page_page_id ASC; 
GO

USED_DATA_PAGES_02

Wie man an der obigen Abbildung deutlich erkennen kann, werden NICHT die erwarteten 682 Datenseiten angezeigt sondern es fehlt offensichtlich eine Datenseite. Wird jedoch die Zuordnung der Datenseiten mit DBCC IND überprüft, stimmt die Zuordnung wieder:

DBCC IND(CustomerOrders, 'dbo.Customers', 0);

USED_DATA_PAGES_03

Die Differenz von +1 hängt damit zusammen, dass DBCC IND nicht nur die reinen Datenseiten ausgibt sondern zusätzlich die IAM-Datenseiten im Resultat auswirft. Zieht man die IAM-Datenseite vom Ergebnis ab, so verbleiben 682 Datenseiten für die Ausgabe der Datensätze von [dbo].{Customers]. Bei genauerer Betrachtung war im Anschluss erkennbar, dass die allokierte Datenseite 40447 nicht von sys.dm_db_database_page_allocation berücksichtigt wurde.

USED_DATA_PAGES_DIFFERENCE

Zusammenfassung

Die seit Microsoft SQL Server 2012 zur Verfügung gestellte Funktion ist eine große Hilfe für DBA, wenn es darum geht, gezielt eine Liste der allokierten Datenseiten mit Hilfe von Filtern und Sortierungen ausgeben zu lassen. Ist man auf die exakte Anzal der allokierten Datenseiten angewiesen, sollte besser weiterhin mit DBCC IND die Ausgabe gesteuert werden. Im konkreten Fall half der Neuaufbau der Tabelle mit Hilfe eines REBUILDs.

Herzlichen Dank fürs Lesen!

Uwe Ricken: Wann Löschvorgänge in HEAPS den allokierten Speicher nicht freigeben

Eine Anfrage im MSDN-Forum von Microsoft mit dem Titel “Issue in shrinking data file” ist der Grund für diesen Artikel. In der Anfrage ging es darum, dass der Fragesteller aus einer sehr großen Datenbank Unmengen von Datensätzen aus diversen Tabellen gelöscht hatte. Anschließend wollte er die Datenbankdatei verkleinern um so mehr Platz auf dem Storage zu schaffen. Jedoch ergaben Überprüfungen des konsumierten / allokierten Speichers, dass trotz des Löschens mehrerer Millionen Datensätze der Speicher nicht als “frei” gekennzeichnet wurde. Beim genaueren Lesen der Fragestellung kam einem Satz besondere Aufmerksamkeit zu Teil: “Also, I noticed that there is three huge tables in the db and these are non-clustered index.”. Damit war eigentlich schon klar, was das Problem des Fragestellers war. Dieser Artikel beschreibt die technischen Hintergründe, warum ein DELETE-Befehl nicht automatisch den allokierten Speicher freigibt.

Was ist ein HEAP?

Als HEAP wird eine Tabelle bezeichnet, die nicht nach Ordnungskriterien sortiert wird. Das bedeutet, dass ein HEAP die Datensätze immer da abspeichert, wo ausreichend Platz in einer Datenseite ist. Ein HEAP genießt den großen Vorteil, dass er – anders als ein Clustered Index oder Nonclustered Index – keine B-Tree-Struktur zur Verwaltung benötigt. Ein HEAP wird ausschließlich durch Datenseiten (Leafs) repräsentiert, die durch eine oder mehrere IAM-Datenseiten (Index Allocation Map) verwaltet werden.

SQLGuru_01

Die obige Abbildung zeigt die Organisationsstruktur eines HEAPS. Die Datenseiten (110 – 152) haben keinen direkten Bezug zueinander und die übergeordnete IAM-Datenseite verwaltet die der Tabelle zugehörigen Datenseiten. Eine IAM-Datenseite kann immer nur EIN Datenbankobjekt (Tabelle, Indexed View) verwalten!

Testumgebung

Um die Fragestellung / Problemstellung des Autors der obigen Anfrage zu reproduzieren, wird in einer Testdatenbank eine Tabelle [dbo].[demo_table] angelegt. Diese Tabelle kann pro Datenseite maximal einen Datensatz speichern, da die Datensatzlänge 8.004 Bytes beträgt. Anschließend werden 10.000 Datensätze in die zuvor angelegte Tabelle eingetragen um die zugewiesene Speicherzuordnung auszuwerten.

-- Create the demo table
CREATE TABLE dbo.demo_table
(
    Id    INT        NOT NULL    IDENTITY (1, 1),
    C1    CHAR(8000) NOT NULL    DEFAULT ('only a filler')
);
GO

-- and insert 10.000 records into this table
SET NOCOUNT ON;
GO

INSERT INTO dbo.demo_table DEFAULT VALUES;
GO 10000

-- show the number of allocated data pages after the insert
SELECT  DDPS.index_id,
        DDPS.in_row_data_page_count,
        DDPS.in_row_used_page_count,
        DDPS.in_row_reserved_page_count,
        DDPS.row_count
FROM    sys.dm_db_partition_stats AS DDPS
WHERE   DDPS.object_id = OBJECT_ID(N'dbo.demo_table', N'U');
GO

SQLGuru_02

Wie die Abbildung zeigt, wurden 10.000 Datensätze ([row_count]) in die Tabelle eingetragen. Diese 10.000 Datensätze belegen insgesamt 10.000 Datenseiten ([in_row_data_page_count]).

Löschen von Datensätzen

Nachdem die Datensätze eingetragen wurden, werden im nächsten Schritt 1.000 Datensätze aus der Tabelle gelöscht und erneut der belegte Speicher überprüft. Zum Löschen von Datensätzen wird der DELETE-Befehl im “klassischen” Stil ohne weitere Hints verwendet

-- Delete the last 1,000 records...
DELETE dbo.demo_table WHERE Id >= 9001;
GO
 
-- and check the allocated space again!
SELECT  DDPS.index_id,
        DDPS.in_row_data_page_count,
        DDPS.in_row_used_page_count,
        DDPS.in_row_reserved_page_count,
        DDPS.row_count
FROM    sys.dm_db_partition_stats AS DDPS
WHERE   DDPS.object_id = OBJECT_ID(N'dbo.demo_table', N'U');
GO

Das Ergebnis ist “überraschend”; obwohl 1.000 Datensätze gelöscht wurden, ist der allokierte Speicher nicht freigegeben worden.
(c) by db Berater GmbH

SELECT in HEAP

Die Ursache für dieses Verhalten liegt in der Art und Weise, wie Microsoft SQL Server beim Lesen von Daten aus einem Heap vorgeht. Da ein HEAP kein Ordnungskriterium besitzt, wird auch mit eingesetztem Prädikat immer ein Table Scan ausgeführt; es muss also immer die komplette Tabelle gelesen werden.

SELECT * FROM dbo.demo_table WHERE Id = 10 OPTION (QUERYTRACEON 9130);

(c) by db Berater GmbH

Der Lesevorgang in einem HEAP liest zunächst die IAM-Datenseite des betroffenen Objekts. Die IAM-Datenseite muss gelesen werden, da ansonsten Microsoft SQL Server nicht weiß, welche Datenseiten zum Objekt gehören. In einem Clustered Index / Nonclustered Index ist das nicht notwendig, da die Datenseiten Verknüpfungen zu den nachfolgenden / vorherigen Datenseiten besitzen! Hat Microsoft SQL Server die IAM-Datenseite gelesen, kann mit dem Einlesen der allgemeinen Datenseiten begonnen werden. Genau hier liegt aber der “Fehler des Designs”; da der DELETE-Vorgang nicht mit einer Tabellensperre einhergeht, muss Microsoft SQL Server alle Datenseiten auch weiterhin bereitstellen, da ansonsten ein zweiter Vorgang, der einen SELECT auf die Tabelle durchführt, die IAM-Datenseite bereits gelesen haben könnte und somit die zu lesenden Datenseiten bereits kennt. Würde Microsoft SQL Server nun bei einem DELETE-Vorgang diese Datenseiten aus der Zuordnung entfernen, würde der zweite – Lese – Vorgang eine Datenseite anfordern, die nicht mehr existiert.

Dieses „Problem“ ist auch offiziell bei Microsoft bekannt und kann hier nachgelesen werden: https://support.microsoft.com/en-us/kb/913399. Entgegen der Auffassung von Microsoft, dass es sich um einen „bekannten Bug“ handelt, stellt sich dieses Verhalten eher als „Feature“ dar!

Lösung

Um das Problem der Freigabe von allokiertem Datenspeicher zu lösen, gibt es zwei Alternativen:

Neuaufbau der Tabelle

Die erste Möglichkeit besteht darin, die Tabelle selbst mittels REBUILD neu aufzubauen. Hierzu benötigt Microsoft SQL Server – kurzfristig – eine exklusive Sperre auf die Tabelle, um die “alte” Tabelle durch die neu aufgebaute Tabelle zu ersetzen. Zuvor werden die Datenbestände in die “neue” Tabelle transferiert und somit eine neue Struktur geschaffen.

-- Rebuild the table
ALTER TABLE dbo.demo_table REBUILD;
GO

-- and check the allocated space again!
SELECT  DDPS.index_id,
        DDPS.in_row_data_page_count,
        DDPS.in_row_used_page_count,
        DDPS.in_row_reserved_page_count,
        DDPS.row_count
FROM    sys.dm_db_partition_stats AS DDPS
WHERE   DDPS.object_id = OBJECT_ID(N'dbo.demo_table', N'U');
GO

SQLGuru_04

Nach dem REBUILD sind die “leeren” Datenseiten gelöscht worden und nur noch Datenseiten mit Datensätzen sind vorhanden.

Löschen von Datensätzen mit TABLOCK-Hinweis

Eine andere – elegantere – Möglichkeit besteht darin, den Löschvorgang mit einer Tabellensperre zu verbinden. Da ein möglicher SELECT-Vorgang die IAM-Datenseite lesen muss, kann durch das Sperren der Tabelle dieser Zugriff ausgeschlossen werden. Ein möglicher SELECT-Befehl kann keine IS-Sperre (Intent Shared)  auf das Tabellenobjekt legen, da während des Löschvorgangs eine X-Sperre (Exklusiv) auf dem Tabellenobjekt liegt. Somit wird der SELECT-Befehl solange gesperrt, bis der Löschvorgang abgeschlossen ist. Da in dieser Situation sichergestellt ist, dass niemand lesend auf die Tabelle zugreift, kann Microsoft SQL Server gefahrlos die leeren Datenseiten entfernen!

-- Delete 2,000 records with a TABLOCK hint
DELETE dbo.demo_table WITH (TABLOCK) WHERE Id >= 7001;
GO
 
-- and check the allocated space again!
SELECT  DDPS.index_id,
        DDPS.in_row_data_page_count,
        DDPS.in_row_used_page_count,
        DDPS.in_row_reserved_page_count,
        DDPS.row_count
FROM    sys.dm_db_partition_stats AS DDPS
WHERE   DDPS.object_id = OBJECT_ID(N'dbo.demo_table', N'U');
GO

SQLGuru_05

Zusammenfassung

HEAPS haben eine andere interne Struktur, die viele Vor- aber auch Nachteile besitzt. Viele Aktionen, die als “selbstverständlich” gelten, bergen Tücken. Wenn man aber die Konzepte hinter den Objekten versteht, tappt man nicht in diese Fallen.

Herzlichen Dank fürs Lesen und allen Lesern ein frohes neues Jahr!

Robert Panther: Ankündigung: SQL Server Konferenz 2016 in Darmstadt

Ich freue mich, im kommenden Jahr auf der deutschen SQL Server Konferenz, die vom 23.-25. Februar 2016 in Darmstadt stattfindet, als Sprecher dabei zu sein.

Die Konferenz selbst beginnt mit einem Workshoptag, dem zwei Tage mit parallel stattfindenden Tracks zu verschiedenen Themen aus den Bereichen Administration, Entwicklung, Business Intelligence, Azure Data Platform und Information Management folgen. Als Referenten sind ca. 50 Speaker aus dem In- und Ausland im Einsatz. Workshoptag und Hauptkonferenz sind auch separat buchbar.

Bei meinem eigenen Vortrag wird es um das Thema Datenqualität gehen. Dabei werden verschiedene Ansätze aufgezeigt, wie man mit den Mitteln, die SQL Server in den verschiedenen Versionen (bis hin zu SQL Server 2016) zur Verfügung stellt, eine möglichst gute Datenqualität erreicht. Dabei wird stets die Praxistauglichkeit im Vordergrund stehen. Es geht also weniger darum, was alles theoretisch machbar ist, sondern eher, wie man mit vertretbarem Aufwand die bestmögliche Datenqualität erzielt.

Weitere Informationen zur Konferenz gibt es auf der offiziellen Veranstaltungswebsite: http://sqlkonferenz.de

PASS2016_300x100

 


Robert Panther: Index-Vortrag bei den Frankfurter IT-Tagen 2015

Am 14.12.2015 werde ich bei den IT-Tagen in Frankfurt mit einem Vortrag zum Thema SQL Server Indizes vertreten sein. Dabei werde ich einen Überblick über die verschiedenen Indextypen geben, die SQL Server zur Verfügung stellt und werde auch Kriterien aufzeigen, anhand derer man entscheiden kann, für welchen Einsatzweck welche Indexform am besten geeignet ist.

Details zum Vortrag: http://www.informatik-aktuell.de/seminare/it-tage-datenbanken-2015/sql-server-indizes-verschiedene-varianten-im-ueberblick.html

Die IT-Tage mit Schwerpunkt Datenbanken in Frankfurt finden vom 14.-18.12.2015 im Maritim Hotel an der Frankfurter Messe statt. Nähere Infos zur Veranstaltung sind auf der Website des Veranstalters zu finden: http://www.informatik-aktuell.de/seminare/it-tage-datenbanken-2015.html

Ergänzung vom 23.12.2015:

Mittlerweile sind auf der Website des Veranstalters auch die Slides zu den einzelnen Vorträgen zu finden: http://www.informatik-aktuell.de/seminare/it-tage-datenbanken-2015/download-praesentationen-it-tage-2015.html

 


Uwe Ricken: 22 Konferenzen – 40.000 Flugkilometer – 1.000.000 mal Danke

Das Jahr geht nun zu Ende und aktuell stehen noch zwei interessante Konferenzen zum Thema SQL Server auf meiner Agenda. Zum einen der SQL Saturday in Slovenien (nächste Woche) und die IT Tage Frankfurt mit Schwerpunkt Datenbanken. Insgesamt war das Jahr 2015 durch sehr viele Konferenzen geprägt, von denen ich nicht eine einzige missen wollte.

Deutsche SQL Konferenz

Im Februar ging es mit der “Deutsche SQL Konferenz” in Darmstadt los. Es freut mich wirklich sehr, dass diese Konferenz – in 2015 zum zweiten Mal ausgetragen – gut etabliert hat und auch im Jahr 2016 wieder in Darmstadt interessante Themen zum Microsoft SQL Server bietet. Da Darmstadt für mich quasi ein Heimspiel ist, ging es gemütlich mit dem Auto in weniger als 15 Minuten zum Veranstaltungsort.

SQLRally Nordic

Die SQLRally war auch dieses Jahr sicherlich wieder ein Highlight. Ich erwähne diese Konferenz insbesondere, weil die PASS leider dieses Format eingestellt hat. Ich weiß nicht, was dahinter steckt – aber ich bin davon überzeugt, dass dieses Format in Europa gut angekommen ist. Das beweisen immer wieder die hohen Besucherzahlen. Sehr schade!

SNEK (SQL Server + .NET-Entwicklerkonferenz)

Die SNEK ist eine von Karl Donaubauer initiierte Konferenz, die – wie es der Name schon verrät – sowohl SQL Server als auch .NET-Themen behandelt. Ich kenne Karl schon seit mehr als 20 Jahren. Karl ist seit vielen Jahren MVP für Microsoft Access und seine AEK gehen nun bereits in das 19. Jahr. Die AEK als auch die SEK/SNEK besuche ich schon seit Beginn als Sprecher. Das Format ist einzigartig; Karl veranstaltet die komplette Konferenz auf eigenes Risiko – es sind KEINE Sponsoren vor Ort. Das Konzept ist an Entwickler gerichtet und soll nicht für Marketingveranstaltungen missbraucht werden. Bei Karl habe ich – wenn man es genau nimmt – meine Karriere als Sprecher begonnen.

SQL Saturday(s)

Dieses Jahr war es ein neuer persönlicher Rekord – insgesamt bin ich als Sprecher auf mehr als 15 SQL Saturdays in Europa und USA mit einer eingereichten Session ausgewählt worden. ALLE SQL Saturdays waren außergewöhnlich. Ich kann wirklich jedem SQL Experten empfehlen, diese – für die Besucher – kostenlosen Veranstaltungen zu besuchen. Tolle Lokationen, tolle Sprecher und super nette SQL Experten all around. Einige SQL Saturdays werden mir auch noch in vielen Jahren in Erinnerung bleiben.

Cambridge

IMG_3496

WOW – Was Mark Broadbent (w | t) da mit seinem Team in Cambridge organisiert hat. ist einfach der Hammer. Mich hat nachhaltig das Speaker Dinner beeindruckt. Wir hatten die einmalige Gelegenheit, in einem der vielen Colleges in einem Saal zu essen, der selbst Harry Potter hätte erblassen lassen. Dir, lieber Mark und Deinem Team, ein großes Danke für drei unvergleichliche Tage in Cambridge!

Lissabon

IMG_3933

Niko Neugebauer hat in Lissabon schon vor vielen Jahren zum ersten Mal überhaupt einen SQL Saturday in Europa veranstaltet. Sein Hang zur Perfektion ist allgemein bekannt. Ich habe mich noch nie so gut “betreut” gefühlt, wie auf den SQL Saturdays, die von Niko Neugebauer veranstaltet wurden. Niko hat es dieses Jahr geschafft, neben Dejan Sarka (w | t) auch Paul White (w | t)aus Neuseeland als PreCon-Speaker zu gewinnen. Die gemeinsame Sonntagsveranstaltung wird mir immer im Gedächtnis bleiben – dort wurde der Twitter-Account-Name @sqlbambi für mich geboren :)

Portland (OR)

Vielen SQL Server Experten ist der SQL Saturday in Portland als “Vorglühen” zum SQL PASS SUMMIT sicherlich wohl bekannt; wird er doch genau eine Woche vor dem Pass Summit ausgetragen. Für mich war der SQL Saturday in Portland aus drei Gründen ein tolles Event:

  • Es war meine ERSTE Konferenz als Sprecher in den USA
  • Das Who is Who der europäischen Sprecherelite war vor Ort
  • Es war eine super tolle Zeit mit den deutschen und österreichischen Kollegen

SQL in the City – Redgate

Ich bin seit einigen Jahren sehr engagiert mit einem fantastischen Team von Redgate in Cambridge verbunden. Für mich persönlich ist aus dieser “Projekt-Verbindung” eine wunderbare persönliche Verbindung zu den Menschen bei Redgate geworden. Ich mag die Leute. Man trifft sie immer wieder auf den vielen SQL Server Konferenzen. Es ist für mich einfach nur schön, meine Zeit mit diesen Leuten zu verbringen. Von diesem Team kam die Anfrage, ob ich nicht bei “SQL in the City” in London und Seattle mit einem Beitrag über Wait Stats dabei sein wolle. Da mussten sie nicht lange fragen :)

  • In London war ich mit meinem eigenen Beitrag als auch als Ersatz für einen ausgefallenen Kollegen vertreten: Meine Vorträge wurden mit Platz 1 und Platz 2 der Konferenzbeiträge gewertet. WOW!
  • In Seattle ging es dann mit meinem ursprünglichen Beitrag in die zweite Runde. Auch dieser Vortrag wurde von den Teilnehmern mit Platz 1 in der Wertung belohnt.

Ein großes DANKE an das Team von Redgate dafür, dass sie so großes Vertrauen in mich haben; ein super großes DANKE geht natürlich an “the audience”. War eine tolle Erfahrung für mich und wird auch nie vergessen.

PASS Summit 2015

IMG_4487

Na ja – was soll man da sagen! Ich war das zweite Mal nach 2014 auf dem PASS Summit und das ERSTE Mal als Sprecher vertreten. Man kann sich sicherlich vorstellen, dass ich ganz schön aufgeregt gewesen war. Ein großes Danke geht an meine “internationalen SQL Friends”, die mir – quasi – das Händchen während meines Vortrags gehalten haben. Mark Broadbent, Regis Baccaro, Oliver Engels, Tillmann Eitelberg, Frank Geisler, … – euch gilt mein großes DANKE. Ihr seid in meiner Session gewesen und wir hatten zwei tolle Wochen miteinander verbracht.

PASS Camp 2015

Das PASS Camp wird jedes Jahr im Lufthansa Training und Conference Center in Seeheim-Jugenheim von der deutschen PASS e.V. veranstaltet. Ich war mit einem neuen Feature von SQL Server 2016 vertreten zu dem ich auch auf der SQL Konferenz 2016 eine Menge zu sagen habe. Das PASS Camp ist aus meiner Sicht EINMALIG. Es verbindet die klassische Konferenz mit Labs, in denen jeder Teilnehmer die vorher besprochenen Topics in einem eigenen Lab ausprobieren kann. Schade, dass ich nur an dem Tag in Seeheim war, an dem mein Vortrag war – aber ich habe derzeit einfach zu viel zu tun!

IT Tage Frankfurt 2015

Bevor für das Konferenzjahr 2015 der Vorhang fällt, werde ich noch zwei Mal in Frankfurt auf den IT-Tagen mit ein paar Sessions vertreten sein. Unter anderem gibt es eine – bereits lange vorher ausverkaufte – ganztägige Veranstaltung zur Analyse von SQL Server Problemen. Veranstaltet werden die IT-Tage Frankfurt von Andrea Held, die eine leidenschaftliche ORACLE-Expertin ist. Da soll man noch mal sagen, dass sich ORACLE nicht mit MS SQL Server verträgt.

Insgesamt bin ich im Jahr 2015 mehr als 40.000 km mit dem Flugzeug, 5.000 km mit der Bahn und 20.000 km mit dem Auto unterwegs gewesen, um auf unzähligen SQL Server Konferenzen und Usergroup-Treffen zu sprechen. Das Jahr geht nun bald zu Ende; die Arbeit wird – leider – noch nicht weniger aber es ist absehbar, dass 2015 wohl zu einem der intensivsten Jahre in und für die SQL Server Community geworden ist.

Euch allen ein schönes Weihnachtsfest und ein erfolgreiches Jahr 2016.
Herzlichen Dank fürs Lesen!

Shares

Uwe Ricken: 2,97 auf der Richterskala von 1–3 für PASS Summit Speaker

Ich mag es eigentlich nicht, den eigenen Erfolg so demonstrativ in den Vordergrund zu stellen (Ausnahme war die MCM Zertifizierung und der MVP Award). Aber mit dem folgenden Artikel möchte ich nicht verhehlen, dass ein gewisser Stolz beim Schreiben “mitschwingt”. Dieser Artikel soll aber auch dem Einen oder Anderen etwas Mut machen, vielleicht selbst einmal als Sprecher vor einem interessierten Publikum zu stehen. Vielleicht macht dieser Artikel ja Lust darauf.

PASS SUMMIT 2015

Der eine oder andere hatte es sicherlich mitbekommen; ich durfte auf dem PASS Summit 2015 in Seattle (WA) zum ersten Mal mit einer Session dabei sein.  Der erste Versuch im Jahre 2014 war nicht vom Erfolg gekrönt. Das es diesmal geklappt hat, lag sicherlich am Thema (ich war wohl der einzige mit diesem Topic) aber auch am Review meiner Abstracts! Hier gilt mein Dank vor allem Brent Ozar (t | w). Brent hat sich meine “Submission Abstracts” angeschaut und mir wertvolle Tipps bezüglich der Formulierung, etc. gegeben. Nun ja – es hat geklappt und das Review Board hat meine Session “Change Data Capture Case Study and Checklist” für den diesjährigen Summit ausgewählt. Am 30.10.2015 um 14:00 (PST) ging es dann auch pünktlich in “Ballroom 6A” los.

I'm Speaking_e-signature

Da es sich um den letzten Tag der Konferenz handelte und die Mittagszeit schon rum war, habe ich nicht mit zu vielen Zuhörern gerechnet. Insgesamt haben sich 123 SQL-Experten eingefunden, um meinen Ausführungen zu CDC zuzuhören. Nach 75 Minuten war der “Spuk” vorbei und ich muss eingestehen, dass ich noch nie so viel Spaß auf einer Session hatte, wie diese. Ich zitiere mal aus einem deutschen Film mit Til Schweiger: “Wenn du mit dem Schlitten durch die Stadt fährst, die Fenster auf und die Anlage voll aufgedreht bis zum Anschlag, das ist mehr als nur Auto fahren, das ist ein Gefühl von Freiheit, das ist total geil!”. So ähnlich kam es mir auch vor, nachdem die ersten zwei Minuten etwas holprig auf Grund der Aufregung vergangen waren. Der deutsche Fanclub war ebenso vertreten, wie der Fanclub aus Österreich, Dänemark und England! Ein dickes DANKE an meine FREUNDE aus der SQL Community!

Evaluation

Heute kam dann die Auswertung der Teilnehmer – und die war einfach nur überwältigend. Auf einer Skala von 1 (schlecht) – 3 (sehr gut) habe ich im Durchschnitt bei einer Beteiligung von 23 Teilnehmern eine 2,97 erreicht. Für das erste Mal vor so einer großen Kulisse als “non-native” Speaker finde ich diese Bewertung wirklich super! Ein anderes Highlight im “Bewertungsmarathon” ist diese Passage: “A minimum of twenty attendance and evaluation submissions must be reached to be considered for the top ten sessions.”. Da meine Session von 23 Personen bewertet wurden, nimmt meine Evaluation auf jeden Fall an der “Competition for the TOP 10 Sessions” teil. Insgesamt war für mich weniger die Bewertung “gut” oder “schlecht” interessant als vielmehr die Kommentare der Teilnehmer. Sie geben ein viel detaillierteres Bild von meiner Session als die Auswahl zwischen drei Werten. Folgende Kommentare (Nur ein Auszug) habe ich erhalten:

A very engaging speaker. Enjoyed thr session throughly in addition to learning CDC.

Excellent, fun session. I was stunned that CDC could be made fun.

Was a great overview and came away feeling like I can set it up right away. Did a good job showing examples before and after.

Great introduction to CDC. The examples were spot on and I feel comfortable now implementing it in my organization. Since I was not aware of this feature at all I am glad I found something useful to bring home from the conference that will make our lives easy

So – genug Lobhuddelei. Mich hat an den Kommentaren im Tenor gefreut, dass die Teilnehmer neben wichtigen Informationen zum Thema auch SPASS an der Session hatten. Sie haben sich “unterhalten” gefühlt und gemerkt, dass ich die Session nicht einfach “runterspule” sondern mit Engagement und Leidenschaft auf der Bühne stehe! Genau das war mein Gedanke, während ich die Session geplant und immer wieder korrigiert hatte; wenn die Leute lachen, bemerken sie Deine Fehler nicht! :) Ich habe mich über die Bewertungen natürlich gefreut – sie haben gezeigt, dass die vielen Stunden der Vorbereitung lohnenswert waren.

An diesem Punkt möchte ich sehr gerne noch einmal den Aufruf von Andreas Wolter (t |w) ins Gedächtnis bringen: “Die SQL PASS Deutschland sucht Sprecher – Aufruf an alle SQL Server Fachleute”. Ich teile seine Auffassung, dass es schön wäre, wenn sich mehr Sprecher für die örtlichen Usergroups / lokalen Konferenzen / SQL Saturdays / SQL Rally / PASS Summit aus Deutschland finden würden. Ich kenne so viele deutsche SQL Experten von den verschiedenen Usergroups, die das Zeug zu einem genialen Sprecher haben. Leider trauen sich einige nicht oder aber sie haben zu wenig Zeit. Beides ist absolut nachvollziehbar; aber es wäre doch sehr schön, wenn man sich mal einen Ruck gibt und dann – vielleicht – auch mal in Seattle in einem der großen Konferenzräume steht und über ein SQL Thema spricht, das mehr als 100 Leute interessiert.

Herzlichen Dank fürs Lesen!

Philipp Lenz: SSRS: PREVIOUS Funktion in einer Matrix

In diesem Beitrag beschreibe ich das Problem wenn man den Vorherigen Wert in einer Matrix in Reporting Services verwenden möchte: Reporting Services – PREVIOUS in a Matrix

Dirk Hondong: Es muss nicht immer DROP…CREATE sein

Hallo zusammen,

dieser kleine Beitrag schwirrte schon lange in meinem Kopf herum und nun mache ich mich endlich mal daran, diesen auch umzusetzen. Anlass ist der letzte Blog Post von einem unserer #sqlpass_de MVPs und Leiter der Regionalgruppe Ruhrgebiet: Frank Geisler (B|T). Frank hatte das, in der CTP 3 des SQL Servers 2016, neue DROP…IF EXISTS kurz vorgestellt.

Und dann ist mir wieder eingefallen, wie oft ich schon sogenannte Update Skripte gesehen habe, wo Funktionen, Prozeduren oder Views “überarbeitet” wurden. Die fingen dann nämlich so an:

   1: DROP PROCEDURE blabla
   2:
   3: CREATE PROCEDURE blabla
   4: AS
   5: ....
(das blabla stand natürlich nicht so in den Skripten)

An und für sich mag der Ansatz ja ok sein, auch wenn der schon nicht so richtig elegant ist. Was ist, wenn das entsprechende Objekt gar nicht vorhanden ist? Dann kommt sofort

Msg 3701, Level 11, State 5, Line 1
Cannot drop the procedure 'blabla', because it does not exist or you do not have permission.

Wie man es richtig macht, hat Frank in seinem BlogPost ja aufgezeigt, nämlich:

   1: IF OBJECT_ID('blabla','P') IS NOT NULL
   2:     DROP PROCEDURE blabla

oder dann demnächst in SQL Server 2016:

   1: DROP PROCEDURE IF EXISTS dbo.blabla
   2: GO
   3: CREATE PROCEDURE dbo.blabla
   4: AS

Nun aber Folgendes: Was ist denn, wenn man tatsächlich eine Datenbank hat, wo granular Berechtigungen vergeben worden sind und es ggf. kein dediziertes Schema gibt, auf dem ich die entsprechenden Berechtigungen vergeben kann? Wo also zum Beispiel ein bestimmtes Servicekonto nur eine Prozedur ausführen oder eine View abrufen soll? Mit dem DROP ist das Objekt weg und damit auch die granulare Berechtigung auf eben dieses.

Von daher hab ich nun schon einige Male folgende Idee mit auf den Weg gegeben (und es ist nichts Neues): Prüft, ob das entsprechende Objekt da ist oder nicht. Wenn nicht, dann einach einen Dummy anlegen und nachgelagert dann das neue Objekt mit ALTER begegnen. Wenn es schon da ist, dann greift direkt Euer ALTER Befehl. Also quasi so:

   1: IF OBJECT_ID('dbo.blabla','P') IS  NULL
   2:     EXEC ('CREATE PROCEDURE blabla
   3:     AS
   4:     SET NOCOUNT ON;')
   5: GO
   6: ALTER PROCEDURE blabla
   7: AS
   8: BEGIN
   9: PRINT 'So ist es doch besser....'
  10: END

Dies hat den Charme, dass Ihr nicht bereits gesetzte Berechtigungen verliert. Erspart in mancher heißen Testphase das eine oder andere Telefonat mit dem DBA eures Vertrauens.


Sascha Lorenz: SQL Server 2016 "R" in Reporting Services zur Implementierung eines IBCS Charts

Heute möchte ich kurz auf einen Post meines PSG Kollegen Thomas Martens (kurz Tom) hinweisen:

Er ist u.a. Experte für die Sprache “R” und beschäftigt sich schon einige Jahre mit diversen Implementierungen von fortgeschrittenen Algorithmen. Um so erfreuter war er, als bekannt wurde, dass Microsoft in dem kommenden SQL Server 2016 “R” integrieren wird.

Neben der Nutzung von “R” für komplexe finanzmathematische und statistische Herausforderungen ist ein weiteres Steckenpferd vom Tom die Entwicklung von individuellen Visualisierungen mittels des “R”-Paketes GGPLOT2.

Daher hat er es sich nicht nehmen lassen quasi Stunden nach der Verfügbarkeit des CTP 3 ein erstes Beispiel in seinem Blog zu posten.

https://minceddata.wordpress.com/2015/11/03/they-walk-in-line-sql-server-2016-reporting-services-and-r-charting-using-ggplot2-2/

Dabei handelt es sich einfach gesagt um einen SSRS Report, welcher mittels eines “R”-Skriptes Daten aus einer SQL Server Tabelle und SSRS Parameter nutzt, um dann mit GGPLOT2 eine Umsetzung eines IBCS Charts live zu rendern.


Das eröffnet der Nutzung des SQL Servers und der Reporting Services ganz neue Dimensionen!


Tom scharrt schon mit den Füssen, weil “R” auch für seinen Liebling Power BI angekündigt wurde. Ich bin gespannt.

Dirk Hondong: PASS Camp 2015–und ich als “first timer” mit dabei

Jupps, Ihr habt richtig gelesen. Der @SQLPaparazzo wird dieses Jahr tatsächlich beim PASS Camp mit am Start sein. Lange musste ich mich gedulden, doch jetzt hat es geklappt.

PassCamp

Für diejenigen, die davon noch nichts gehört haben sollten (was eigentlich sehr unwahrscheinlich ist): es ist DAS Ereignis, was die PASS Deutschland zu bieten hat. Drei Tage geballter Wissenstransfer. Und das nicht einfach in Form von Präsentationen und kleinen Demos des Sprechers.  Das Zauberwort heißt “Hands on”. Und dazu in einer richtig tollen Location, dem Lufthansa Training & Conference Center und mit noch tolleren Sprechern. Guckt Euch einfach mal die Liste an.

Glücklicherweise konnte ich noch einen Platz im DBA Track ergattern. Denn hier gilt, wie auch für den BI und den SQL Information Services Track: nur 20 Teilnehmer für den Track.  Es ist also schon eine exklusive Veranstaltung und der Schwerpunkt wird wohl der SQL Server 2016 sein, dessen CTP 3.0 seit kurzem draußen ist.

Und dabei fällt mir gerade ein: wie bereite ich mich eigentlich auf das PASS Camp vor? Schließlich war ich ja noch nie mit dabei. Vielleicht hat ja der eine oder andere einen Tipp, was man auf keinen Fall vergessen sollte. Ein Notebook einpacken wäre nicht verkehrt. Schon mal den SQL Server 2016 installieren? Macht bestimmt Sinn….  Smiley

Jedenfalls freue ich mich schon richtig, die “Familie” wieder zu treffen.


SQLPodcast: #012 – tSQLt

In dieser Folge vom PASS Summit 2015 aus Seattle habe ich mich endlich mal wieder mit meinem MVP und PASS Kollegen Frank Geisler unterhalten. Unser Thema dieses mal war tSQLt - Unit Testing für T-SQL. Frank hat einen groben Überblick gegeben was mit tSQLt machbar ist, wie Unit Tests funktionieren und wie man diese in seine Datenbank-Projekte integrieren kann.

Andreas Wolter: Conferences in the second half of 2015: From Asia to America to Europe // Konferenzen im 2. Halbjahr 2015: Von Asien über Amerika bis Europa

Don't contact us via this (fleischfalle@alphasierrapapa.com) email address.