Datenbanken und mehr

11. September 2007

Wie finde ich heraus, welche SQL Server Version installiert ist?

Gespeichert unter: SQL Server — Urs Gehrig @ 09:04

Zu wissen, mit welcher Version des SQL Servers du es zu tun hast, ist immer gut. Wenn du interaktiv mit dem SSMS arbeitest, findest du die Version in der Statuszeile des Abfragefensters. Innerhalb deiner eigenen Applikation kannst du die Version mit einem SELECT-Statement abfragen:

SELECT @@Version

Microsoft SQL Server 2000 – 8.00.2039 (Intel X86)
     May 3 2005 23:18:38
     Copyright (c) 1988-2003 Microsoft Corporation
     Developer Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

oder für SQL Server 2000 und 2005:

SELECT SERVERPROPERTY(‘productversion’), SERVERPROPERTY (‘productlevel’), SERVERPROPERTY (‘edition’)
8.00.2039 SP4 Developer Edition

Die einzelnen Productversion habe ich in der folgenden Tabelle zusammengefasst:

SQL Server 2008

 

Katmay November CTP (CTP 5) (November 18, 2007)

10.00.1075.23

Katmay July CTP ( CTP 4) (July 31, 2007)

10.00.1049.14

June 2007 CTP Release (Katmai)

10.00.1019

SQL Server 2005

 

Cumulative Update Package 3 for SP2 (August 23, 2007)

9.00.3186

Cumulative Update Package 2 for SP2 (June 22, 2007)

9.00.3175

Critical Update SP2 (March 6, 2007)

9.00.3050

SP2 (February 16, 2007)

9.00.3042

SP2 CTP (November 6, 2006)

9.00.3027

Cumulative hotfix package (July 13, 2006)

9.00.2153

SP1 (April 19, 2006)

9.00.2047

RTM (November 7, 2005)

9.00.1399.06

September 2005 CTP Release

9.00.1314

June 2005 CTP Release

9.00.1187

April 2005 CTP Release

9.00.1116

December 2004 CTP Release

9.00.981

Beta 2

9.00.852

Beta 1

9.00.608

SQL Server 2000

 

SP4

8.00.2039

SP3a

8.00.760

SP3

8.00.760

SP2

8.00.534

SP1

8.00.384

RTM

8.00.194

SQL Server 7.0

 

SP4

7.00.1063

SP3

7.00.961

SP2

7.00.842

SP1

7.00.699

RTM

7.00.623

SQL Server 6.5

 

SP5a Update

6.50.479

SP5a

6.50.416

SP5

6.50.415

SP4

6.50.281

SP3

6.50.258

SP2

6.50.240

SP1

6.50.213

RTM

6.50.201

6. Juli 2007

Wie komme ich an meine AS400 Daten ran?

Gespeichert unter: SQL Server — Urs Gehrig @ 08:21

Wenn du von deinem SQL Server aus auf fremde Daten zugreifen möchtest, hast du prinzipiell zwei Möglichkeiten: entweder setzt du einen Linked Server auf oder aber du verwendest ein OPENROWSET Query. In beiden Fällen benötigst du aber selbstverständlich einen Daten Provider für das Fremdsystem – da bildet auch AS400 mit seinem DB2 keine Ausnahme. Bisweilen warst du hierfür immer auf Produkte von Drittfirmen angewiesen, wie zum Beispiel auf IBM mit iSeries Access for Windows OLE DB Provider oder aber du hast teure Produkte von Microsoft erworben, wie zum Beispiel Host Integration Server 2000.

Das hat nun endlich ein Ende. Mit dem Feature Pack für Microsoft SQL Server 2005 – Februar 2007 bietet Microsoft nun einen vollständigen OLE DB Provider für DB2 an und dies erst noch kostenlos. Da dieser OLE DB Provider (DB2OLEDB) als eigenständiges Installationspackage daher kommt, ist es erst noch kompakt (rund 8 MB).

Die Installation von DB2OLEDB ist kinderleicht. Erst einmal installiert bekommst du eine neue Programmgruppe Microsoft OLE DB Provider for DB2. Nebst einer recht ausführlichen Dokumentation findest du dort auch noch ein Data Access Tool zum konfigurieren und testen von Datenquellen und ein SNA Trace Utility zum aufzeichnen des Netzwerkverkehrs für die Fehlersuche bei Verbindungsproblemen.

Da du nun einen funktionierenden OLE DB Provider hast, kannst du jetzt auch einen Linked Server innerhalb des SQL Servers aufsetzen. Wie du das machst findest du ausführlich in Microsofts Knowledge Base Artikel KB222937. Die wichtigsten Dinge habe ich dir hier zusammengefasst:

Erstellen des Linked Servers:

EXEC sp_addlinkedserver 
@server=WNW3XX’
@srvproduct=‘Microsoft OLE DB Provider for DB2′
@catalog=‘OLYMPIA’
@provider=‘DB2OLEDB’
@provstr=‘NetLib=SNA;NetAddr=;NetPort=;RemoteLU=OLYMPIA;LocalLU=LOCAL;ModeName=QPCSUPP;User ID=WNW3XX;Password=WNW3XX;InitCat=OLYMPIA;Default Schema=WNW3XX;PkgCol=WNW3XX;TPName=;Commit=YES;IsoLvl=NC;AccMode=;CCSID=37;PCCodePage=1252;BinAsChar=NO;Data Source=Olympia_WNW3XX’

EXEC sp_addlinkedsrvlogin ‘WNW3XX’, false, NULL, ‘WNW3XX’, ‘WNW3XX’

Und ein paar Beispiele von Verteilten Abfragen:

–Example of SELECT using 4-part name: LinkedServer.Catalog.Schema.Table
SELECT *
FROM WNW3XX.OLYMPIA.WNW3XX.DEPARTMENT

–Example of Pass Through SELECT using OPENQUERY with 3-part name:
SELECT *
FROM OPENQUERY(WNW3XX,„SELECT * FROM OLYMPIA.WNW3XX.EMP_ACT“)

–Example of Pass Through SELECT using OPENROWSET with 2-part name:
SELECT *
FROM OPENROWSET
(‘DB2OLEDB’,‘Netlib=SNA;NetAddr=;NetPort=;RemoteLU=OLYMPIA;LocalLU=LOCAL;ModeName=QPCSUPP;User ID=WNW3XX;Password=WNW3XX;InitCat=OLYMPIA;Default Schema=WNW3XX;PkgCol=WNW3XX;TPName=;Commit=YES;IsoLvl=NC;AccMode=;CCSID=37;PCCodePage=1252;BinAsChar=NO;Data Source=Sample’,
‘SELECT * FROM WNW3XX.EMPLOYEE’)

–Example of an INSERT using 4-part name:
INSERT INTO WNW3XX.OLYMPIA.WNW3XX.DEPARTMENT VALUES (‘E21′,‘DUMMY’,NULL,‘E01′)

Ach ja, das Erstellen des Connection Strings von Hand kann manchmal schon echt zeitraubend sein; aber auch hierfür habe ich dir einen kleinen Tipp für deine Trickkiste. Erstelle auf deinem Desktop ein neues, leeres File und gib diesem die Endung UDL. Doppelklicke auf das File und Microsofts Data Link Wizard wird gestartet. Wähle dort deinen Provider, konfiguriere deine Data Source und beende anschliessend den Wizard wieder. Wenn du jetzt dieses File mit Notepad öffnest hat du deinen Connection String, den du so direkt weiter verwenden kannst. Viel Glück mit deinen AS400 Daten.

24. Juni 2007

Neuer TPC Record für SQL Server 2005

Gespeichert unter: Performance, SQL Server — Urs Gehrig @ 22:12

„SQL Server 2005 überschreitet die 1 Million Grenze im TPC-C Benchmark“ und „SQL Server 2005 setzt einen neuen TPC-H Rekord“; dies hat Microsoft vor ein paar wenigen Tagen veröffentlicht. Toll, SQL Server 2005 ist also ein Spitzenprodukt – aber was heisst das nun für unseren Alltag als IT Professional?

Fangen wir von Vorne an. Die Transaction Processing Performance Council (TPC), eine Nonprofit Organisation, wurde gegründet um Hersteller unabhängige Datenbank Performance Vergleichstests zu definieren. TPC Tests sind streng definiert und müssen von den Herstellern selbst durchgeführt werden. TPC übernimmt dabei die Rolle eines unabhängigen Auditors, der die Tests begleitet und die Ergebnisse überprüft. Die Ergebnisse selber werden in einem Bericht zusammengefasst und auf der Website der TPC publiziert (www.tpc.org).

TPC-C ist schlichtweg der Standard Test zur Messung der Performance und Skalierbarkeit von OLTP Systemen. Der durchgespielte Use-Case entspricht einem Bestellsystem in welchem parallel neue Bestellungen erfasst und bestehende abgefragt werden. Gemessen wird die Performance in Transactions per Minute (tpmC).

TPC-H ist ein weiterer Test. Diesmal ist der Use-Case aber an einem OLAP System angelehnt. Hier werden ad-hoc Abfragen parallel zu Datenupdates durchgeführt. Gemessen wird die Performance in Query per Hour (QphH@size). TPC-H Performance wird wesentlich von der Grösse der darunterliegenden Datenmenge bestimmt; daher werden die Tests zu Vergleichszwecken in verschiedene Gruppen (entsprechend der zugrundeliegenden Datenbankgrösse) zusammengefasst. Daher auch das @size.

Genug der Theorie und zurück zur Erfolgsmeldung von Microsoft. Was bedeutet nun mehr als 1 Million tpmC? Ist das viel? Warum soll das so toll sein, wenn Microsoft mit diesem Resultat lediglich an siebter Stelle der Top-10 Rangliste steht und der Spitzenreiter Oracle 10g R2 beinahe 4 mal so viel leistet? Microsofts Testkonfiguration hat sensationelle 1′231′433 tpmC geleistet. Nehmen wir an, dass diese Menge von Bestellungen Mitarbeiter in einem Backoffice erfasst haben, dann ergibt dies bei einer 40 Stunden Woche die schon fast astronomische Zahl von 153′682′838′400 Bestellungen pro Jahr. Im Vergleich dazu: Die Schweizer Luftfahrtgesellschaft SWISS hat im Jahr 2006 gerade mal 10 Millionen Passagiere befördert respektive Ticket verkauft und deren Bestellungen erfasst. Somit lässt sich mit SQL Server 2005 spielend der gesamte Ticketverkauf der SWISS abwickeln; ja wahrscheinlich sogar aller Luftfahrtgesellschaften der grossen weiten Welt zusammen. Genau dies ist die sensationelle Meldung des Tages. Geschehe was will: mein Kunde kann Forderungen bezüglich Skalierbarkeit der Lösung stellen und ich kann beruhigt antworten, dass der SQL Server 2005 dies schon mitmachen wird; Vorausgesetz der Kunde hat das hierfür notwendige Kleingeld. Solch eine Performance hat selbstverständlich seinen Preis. So besteht die Testkonfiguration zum Beispiel aus 64 Prozessoren, 1 TB RAM (ja Terabyte – nicht Gigabyte) sowie ganzen 1′742 Harddisks mit insgesamt 54.8 TB Kapazität. Dass dies auch was kostet, dürfte wohl jedem einleuchten.

Ganz ähnlich verhält es sich auch mit den TPC-H Resultaten. Hier ist SQL Server 2005 in den Kategorie 100 GB (19′323 QpH@1ooGB) und 1′000 GB (69′999QpH@1000GB) gar an Erster Stelle. Was bedeutet aber 69′999QpH@1000GB? Angenommen 1000 Business Analysten arbeiten parallel auf einem 1 TB grossen Datawarehouse, dann muss jeder von Ihnen mehr als 1 ad-hoc Abfrage pro Minute an das System stellen. Und selbstverständlich auch begutachten und bewerten, damit er in der Lage ist die nächste Abfrage zu formulieren und abzusetzen. Auch das dürfte wohl kaum eine praktische Limite für unser Daily Business darstellen.

Langer Rede kurzer Sinn: SQL Server 2005 muss sich nicht verstecken! Es wird kaum ein relevantes Szenario geben, bei welchem der SQL Server punkto Performance nicht mitkommt. In einigen Konstellationen ist der SQL Server 2005 gar die leistungsstärkste und kostengünstigste Lösung.

17. Juni 2007

MERGE Statement – ein cooles Feature von Katmai

Gespeichert unter: Katmai, Performance, SQL Server, T-SQL — Urs Gehrig @ 22:35

Beim Durchsehen von Katmai – dem Nachfolger von SQL Server 2005 – bin ich auf eine coole Erweiterung in der DB-Engine gestossen; dem MERGE Statement.

Das MERGE Statement vereint die drei Statements INSERT, UPDATE und DELETE. Neu kann mit nur einem einzigen Statement ein ganzes Datenset in einem Rutsch in die DB geschrieben werden, unabhängig davon, ob einzelne Records bereits erfasst (und demnach ein UPDATE benötigen) , neu sind (und somit ein INSERT benötigen) oder aber aus der DB gelöscht werden müssen (und somit ein DELETE benötigen). Natürlich erwarte ich von so einem neuen MERGE Statement auch eine erhebliche Performance Verbesserung gegenüber der alt hergebrachten Methode mit zwei oder drei separaten Statements (INSERT, UPDATE und DELETE). Ob dem so ist, werde ich dir gleich nachfolgend versuchen zu beweisen. Zuerst aber mal ein Beispiel zum MERGE Statement (dies habe ich mir aus dem BOL von Katmai ausgelehnt).

Szenario: In einem täglichen Prozess soll die ProductInventory Tabelle mit den Einträgen aus SalesOrderDetail aktualisiert werden. Die Spalte Quantity aus ProductInventory soll pro Produkt um die Anzahl der verkauften Produkte reduziert werden. Fällt ein Produkt auf eine Menge Null zurück, muss dieses Produkt aus ProductInventory gelöscht werden.

Lösung mit SQL Server 2005:

WITH Selling(ProductID, OrderQty) AS
(
    SELECT ProductID, SUM(OrderQty)
    FROM Sales.SalesOrderDetail sod
      JOIN Sales.SalesOrderHeader soh ON sod.SalesOrderID = soh.SalesOrderID
                                     AND soh.OrderDate = {d ‘2001-07-03′}
    GROUP BY ProductID
)
DELETE Production.ProductInventory
FROM Production.ProductInventory pi
  JOIN Selling src ON (pi.ProductID = src.ProductID)
WHERE pi.Quantity = src.OrderQty;

WITH Selling(ProductID, OrderQty) AS
(
    SELECT ProductID, SUM(OrderQty)
    FROM Sales.SalesOrderDetail sod
      JOIN Sales.SalesOrderHeader soh ON sod.SalesOrderID = soh.SalesOrderID
                                     AND soh.OrderDate = {d ‘2001-07-03′}
    GROUP BY ProductID
)
UPDATE Production.ProductInventory
SET Quantity = pi.Quantity - src.OrderQty
FROM Production.ProductInventory pi
  JOIN Selling src ON (pi.ProductID = src.ProductID)
WHERE pi.Quantity > src.OrderQty;

Lösung mit Katmai:

MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty)
       FROM Sales.SalesOrderDetail sod

         JOIN Sales.SalesOrderHeader soh
ON sod.SalesOrderID = soh.SalesOrderID
                                        AND soh.OrderDate = {d ‘2001-07-03′}

       GROUP BY ProductID) AS src (ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty = 0
    THEN DELETE
WHEN MATCHED
    THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty;

Also, eleganter ist die Lösung von Katmai allemal; wie sieht es aber mit der Performance aus? OK, ich weiss – Performance Tests mit CTP’s sind nicht gerade besonders fair. Ich bin aber auch nicht an absoluten Zahlen interessiert, sondern vielmehr an Trends. Daher habe ich die IO’s (SET STATISTICS IO ON) der beiden Lösungen miteinander verglichen:

mit SQL Server 2005:

Table ‘ProductInventory’. Scan count 4, logical reads 8, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘SalesOrderDetail’. Scan count 5, logical reads 15, physical reads 3, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘SalesOrderHeader’. Scan count 1, logical reads 703, physical reads 2, read-ahead reads 699, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(0 row(s) affected)

Table ‘ProductInventory’. Scan count 4, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘SalesOrderDetail’. Scan count 5, logical reads 15, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘SalesOrderHeader’. Scan count 1, logical reads 703, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘ProductInventory’. Scan count 0, logical reads 16, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(8 row(s) affected)

mit Katmai:

Table ‘ProductInventory’. Scan count 4, logical reads 8, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘SalesOrderDetail’. Scan count 5, logical reads 15, physical reads 3, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘SalesOrderHeader’. Scan count 1, logical reads 703, physical reads 2, read-ahead reads 699, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘ProductInventory’. Scan count 0, logical reads 16, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(8 row(s) affected)

Der Effekt des neuen Merge Statements scheint mir offensichtlich zu sein; rund die Hälfte der IO’s. Und das ist schlicht und einfach Super!

6. Juni 2007

SQL Server 2008 CTP – Woow!

Gespeichert unter: Katmai, SQL Server — Urs Gehrig @ 18:08

Endlich, der erste Community Technology Preview von SQL Server 2008 (bislang Katmai) steht allen zum Download bereit. Zusammen mit weiteren Infos findest du den Downloadlink unter http://connect.microsoft.com/SQLServer/content/content.aspx?ContentID=5395. Der Download ist rund 877 MB gross; es kann also eine ganze Weile dauern, bis du den runter kriegst. Bei mir läuft der Download gerade. Sobald ich ihn installiert habe und einen ersten Augenschein nehmen konnte, werde ich hierhin zurückkehren und dir meine ersten Eindrücke und Erlebnisse mit diesem CTP schildern. Machst du mit? Ich würde mich riesig freuen, wenn wir hier unsere Erfahrungen, Probleme und Hilfestellungen zum brandneuen SQL Server 2008 CTP austauschen könnten. Also, bis bald – mein Download läuft noch immer (19%)!

Ältere Artikel »

Bloggen Sie auf WordPress.com.