Gefilterte Indizes zur Abfrageoptimierung

Mit dem SQL Server 2008 führte Microsoft ein neues Feature ein: Filtered Index. Mit einem gefilterten Index ist es möglich, lediglich eine Teilmenge der zu indizierenden Tabelle einzubeziehen. Gerade bei oft gestellten, nach Teilbereichen abgegrenzten Anfragen ist es so möglich, eine entsprechende Optimierung herbeizuführen. Ich habe dies anhand eines kleinen Beispiels vorbereitet:

Wir nehmen uns eine Tabelle namens IndexDemo mit den Spalten ID, Name, Vorname und Geschlecht:
Create Table IndexDemo
(    ID nvarchar(38),
Name nvarchar(256),
Vorname nvarchar(256),
Geschlecht char(1),
Constraint PK_IndexDemo Primary Key(ID)
)

Diese Tabelle habe ich für meine Demo mit 80 Datensätzen gefüllt. Wir stellen uns vor, das wir regelmäßig die Namen aller Personen erheben müssen, die männlichen Geschlechts sind und formulieren folgende Abfrage:
Select Name from IndexDemo where Geschlecht = ‚M‘

Ohne Abfrageoptimierung erhalte ich via Execution Plan die folgenden Lastkennzahlen:
CPU COST: 0,000245
I/O COST: 0,0038657

Zum Vergleich legen wir jetzt einen gefilterten Index über die Spalte Name, mit der Einschränkung auf das männliche Geschlecht:
Create Nonclustered Index IX_IndexDemo_M
On IndexDemo(Name)
Where Geschlecht = ‚M‘

Eine erneute Abfrage ergibt via Execution Plan die folgenden Lastkennzahlen:
CPU COST: 0,000201
I/O COST: 0,003125

Wie man deutlich erkennt, konnte sowohl die CPU-Last als auch die I/O-Last erkennbar gesenkt werden. Wendet man gefilterte Indizes geeignet auf große Datenmengen an, lassen sich durchaus beachtliche Performancesteigerungen erreichen.

Weitere Informationen zu diesem Feature sowie der Verwendung finden sich in den Filtered Index Design Guidelines

Software-Review: Quest PowerGUI

Aus der Notwendigkeit heraus, das mittlerweile einige Sachen anstehen bzw. anstanden, die per Powershell zu automatisieren sind, hab ich mich auf die Suche nach einem ansprechenden Powershell-Editor begeben und bin auf dieser Suche dann auch fündig geworden: Quest PowerGUI

Herunterzuladen gibt’s das ganze hier: PowerGUI Downloads

4

Während der Installation können die zu installierenden Module ausgewählt werden. Für die Active Directory, Network und Exchange 2007 Module (wahrscheinlich auch für die Module des Operations Manager 2007, aber nicht explizit getestet), müssen die entsprechenden Quest Management Shells heruntergeladen werden, was der Installer aber vor dem Fortsetzen der Installation sofort anbietet.

Im Anschluss an die Installation findet sich im Startmenü ein neuer Ordner “PowerGUI”, in welchem die Links zur PowerGUI und zum PowerGUI Script Editor liegen.

Beim starten von PowerGUI präsentiert sich eine aufgeräumte Oberfläche, welche die mit installierten Erweiterungen als entsprechenden Baum auf der linken Seite darstellt, hier beispielhaft für meine lokalen Netzwerkverbindungen:

PowerGUI GUI

Für mich selber viel spannender ist allerdings der PowerGUI Script Editor.

Script Editor

Features des  Editors in kurzer Abfolge:

  • Syntaxhighlighting
  • Intellisense
  • Debugger
  • vorgefertigte Snippets für Standardfunktionen wie foreach usw.

Meine Meinung nach den ersten Stunden mit der PowerGUI und dem zugehörigen Script Editor: Ein gutes, ausgereiftes Freeware-Tool, dessen Download und Installation sich auf jeden Fall lohnt, wenn man öfter oder viel mit der Powershell unterwegs ist und in größerem Umfang scripten muss.

Bei PowerGUI.org finden sich gute Tutorials für Neueinsteiger, ein noch recht überschaubares Forum sowie ein kleines, aber feines Wiki.

Viel Spaß beim selber testen und erkunden.

/Edit: Leider gab es ein paar Probleme mit den im Beitrag eingebetteten Bildern, daher jetzt nochmal die Korrektur. Bitte entschuldigt die Unannehmlichkeiten.

Whitepaper zum Thema Powershell-Support in MS SQL Server 2008

SQL Server MVP Allan White (http://sqlblog.com/blogs/allen_white/default.aspx) hat bei / mit MS ein Whitepaper mit dem Titel “Understandig and Using PowerShell Support in SQL Server 2008” veröffentlicht. Er beschäftigt sich darin mit Themen wie SQL Server Management Objects, Backup und Agent Jobs.

Das Whitepaper ist hier zu finden: Understanding and Using PowerShell Support in SQL Server 2008

Hinweis: Um die Coding-Beispiele nachvollziehen zu können, muss das entsprechende PowerShell Snapin eingerichtet sein. Dies kann in einem meiner älteren Artikel nochmal nachgelesen werden: Einrichten der SQL Server Powershell

VB.Net – Funktion zum Herstellen einer SQL-Connection

In meinem Jobumfeld bin ich im aktuellen Projekt damit betraut, mehr und mehr separate MS SQL Server Datenbanken zum Import von Daten in ein IT-Managementtool anzubinden. Mittlerweile bin ich es leid, jedesmal pro Anbindung eine separate SQL-Connection herzustellen, bzw. den ConnectionString zusammenzustellen. Anbei nun eine kleine VB.Net-Funktion, welche eine nicht geöffnete, aber vollständig bestückte SQL-Connection herstellt. Die Wiederverwendung ist hierbei explizit erlaubt:

“‘ <summary>
“‘ Provides an generic Connection to MS SQL Server Database
“‘ </summary>
“‘ <param name=“Server“>Databaseserver</param>
“‘ <param name=“Database“>Database</param>
“‘ <param name=“IntegratedAuthentication“>True if SSPI, False if SQL Authentication</param>
“‘ <param name=“UserID“>SQL User-ID, will be ignored if IntegratedAuthentication = TRUE</param>
“‘ <param name=“Password“>SQL User-Password, will be ignored if IntegratedAuthentication = TRUE</param>
“‘ <returns>System.Data.SqlClient.SqlConnection-Object</returns>
“‘ <remarks>created by. C.Paul</remarks>
Public Function Generic_GetSQLConnection(ByVal Server As String, ByVal Database As String, ByVal IntegratedAuthentication As Boolean, ByVal UserID As String, ByVal Password As String) As System.Data.SqlClient.SqlConnection
Dim Connection As System.Data.SqlClient.SqlConnection

If IntegratedAuthentication Then
Connection = New System.Data.SqlClient.SqlConnection(„Data Source=“ & Server & „;initial Catalog=“ & Database & „;Integrated Security=True;Pooling=False“)
Else
Connection = New System.Data.SqlClient.SqlConnection(„User ID=“ & UserID & „;Data Source=“ & Server & „;initial Catalog=“ & Database & „;Password=“ & Password & „;Pooling=False“)
End If

Return Connection
End Function

Mit dieser Funktion habe ich sowohl die Möglichkeit eine Verbindung per Intergrated Authentication als auch per SQL Authentication herzustellen.