Overblog
Folge diesem Blog Administration + Create my blog
Blog von Olaf Helper
Neueste Posts

Übersicht der Objekte je Dateigruppe

22. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Das Boardmittel der Dateigruppen gibt es schon ewig im Microsoft SQL Server und das in allen Editionen, einschließlich der Express Editon (ok, in der Compact Edition gibt es das nicht). Je datenspeicherndem Objekt, also für Tabellen, Indizes, separate je Tabelle für BLOB Felder und auch für Partitionen, kann man festlegen, in welcher Dateigruppe es gespeichert werden soll. Einzige Ausnahme sind die PrimaryKey-Indizes, die werden immer in der gleichen Dateigruppe gespeichert; logischerweise, da sie physikalisch zusammen hängen.

Zum Organisieren von großen (in Hinsicht von Speicherplatz) Datenbanken ist das ein gutes und einfaches Mittel, um den verwendeten Speicherplatz über mehrere Dateien und damit Laufwerke hinweg zu verteilen. Zudem kann man Dateigruppen einzeln Sichern & Wiederherstellen. Last but not least kann man einzelne Dateigruppen auf „ReadOnly“ setzten, um so zum Beispiel Archive-Daten zuverlässig vor Änderungen zu schützen (inkl. durch dem DBA; also einem Selbst,). Folglich braucht man die Daten auch nur einmalig sichern; das spart Backup-Ressourcen.

Wenn man bei der Anlage von Objekte konsequent die richtige Dateigruppe berücksichtigt, ist ja auch alles in Ordnung. Aber wie findet man heraus, welches Objekt in welcher Dateigruppe angelegt wurde. Hinzu kommt evtl. noch, dass man Tabellen partitioniert hat und die Partitionen über mehrere Dateigruppen verteilt sind.

Der SQL Server weiß es natürlich und über die System-Views kann man die Daten auch abfragen; hier das T-SQL Statement dazu:

 

 -- Auflistung der Objekte + Indizes  
 -- je Dateigruppe / Partion 
 SELECT DS.name AS DataSpaceName 
  ,AU.type_desc AS AllocationDesc 
  ,AU.total_pages / 128 AS TotalSizeMB 
  ,AU.used_pages / 128 AS UsedSizeMB 
   ,AU.data_pages / 128 AS DataSizeMB 
  ,SCH.name AS SchemaName 
  ,OBJ.type_desc AS ObjectType  
  ,OBJ.name AS ObjectName 
  ,IDX.type_desc AS IndexType 
  ,IDX.name AS IndexName 
 FROM sys.data_spaces AS DS 
  INNER JOIN  
  sys.allocation_units AS AU 
  ON DS.data_space_id = AU.data_space_id 
  INNER JOIN sys.partitions AS PA 
  ON (AU.type IN (1, 3)  
  AND AU.container_id = PA.hobt_id) 
  OR 
  (AU.type = 2 
  AND AU.container_id = PA.partition_id) 
  INNER JOIN sys.objects AS OBJ 
  ON PA.object_id = OBJ.object_id 
  INNER JOIN sys.schemas AS SCH 
  ON OBJ.schema_id = SCH.schema_id 
  LEFT JOIN sys.indexes AS IDX 
  ON PA.object_id = IDX.object_id 
  AND PA.index_id = IDX.index_id 
 ORDER BY DS.name 
  ,SCH.name 
  ,OBJ.name
,IDX.name
Weiterlesen

SSMS Add-In und MS SQL Server 2008 R2 CTP3 November

21. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Nach etwas längerer Zeit wollte ich mal wieder an meinem eigenen Add-In für das SSMS (Microsoft SQL Server Management Studio) arbeiten und wurde plötzlich beim Öffnen des Projektes mit reichlichen Fehlermeldungen begrüßt.

Es wurde mokiert, das IObjectExplorerEventProvider nicht definiert sein und ServiceCache.GetObjectExplorer() kein Member ist. Ein Blick in den Objektbrowser zeigte schnell, dass es sie wirklich nicht mehr gibt. Beide sind im Namespace Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer der DLL SqlWorkbench.Interfaces.dll enthalten (liegt in C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlWorkbench.Interfaces.dll).

Tja, und der Grund ist, dass ich inzwischen Microsoft SQL Server 2008 R2 CTP 3 November installiert habe und im dem Zuge eben die DLL von Version 10.0.1600.22 auf 10.5.1352.12 aktualisiert wurde. Da es ein Minor-Release (oder weil es eine CTP) ist, gibt es keinen eigenen Ordner wie 105, sondern es wurde in dem Ordner von MS SQL Server 2008 installiert. So gestaltet sich eine Parallelinstallation von 2008 und 2008 R2 als problematisch; bisher was immer unkritisch war.

Bisher habe ich noch keine weiteren Hinweise oder Work-a-rounds gefunden; da recherchiere ich noch.

 

ObjectExplorer mit Stand MS SQL Server 2008

 IObjectExplorerEventProvider_10.jpg

 

Und mit Stand MS SQL Server 2008 R2 CTP3; da fehlt was zwischen INotifyWhenAddedToTree und IObjectExplorerService.

IObjectExplorerEventProvider_105CTP.jpg 

 

Also, wer versucht ein Add-In für MS SQL Server 2008 R2 SSMS zu installieren und es funktioniert nicht; daran liegt es.

Weiterlesen

Read / Write Aufkommen je Datenbank

20. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Jede Datenbank im produktiven Betrieb wird etwas anders verwendet. In die eine wird meistens in zyklischen Abständen geschrieben und nur selten mal gelesen; das wären zum Beispiel Archive-Datenbanken für Alt-Daten. Dann gibt es Datenbanken, in die im laufenden Betrieb in erster Linie die aktuellen Transaktionen mit hohem Detailgrad geschrieben werden, sogenannte OLTP Systeme. Die Daten hier raus werden dann leicht desnormalisiert & voraggregiert in Dataware-House System für weitere Auswertungen überführt; in ein OLAP System. Aus diesen wird naturgemäß mehr gelesen als geschrieben.

Als DBA sollte man die Verwendung seiner Datenbanken kennen, um Speicherplatz entsprechend planen zu können. Archive-Datenbanken ändern sich kaum, werden sowieso gesichert und kaum abgefragt, also kann man sie auf ein einfaches (günstigen) Festplattensystem ablegen. OLAP Datenbanken beruhen auf den Produktiv-Datenbanken, mal von Sicherungen abgesehen, können sie eh wieder neu aufgebaut werden; da sind vor allem schnelle Systeme gefragt wie RAID0, um Abfragen fürs Reporting schnell abzuarbeiten. OLTP hingegen sind das Herzstück der Datenhaltung, hier sollte man immer in ein sicheres sowie auch schnelles Speichersystem investieren.

Im Microsoft SQL Server 2005 (und auch 2008) kann man in einem gewissen Rahmen über die DMV (Dynamic Management Views) Statistiken die Anzahl von gelesenen und geschriebenen Seiten je Datenbank ermitteln. Ausgangspunkt ist dabei die DMV sys.dm_exec_query_stats, die schon für die häufigsten verwendeten Abfragen verwendet wurde und die benötigen Statistiken bereit hält.

Setzt allerdings voraus, das der Server schon eine Zeit lang läuft und die Statistiken aufgebaut sind und wie schon erwähnt mit parametrisierten Abfragen gearbeitet wird, sonst ist jedes (dynamisch generiertes) Statement ein eigenständiges. Nicht immer steht der Datenbank-Kontext für ein Statement fest, diese Queries werden dann unter „AdHoc Queries“ aufgeführt.

Grob aus Erfahrungswerten raus geschätzt, ist in „normalen“ ERP Datenbanken das Verhältnis von Write – Read ~ 1:20. Wie gesagt, das variiert je nach Verwendung.

Mit dem folgenden Statement kann man sich also eine Übersicht verschaffen, wichtig sind hier die LogicalReads und LogicalWrites:

 

 -- Übersicht der Logical Reads & Writes je Datenbank 
 -- Beruht auf den DMV Statistiken. 
 SELECT ISNULL(DB.name, 'AdHoc Queries') AS DatabaseName 
  ,SUM(EQS.execution_count) AS ExecutionCounts 
  ,SUM(EQS.total_worker_time) AS WorkerTime 
  ,SUM(EQS.total_physical_reads) AS PhysicalReads 
  ,SUM(EQS.total_logical_reads) AS LogicalReads 
  ,SUM(EQS.total_logical_writes ) AS LogicalWrites 
 FROM sys.dm_exec_query_stats AS EQS 
  CROSS APPLY sys.dm_exec_sql_text(EQS.sql_handle) as EST 
  LEFT JOIN sys.databases AS DB 
  ON EST.dbid = DB.database_id 
 GROUP BY ISNULL(DB.name, 'AdHoc Queries')
ORDER BY LogicalReads DESC, LogicalWrites DESC
Weiterlesen

Erstes CLR Assembly für Microsoft Analysis Services (SSAS)

19. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Nachdem das Erstellen und Verwenden von eigenen CLR Assemblies im Microsoft SQL Server Datenbankmodul gut funktioniert hat, wie eine eigene Aggregation oder ein Datenexport, wollte ich eigene Assemblies analog mal mit dem Microsoft Analysis Services versuchen.

Leider gibt es weniger Dokumentation zu dem Thema als für den Einsatzbereich des Datenbankmodules. Von Microsoft gibt es zum einen den TechNet Artikel User Defined Functions and Stored Procedures, der die Vorgehensweise beschreibt und dann noch einen kurzen MSDN Artikel Defining Stored Procedures.

Für ein eigenes Assembly wird zunächst das Namespace Microsoft.AnalysisServices.AdomdServer benötigt. Dieses ist natürlich nicht im GAC enthalten, man muss einen Verweis auf die Datei „msmgdsrv.dll“ setzten. Die wiederum findet man etwas versteckt im OLAP\BIN Ordner des Programm-Verzeichnisses der benannten Instanz. Zum Beispiel für meine Instanz „SQL105CTP3“ von der MSAS Version 10.5 ( = 10_50) =>

C:\Program Files\Microsoft SQL Server\MSAS10_50.SQL105CTP3\OLAP\bin\

Über die statische Klasse „Context“ kann man die Verbindungs-Kontext bezogenen Objekte und Verbindung nutzen.

Entgegen einer Assembly fürs Datenbankmodul gibt es keine spezielle Methoden-Properties wie <SqlProcedure(Name:="spNamen")>; wobei die eh optional, wenn auch sinnig sind.

Dafür arbeitet man auch nicht mit speziellen SqlTypes, sondern nur mit den normalen CLS Typen.

Ein ganz einfaches Projekt als Beispiel gibt es hier zum Download: OlafHelper.Ssas.Info

Wie immer ist es ein Microsoft Visual Basic 2008 Express Edition Projekt mit allem dabei, was nötig ist.

 Das erste Beispiel ist wirklich sehr einfach gehalten; nur um zu testen, ob es denn überhaupt funktioniert. Es sind nur ein paar Zeilen, die vom Aufbau her so aussehen: 
   
 Imports AMOS = Microsoft.AnalysisServices.AdomdServer 
   
 Namespace OlafHelper.Ssas 
   
  ''' <summary> 
  ''' CLR Assembly Beispiel für. 
  ''' </summary> 
  Partial Public NotInheritable Class Info 
   
  ''' <summary> 
  ''' Liefert den Namen des Servers der aktuellen Verbindung. 
  ''' </summary> 
  <CLSCompliant(False)> _ 
  Public Shared Function ServerName() As String 
  Return AMOS.Context.Server.Name 
  End Function 
   
  End Class 
   
 End Namespace 
Weiterlesen

Datenexport mittels einer CLR Assembly

13. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Für den aufbereiteten Export von Daten aus dem Microsoft Sql Server gibt es diverse Möglichkeiten und Tools, so bietet bereits nahezu jede Report Engine die Möglichkeit, die Berichtsdaten als Excel oder PDF-Datei zu speichern. Serverbasiert ist der SSIS (MS Sql Server Integration Services) prädestiniert für diese Aufgabe, ebenso der SSRS (MS Sql Server Reporting Service).

Es gibt aber auch regelmäßig mal die Anforderung, einen Export per T-SQL Befehl ausführen zu können. Das Problem ist nur, dass man das mit T-SQL nicht wirklich gut abbilden kann. Zwar kann man mit ActiveX Objekten arbeiten (siehe Stored Procedures sp_OA…), aber das ist alles andere als komfortable.

Danke der .NET Integration und der Verwendbarkeit von CLR Assemblies im MS Sql Server ab Version 2005 geht es nun auch bequemer. Eine solche Lösung habe ich einmal für ein paar Dateiformate umgesetzt. Für alle Exportformate gilt, dass diese erste Version alle Werte einfach per .ToString() ohne weitere Formatierungsangaben oder CultureInfo umwandelt, es werden deswegen die Ländereinstellungen des Servers verwendet.

 

Entwickelt habe ich es mit Microsoft Visual Basic 2008 Express Edition, damit kann auch jeder kostenfrei an die IDE zum Öffnen und Bearbeiten des Projektes kommen. Das Projekt ist mit einer SNK (Strong Name Key) signiert (Batch zum Erstellen liegt bei), ebenso gibt es wie immer ein MS FxCop Datei dazu. Die SQL Scripte zur Anlage der Stored Procedures sowie ein Testscript liegen im Unterordner „Sql“.

Die erste Version 0.0.0.1 des Assemblies ist für mich erst mal nur die grobe Umsetzung (Proof Of Concept), die ich bisher auch nur minimal getestet habe. Zudem will ich noch andere Funktionen hinzufügen wie das Exportieren von BLOB‘s oder FileStream Dateien. Wer will, kann sich das Projekt aber schon ansehen.

Download: OlafHelper.SqlServer.Export (104 KB)

 

Hier noch ein paar Detail-Informationen dazu:

 

Parameter „multiQuery“

Alle Export Prozeduren bieten den Parameter „multiQuery“ an. Wenn der Wert True übergeben wird, werden alle Statements des Batches aus dem Parameter „sqlStatement“ ausgewertet und die Daten exportiert. Bei CSV und HTML stehen die Tabellen in einer Datei untereinander, getrennt durch eine Leerzeile; bei CSV zugegeben nicht wirklich sinnvoll. Bei ExcelXml wird je Ergebnismenge ein weiteres ExcelWorksheet erstellt.

Der wichtigere Unterschied ist aber die interne Ausführung. Wenn multiQuery = True gesetzt wird, wird ein DataSet zum Abrufen der Daten verwendet. Für Client-Anwendungen ist ein DataSet optimal, man baut eine Verbindung zum Server auf, lässt per SqlCommand das DataSet füllen und trennt die Verbindung wieder. Anschließend kann man „verbindungslos“ weiter arbeiten, bis man wieder die Änderungen übertragen will. Zudem unterstützt das DataSet mehrere Resultsets, man kann also ein Sql Batch aus mehreren Statements ausführen und erhält für jedes ein eigenes Table im DataSet. Das bedeutet aber auch, dass die Daten die ganze Zeit im Speicher gehalten werden müssen. Wie gesagt, für einen Client optimal, aber nicht „innerhalb“ des MS Sql Servers, den dann hat man de facto die Daten auf der Maschine doppelt im Speicher und das wo man doch so nahe an der Quelle ist.

Wenn multiQuery = False übergeben wird, wird intern hingegen ein SqlDataReader verwendet, der wie ein Cursor die Datensätze arbeitet und immer nur die Daten für den aktuellen Datensatz abruft. Das spart Hauptspeicher-Platz.

Dieses sollte man bedenken, wenn man multiQuery verwenden will. Für kleine Datenmenge funktioniert es problemlos, bei größeren Datenmengen kann es Speicherplatz-Probleme verursachen => Verwendung auf eigene Gefahr.

 

Format CSV

Der Export erfolgt als einfache Coma Separated Values, die Feld- und Zeilentrennzeichen kann man als Parameter an die SP übergeben.

 

Format HTML

Es wird hier eine einfache HTML Datei erstellt, die je Tabelle ein <table/> verwendet. Es wird keine gesonderte Formatierung angegeben, alle Spalten der Tabelle haben die gleiche Breite.

 

Format ExcelXML

Das neue Excel XML Format (Office Open XML), das mit Office 2007 eingeführt wurde. ist erfreulich einfach aufgebaut im XML Format. Für ältere Office Version bis zurück zu 2000 gibt es das "Compatibility Pack for Open XML", um das Fomat öffnen zu können.

Zwar gibt es mittlerweile ein Open XML SDK 2.0 for Microsoft Office, das steht aber natürlich im MS Sql Server zur Verfügung, deshalb habe ich eine eigene Klasse zum Generieren erstellt.

Im Format gibt ein paar Header Tags, je Worksheet einen weiteren Tag, in dem man die Zeilen mit <Row/> und die Zellen mit <Cell/> angibt. Es wird dabei nicht die Klasse System.Xml.XmlDocument verwendet, da diese wieder komplett im Speicher gehalten wird, sondern System.Xml.XmlWriter. Das ist von der Handhabung her nicht ganz zu bequem, dafür werden die Daten gleich in die Ausgabedatei geschrieben. Um im Fehlerfall alle Resourcen frei zu geben, wird dazu eine eigene Klasse verwendet, die IDisposable implementiert. Schließlich soll auf keinen Fall der Sql Server Dienst in Mitleidenschaft gezogen werden.

 

Format XML

Es wird eine einfache XML Datei mit dem übergeben RootNode angelegt. Die Implementierung ist analog zu ExcelXML.

 

Weiterlesen

Microsoft SQL Server Migration Assistant 2005 / 2008 for MySQL v1.0 CTP1

9. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #Download MSSQL

Für MS Access und Oracle gibt es bereits SSMA (Sql Server Migration Assistant), nun sind auch noch die ersten Assistenent als CTPs für MySQL veröffentlicht worden.
Microsoft SQL Server Migration Assistant 2005 for MySQL v1.0 CTP1
Microsoft SQL Server Migration Assistant 2008 for MySQL v1.0 CTP1
Weiterlesen

PASS Camp 2010

8. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #Event

Wer es noch so kurzfristig einrichten kann, vom 19. - 21. Januar 2010 findet das PASS Camp 2010 auf den Gut Höhne in Mettmann bei Düsseldorf statt.
Weiterlesen

European PASS Conference 2010

8. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #Event

Vom 21. - 23. April 2010 findet die alljährliche European PASS Conference 2010 in Neuss. Wie immer von der PASS organisiert  und wie im letzten Jahr findet es im Swissôtel Düsseldorf/Neuss statt.
Eine Agenda steht noch nicht fest, allerdings lief der Call to Speakers bis gestern noch. 
Early Bird ist noch bis zum 01. Februar 2010.
Weiterlesen

Die MS Sql Server Farm von Hotmail

8. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Wer meint, eine große Microsoft SQL Server Farm zu betreiben, der sollte mal A peek behind the scenes at Hotmail machen.
Die Dimensionen der Installation sind wirklich beeindruckend.
Weiterlesen

Microsoft Visual Studio 2010 Beta SP1 als Virtual Maschine

4. Januar 2010 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

Mit MS Visual Studio 2010 und dem dazu gehörendem .NET 4.0 Framework, das als Release für Februar 2010 angekündigt ist, soll es einige neu Features geben.

So sollen diverse Features aus Visual Basic in C# übergehen und umgekehrt.

 

Für alle, die diese Beta Version testen möchten, ohne den eigenen Rechner mit einer Beta „verhunzen“ wollte, bieten Microsoft im Download Center diverse Variationen von VM (Virtual Maschine) an, die man gefahrlos auf seiner RM (Real Maschine) laufen lassen kann.

Es sei aber vorgewarnt, die Downloads sind alles andere als klein; auf eine DVD passen die nicht mehr drauf.

 

Microsoft® Visual Studio® 2010 and Team Foundation Server® 2010 Beta 2 virtual image for Windows Virtual PC  (7369 MB)

Microsoft® Visual Studio® 2010 and Team Foundation Server® 2010 Beta 2 virtual image for Windows Server 2008 Hyper-V (7316 MB)

Microsoft® Visual Studio® 2010 and Team Foundation Server® 2010 Beta 2 for Microsoft® Virtual PC 2007 SP1 Image (7325 MB)

 

Voraussetzung ist Microsoft Virtual PC 2007 mit SP1 oder Hyper-V.

Als Betriebssystem läuft MS Windows Server 2008. MS Visual Studio 2010 liegt hier in der Ultimate Edition vor.

Das Passwort für die Anmeldung findet man auf einem Startfenster vor dem Logon. Es wird etwas leicht irritierend dargestellt, die Bindestriche muss man nicht mit eingeben, die dienen nur zur Trennung. Dann steht es in eckigen Klammern noch ein zweites Mal dahinter, wo die Ziffern ausgeschrieben sind. Es müssen also nur die eigentlichen 8 Buchstaben / Ziffern eingegeben werden.
Weiterlesen
<< < 1 2 3 4 5 6 7 8 9 10 20 > >>