TSQL – wichtige Informationen über die SQL Server Instanz ermitteln

Wir alle kennen es, wir sollen Informationen zu unseren SQL Servern liefern… entweder der Kunde oder ein Kollege will schnell einen Überblick über die wichtigsten Parameter des SQL Servers haben… Was liegt da näher als mal eben schnell ein TSQL-Statement auf dem angefragten Server auszuführen?

Die letzten solcher Anfragen wollte immer die selben Informationen zusammengefasst bzw ermittelt haben… als habe ich mir mittels TSQL ein “kurzes” Skript zusammengestellt und nach meinen Bedürfnissen angepasst. Ich bzw wir verwenden dieses Skript nun auch für unsere eigene Dokumentation 😉

  • Server- / Instanznamen
  • letzter SQL Server Engine Start
  • welche SQL Server Edition / Version ist im Einsatz
  • Welche Werte für CPU / Hyperthreads / maxDOP werden genutzt
  • Konfiguration der RAM Nutzung
  • Anzahl / Namen / Größen der User-Datenbanken
SET NOCOUNT ON;
Go
-- Setting value of 'show advanced options' to 1
sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO

-- DECLARATION
SET NOCOUNT ON
DECLARE @date datetime, @start int, @ver varchar(13), @config_value varchar(20), @run_value varchar(20), @sqlstart datetime, @Mem int, @optimal_maxdop int, @cpu_count int, @scheduler_count int, @hyperthread_ratio int
DECLARE @CM Table ( [Index] int, Name nvarchar(1000) NOT NULL, Internal_Value int, Character_Value nvarchar(1000) )

-- SET Current Date/Time
SELECT @date = getdate()

-- Get SQL Server Version
SELECT @start = CHARINDEX ( 'Microsoft SQL Server 2005',@@version)
if @start = 1 SELECT @ver = rtrim(substring(@@version,29,13))

SELECT @start = CHARINDEX ( 'Microsoft SQL Server 2008',@@version)
if @start = 1 SELECT @ver = rtrim(substring(@@version,35,12))

SELECT @start = CHARINDEX ( 'Microsoft SQL Server 2008 R2',@@version)
if @start = 1 SELECT @ver = rtrim(substring(@@version,30,12))

SELECT @start = CHARINDEX ( 'Microsoft SQL Server 2012',@@version)
if @start = 1 SELECT @ver = rtrim(substring(@@version,29,12))

SELECT @start = CHARINDEX ( 'Microsoft SQL Server 2014',@@version)
if @start = 1 SELECT @ver = rtrim(substring(@@version,29,12))

SELECT @start = CHARINDEX ( 'Microsoft SQL Server 2016',@@version)
if @start = 1 SELECT @ver = rtrim(substring(@@version,29,12))

-- Get Informations and Calculation on MaxDOP
CREATE TABLE #MDP (
name nvarchar(1000),
minimun int NOT NULL,
maximun int NOT NULL,
config_value int NOT NULL,
run_value int NOT NULL
)
Insert into #MDP exec sp_configure 'max degree of parallelism'
SELECT @config_value=rtrim(convert(varchar(8),config_value)) ,@run_value=rtrim(convert(varchar(8),run_value)) from #MDP
DROP TABLE #MDP

-- Last SQL Server Start Date/Time
select @sqlstart = create_date from sys.databases where name = 'Tempdb'

-- Get Informations on CPU, Schedulers and Memory
Insert into @CM exec xp_msver select @Mem = Internal_Value from @CM Where Name = 'PhysicalMemory'
select
@scheduler_count=(SELECT count(*) FROM sys.dm_os_schedulers WHERE scheduler_id < 255) ,@cpu_count=cpu_count ,@hyperthread_ratio=hyperthread_ratio ,@optimal_maxdop=case when @scheduler_count >= 8 then 4
when @scheduler_count > 8 then 8
else CEILING(@scheduler_count*.5) end
from sys.dm_os_sys_info;

-- Main Statement
SELECT
CONVERT(CHAR(50), SERVERPROPERTY('MachineName')) AS [Hostname]
,isnull(CONVERT(CHAR(50), SERVERPROPERTY('InstanceName')), 'Default') [InstanceName]
,@@servername as [Servername]
,getdate() as [Current Date/Time]
,@sqlstart as [last SQL Srv Start]
,serverproperty('Edition') as [SQL Edition]
,@ver as [SQL Version]
,case serverproperty('IsClustered') when 0 THEN 'NO' when 1 THEN 'YES' end as [IsCluster]
,@cpu_count/@hyperthread_ratio as [CPU Count]
,@config_value as [MDP cfg]
,@run_value as [MDP run]
,(SELECT count(*) FROM sys.dm_os_schedulers WHERE scheduler_id < 255) as [No of Scheduler] ,@optimal_maxdop as [Optimal MDP] ,@Mem as [Memory (MB)] ,(SELECT value_in_use FROM sys.configurations WHERE name like 'min server memory (MB)') as [actual min memory] ,(SELECT value_in_use FROM sys.configurations WHERE name like 'max server memory (MB)') as [actual max memory] ,(select COUNT(name) AS MB from master..sysdatabases) AS [No Of DBs] ,(select SUM(size*8/1024) AS MB from master..sysaltfiles where fileid = 1 and dbid > 4) AS [Overall Database Size (MB)]
Go

-- Adding Informations for all User Databases
-- Declaration
DECLARE @SumDBSize VARCHAR(2)
DECLARE @temp INT
DECLARE @DBSize INT
DECLARE @Servername varchar(100)

-- Get/Set Servername
Set @Servername = ''
If @Servername = '' Set @Servername = @@SERVERNAME

-- Calculating DBSize
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[master].[dbo].[DatabaseFiles]'))
Set @temp = (SELECT round(SUM(db.size)/1024/1024,0) FROM [master].[dbo].[DatabaseFiles] as db where DATEDIFF(day, db.CreationDate, GETDATE()) = 0)
else Set @temp = (SELECT sum((size*8)/1024/1024 ) FROM sys.master_files)
Set @temp = (SELECT sum((size*8)/1024/1024 ) FROM sys.master_files)

Select
@Servername as 'Servername',
DB_NAME(sys.master_files.database_id) as 'DBName',
sum(sys.master_files.size * 8 / 1024 ) as 'DB-Size/MB',
sum(sys.master_files.size * 8 / 1024 / 1024 ) as 'DB-Size/GB'
from sys.master_files INNER JOIN sys.databases ON DB_NAME(sys.master_files.database_id) = DB_NAME(sys.databases.database_id) where DB_NAME(sys.master_files.database_id) not in ('master','model','msdb','tempdb') group by sys.master_files.database_id;
go

-- Reset value of 'show advanced options' to 0
sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO

Vielen Dank an  für seinen Beitrag zu “Best Practices Empfehlungen für MaxDOP

Dieses TSQL kann natürlich jederzeit frei genutzt werden, vorab in einem Testsystem getestet werden, Gefahr/Risiko trägt der Ausführende.

SQLBits 2016 – die UK SQL Server Community lädt ein

Mittlerweile zum 15. Mal lädt die britische SQL Server Community zum SQLBits ein!

Alles begann mit einer kleinen Gruppe von Personen, die sich gerne mit dem SQL Server auseinander setzten und andere an ihrem Wissen teilhaben lassen wollten. Was lag da näher als einen Community Event sondergleichen ins Leben zu rufen…
Mittlerweile hat sich herum gesprochen, dass die SQLBits ganz besondere Tage mit ganz besonderen Sprechern und Inhalten sind, Sprecher aus der ganzen Welt kommen nach England, um Ihr Wissen und Ihre Erkenntnisse mit der Community zu teilen.

Es gibt wieder 4 verschiedene Tracks (DEV, DBA, BI und Azure) aus denen man wählen kann, so dass jeder sich genau seinen SQL Server Schwerpunkt vertiefen kann. Innerhalb dieser Tracks gibt es zahlreiche interessante Sessions im Rahmen der SQLBits.

Zum Beispiel :

Advanced Techniques For Super Scaling SQL Server with Chris Adkin

Sie als DBA oder Entwickler arbeiten an Anwendungen mit anspruchsvoll, unternehmenskritischen Leistungsanforderungen, dass sie mindestens ein ein Level 400 – 500 haben und so ein tieferes Verständnis für die Datenbank-Engine, um auch noch das letzte Quäntchen Leistung aus der Datenbank-Engine heraus zu holen. In dieser Session erhalten sie hierzu einen 360-Grad-Einblick in alle wichtigen Themengebiete, was die Datenbank-Engine tut, damit sie in Zukunft alle “schweren” Probleme welche durch undokumentierte Waits und Spinlock-Aktivitäten auftreten können, in welche man mit den Standard SQL Server Tools kaum oder gar nicht Einsicht erhält. Sie lernen Techniken zur Durchführung tieferer Analysen der CPU-Auslastung kennen, Wait-Stats Analysen auf Thread-Ebene, ebenso die Fehlersuche nach schlechte Gerätetreiber bis hin zu Probleme im Netzwerk und/oder Storage-Bereich, alles über das Windows Performance Toolkit.

Increase Server Performance Step by Step - SQLBits 2016
Erfahren Sie wie man den Leistungsanforderungen von anspruchsvollen und kritischen Applikationen durch Skalierung begegnen kann. Session mit Chris Adkin auf der SQLBits

New features of SQL Server Reporting Services 2016 with Chris Testa-O’Neill

Sie haben Jahre lang auf Verbesserungen im Reporting Services gewartet, um noch bessere Berichte für Ihre Business-Anwender zu erstellen und liefern. Jetzt brauchen Sie nicht mehr zu warten, endlich ist es soweit, endlich kommen die neuesten Updates für Reporting Services im SQL Server 2016. Lassen Sie sich von Chris Testa-O’Neill in die neuen Funktionen des Reporting Services einweisen, in diesem eintägigen Workshop lernen Sie:

  • Microsoft Reporting-Strategie – Verstehen, wo Reporting Services passt in diese Strategie im Jahr 2016
  • Bericht Entwicklung Merkmale – Entdecken Sie die neuen Möglichkeiten für die Erstellung von Berichten
  • Abonnement Verbesserungen – Haben Sie eine bessere Kontrolle über das, was zu Ihren Benutzern
  • POWER Bi-Integration – Nahtlose Integration Ihrer SSRS Berichte mit Power BI-Berichte
  • SSRS und Datazen – Sehen Sie, wie Datazen vervollständigt das Reporting-Strategie

Weitere kleinere neue Features werden ebenfalls in diesem Workshop angesprochen, so dass sie sich ein vollständiges Bild aller neuen Features machen können.

Diese Session richtet sich an Berichtsentwickler, Berichterstattern und Berater, welche großen Berichte rechtzeitig für ihre Nutzer liefern möchten.

New Features in Reporting Services 2016 - SQLBits 2016
Session zu neuen Features in SQL Server Reporting Services 2016 mit Chris Testa-O’Neill auf der SQLBits

Columnstore Indexes – from basics to optimised analytics with Niko Neugebauer

Erfahren sie innerhalb nur eines Tages alles über die Grundlagen der Struktur der Columns Indizes sowie einen Schritt in die internen Details. Weiterhin werden Sie lernen, wie man Daten in eben die Columnstore Tabellen lädt und am Ende dieses Tages bringt ihnen Niko Neugebauer die fortgeschrittenen Konzepte des BatchModes und des Performance-Tuning näher.

Microsoft hatte bereits die Columns Indizes mit Nonclustered Columns im SQL Server 2012 eingeführt und SQL Server 2014 brachte Mircorsoft aktualisierbare Clustered Columns Indizes, nun mit SQL Server 2016 kommen zwei neue Bereiche mit den aktualisierbaren Nonclustered Columnstore Indexen – Operational Analytics und Operational Analytics In Memory hinzu.

Das erste Update bezieht sich dabei auf die traditionelle zeilenbasierte Speicherung, während sich Operational Analytics In Memory auf die Integration der InMemory Technologien des SQL Server (auch als Hekaton bekannt) konzentriert.

Bei diesem Tages-Training dreht sich alles um die Unterschiede in der Implementierungen, deren Vorteile und Grenzen und wie man das Beste aus allen Arten erhält und Ausprägungen der Columns Indizes.

A Complex Table with Foreing Keys and Clustered Columnstore by Niko Neugebauer - SQLBits 2016
A Complex Table with Foreing Keys and Clustered Columnstore by Niko Neugebauer, auf den SQLBits erklärt Niko alles rund um den Columnstore.

So gibt es noch zahlreiche weitere Sessions in den einzelnen Tracks, wo man sich kaum entscheiden kann, welcher Session man folgen möchte.
Ich wünsche allen Teilnehmern der SQLBITS 2016 ganz viel Spaß auf der Veranstaltung und lernt fleißig.

PASS Essential: Analyse eines Microsoft SQL Server auf Performanceprobleme

Aus dem Januar Newsletter der SQL PASS Deutschland:

Dauer: 1 Tag
Ort: Karlsruhe, inovex GmbH
Datum: 18. April 2016, 09.00-16.30 Uhr
Teilnehmeranzahl: mindestens 4, maximal 12
Preis: Mitglieder PASS Deutschland e.V. 299€ (inkl. MwSt.), Nicht-Mitglieder 475€ (inkl. MwSt.)
Schulungszertifikat: Ja
Anmeldung: E-Mail an registrierung@sqlpass.de
Voraussetzungen:

Sprecher:
Uwe Ricken (Twitter | Blog) verfügt über mehr als 6 Jahre Praxiserfahrung als DBA und mehr als 14 Jahre Erfahrungen als Entwickler von Datenbankmodellen.
Im Mai 2013 wurde diese Erfahrung mit der Zertifizierung zum 7. deutschen „Microsoft Certified
Master – SQL Server 2008“ gekrönt. Im Juli 2013 wurde ihm zum ersten Mal der MVP-Award von Microsoft für
seine Unterstützung der Microsoft SQL Server Community verliehen. Damit war Uwe Ricken der erste MCM +
MVP in Deutschland. Uwe Ricken ist als Sprecher zu den Themen „Database Engine Internals“, „Query Optimizing“
und „Entwicklung“ auf vielen Konferenzen in ganz Europa anzutreffen.

Inhalt
Nach Abschluss des Workshops haben Sie fundierte Kenntnisse in diesen Themen

  • „Problemzonen“ einer Installation von Microsoft SQL Server, die auftreten, wenn eine „Standardinstallation“ implementiert
    wird.
  • an Hand eines Stufenplans kann Schritt für Schritt die Analyse eines Systems durchführt werden.
  • Ergebnisse der Messungen werden in einer Bewertungsmatrix auf Schwachpunkte untersucht.

Teilnehmer Voraussetzungen:

  • Grundkenntnisse über Microsoft SQL Server
  • Umgang mit Microsoft SQL Server Management Studio

Kursinhalte:

  • Engpässe im Betriebssystem, die einen Microsoft SQL Server ausbremsen
  • Konfigurationseinstellungen einer Instanz von Microsoft SQL Server
  • TEMPDB – falsche Konfiguration und ihre Auswirkungen auf die Performance
  • PLE – Analyse und Bewertung von „Page Life Expectancy“ im Zusammenhang mit verwendeten Datenbanken
  • Analyse der Belegung des Buffer Pool pro Datenbank!
  • PFS-Contention, Locking, Blocking, Deadlocks – welche Möglichkeiten gibt es für die Beseitigung
  • Korrekte Datenbankeinstellungen (Datenbankdateien, Protokolldateien)
  • PERFMON – Einblicke in die Arbeitsweise des Microsoft SQL Server zur Performancebewertung
  • Analyse von Wait Stats zur Bewertung von vorhandenen Engpässen
  • Anforderungen an eine Kundendokumentation
    •  Gliederung der Dokumentation
    • Präsentation der Analyseergebnisse & Handlungsempfehlungen
  • An konkreten Beispielen, die mit dem eigenen Laptop (mitgebracht incl. installierter Software) ebenfalls simuliert werden
    können, werden verschiedene Engpässe demonstriert, die es zu erkennen gilt. Wenn es um die Bewertung von Analyseergebnissen
    mittels Wait Stats geht, so können solche Ergebnisse für jeden EIGENEN Server simultan im Workshop ausgewertet
    werden.

PASS Essentials werden vom PASS Deutschland e.V. veranstaltet: http://www.sqlpass.de
Allgemeine Geschäftsbedingungen (AGB): http://www.sqlpass.de/Events/AllgemeineGeschäftsbedingungenAGB.aspx

Power BI – mein leichter Einstieg

Ich habe mich heute das erste mal mit einem ernsthaften Ansatz mit dem Power BI Desktop auseinander gesetzt.
Nein, nichts kompliziertes, aber für mich ausreichend und ein Einstieg in die Materie… also erwartet bitte (noch) keine komplexen Erläuterungen 😉

Power BI Desktop runtergeladen und installiert, dass war recht einfach und bekommen Sie garantiert hin.

Das Tool das erste Mal gestartet und ein simpler und selbsterklärender Dialog erscheint … natürlich will ich Daten laden 😉

Power BI Desktop - Steps 1

Im Rahmen eines Kunden-Projektes sollten wir einfache Performance-Daten ermitteln (alle 5 Minuten die Laufzeit eines definierten Insert-Statements ermitteln), diese Daten kann man ja auch historisch sammeln und als “Trendbarometer” für die Performance Auslastung des SQL Servers nutzen. Dazu müssen die Daten aber entsprechend gesammelt und grafisch aufbereitet werden… was liegt da näher sich mit dem neuen Power BI Desktop zu beschäftigen.

Da die Daten im Kundennetz liegen, musste ich den Zwischenschritt über eine Excel-Datei als Datenquelle machen… also Excel ausgewählt, Datei geöffnet, Tabelle gewählt => die Vorschau hatte mir genau meine Daten gezeigt, ich war erstmal zufrieden, abschließend “Daten laden”.

Power BI Desktop - Steps 2

Nun wählt man einen Diagramm-Typen aus, in meinem Fall ein “Liniendiagramm”.
Jetzt braucht man nur noch die Datenfelder, Measures oder berechnete Spalten dem Diagramm hinzufügen, je nach Bedarf eben in die dafür vorgesehenen Felder.

Für mein Beispiel:

  • Achse => Check_Timestamp
  • Legende => bleibt vorerst einmal leer
  • Werte => Runtime

Damit haben einen ersten “Wurf” und auch die erste grafische Darstellung meiner Werte.

Power BI Desktop - Steps 3

Da es sich um viel zu viele Werte handelt (daher das kleine Warndreieck oben links im Diagramm) muss eine Unterteilung her, hierzu füge ich eine zusätzlich berechnete Spalte hinzu, die mir nur Werte für bestimmte Tage ausgibt.

Mittels rechte Maustaste in der Felderspalte oder die Menüleiste erhalten wir eine neue berechnete Spalte

Datum = LEFT(Tabelle1[Check_Timestamp];10)

Diese neue Spalte hänge ich als zusätzlichen Filter ein, dadurch kann ich mir immer nur einen bestimmten Tag oder mehrere Tage auswählen und analysieren.Power BI - Steps 4

Sicherlich mag es elegantere und saubere Lösungswege geben, dies ist aber mein erster Versuch und an diesem wollte ich euch/Sie teilhaben lassen. In Zukunft werde ich noch mehr über dieses grandiose Tool Power BI berichten, dann sicherlich mit “hübscheren” Lösungen und Analysen.

Windows Cluster patchen und automatisch Verteilung wieder herstellen

Jeder kennt es, Server und deren Betriebssysteme in produktiven Umgebungen (in Testumgebungen natürlich auch) müssen regelmäßig gepatcht werden. Solange es sich um Standalone-Systeme handelt gibt es selten Probleme…
Wenn man aber Ressourcen auf einem Cluster verteilt hat, dann sind so manche OS-Kollegen leider so uneinsichtig oder engstirnig, dass man sich ganz die Termine merken muss, wann diese Kollegen wieder das SQL Server Cluster patchen wollen.

Ich habe leider immer wieder die Erfahrung machen müssen, dass die Kollegen das Cluster nur als Aktiv-Passiv-System (=> alles läuft auf einem Knoten und schwenkt im Fehlerfall auf den Ersatzknoten) ansehen, ein Cluster kann aber eben auch als Aktiv-Aktiv-System betrieben werden. Ok, dann muss man darauf achten, dass im Fehlerfall alle Ressourcen auf einer Seite gemeinsam Lauffähig sind. Man muss sich also im Vorweg Gedanken machen zur optimalen Konfiguration (beispielhaft Min./Max Memory) um alle SQL-Server auf einer Cluster-Knoten betreiben zu können.

Aber was passiert mit den Cluster-Ressourcen nach einem Patch-Durchgang? Die oben bereits genannten Kollegen haben nur ihren Part im Kopf und patchen einfach nur die Systeme, heißt sie machen einen Knoten des Cluster frei und patchen diesen freie Knoten. Um natürlich auch Ressourcen und Kosten zu sparen, werden solche Dinge automatisiert in der Nacht durchgeführt.

Aber was passiert nach dem Patchen mit dem Cluster? Hat sich jemand die ursprüngliche Verteilung gemerkt? Werden die Ressourcen wieder auf die ursprünglichen Knoten verteilt?
Aus leidlicher Erfahrung muss ich leider “Nein” sagen…

Auswirkungen dieser Nicht-Beachtung

Auch wenn man sich im Vorwege ausreichend Gedanken gemacht hat, dann ist es (zumindest bei uns) so, dass die einzelnen Cluster-Ressourcegruppen nicht alle die volle RAM-Ausstattung nutzen können, da es hier oft zu Engpässen kommt.

Wir konfigurieren unsere geclusterten SQL-Server meist so, dass der Parameter “Min.Memory” die Hälfte des Parameters “Max.Memory” erhält. Sollten dann tatsächlich alle Instanzen auf einem Knoten laufen, kommt es immer wieder zu RAM-Engpässen da alle SQL Server Instanzen versuchen unter Last ihren konfigurierten Wert für “Max.Memory” erreicht. Da dies dann nicht passt, “prügeln” sich die einzelnen Instanzen eben um die knappen System-Ressourcen.

Also wäre es das Idealste nach dem Patchen eben genau die vorgesehen Verteilung wieder herzustellen, damit alle Ressourcen möglichst optimal arbeiten können. Aber wie erreicht man dies?
Auf jedem System wird Powershell mitgeliefert, mittels Powershell werden immer mehr Skripte geschrieben, so dass man sein ganzes System oder sein ganzen Windows-Cluster sehr gut mit Powershell administrieren kann.

In der Theorie klingt das alles so einfach:

  • Systemzustand ermitteln
  • Cluster-Ressource-Gruppen ermitteln
  • durch die einzelnen Gruppen durchlaufen
    • Prefered-Owner der jeweiligen Ressource-Gruppe ermitteln
    • mit dem aktuellen Owner vergleichen
    • bei Abweichungen auf den Prefered-Owner schwenken
  • Fertig

Da ich diese Aktivität in der Hauptsache bei meinen Betriebssystem-Kollegen sehe, hatte ich dort einmal nachgefragt und erhielt Antworten, die mich nicht wirklich hoffen ließen. (ansatzweise habe ich das weiter oben schon angedeutet)
Also musste ich mir selber Gedanken machen… aber erst einmal googlen… warum sollte ich das Rad neu erfinden… 😉

hier die Lösung für die Cluster Umverteilung

Und siehe da, es hatte mir jemand die Arbeit abgenommen… 😉
Fermin Sanchez von der fsis GmbH hatte sich zu diesem Thema schon einmal Gedanken gemacht und (für mich) glücklicherweise in seinem Blog veröffentlicht.

Import-Module FailoverClusters
 
$clustergroups = Get-ClusterGroup | Where-Object {$_.IsCoreGroup -eq $false}
foreach ($cg in $clustergroups)
{
    $CGName = $cg.Name
    Write-Host "`nWorking on $CGName"
    $CurrentOwner = $cg.OwnerNode.Name
    $POCount = (($cg | Get-ClusterOwnerNode).OwnerNodes).Count
    if ($POCount -eq 0)
    {
        Write-Host "Info: $CGName doesn't have a preferred owner!" -ForegroundColor Magenta
    }
    else
    {
        $PreferredOwner = ($cg | Get-ClusterOwnerNode).Ownernodes[0].Name
        if ($CurrentOwner -ne $PreferredOwner)
        {
            Write-Host "Moving resource to $PreferredOwner, please wait..."
            $cg | Move-ClusterGroup -Node $PreferredOwner
        }
        else
        {
            write-host "Resource is already on preferred owner! ($PreferredOwner)"
        }
    }
}
Write-Host "`n`nFinished. Current distribution: "
Get-ClusterGroup | Where-Object {$_.IsCoreGroup -eq $false}

Da Fermin das Skript in seinem Blog “as-is” veröffentlicht hat, musste ich das Skript natürlich erst einmal testen, hierzu habe ich die eigentliche “Move-Zeile” auskommentiert. Das Ergebnis dieses Testlauf brachte genau das Ergebnis, was ich mir erhofft hatte. Im Rahmen des letzten Patchdays habe ich das Skript nach dem Patchen erfolgreich eingesetzt und konnte so Kundenbeschwerden über mangelhafte Performance des SQL-Server vermeiden.

Vielen Dank an Fermin und seine Leistung!