Donnerstag, 8. Juli 2010

Size matters! Woher bekomme ich größere Testdatenbanken?

Häufig bekomme ich zu hören, dass die Adventure Works Datenbank ja zu klein sei, um mal wirklich Performance Tuning Szenarios im stillen Kämmerlein zu testen.

Ok, zuerst natürlich die Anmerkung, dass wohl die wenigsten in besagtem Kämmerlein auch eine entsprechende Hardware haben, um “echte” Erlebnisse zu haben und damit Erfahrung zu sammeln. Sowas bekommt Ihr nur im Feld!

Aber gut, ich gebe gern zu, dass die Adventure Works Umgebung tatsächlich ein wenig schlank ist. Daher hier ein paar Tipps wie Ihr an wesentlich mehr Daten kommen könnt!

Erst mal die Frage an den Hersteller Microsoft, was dieser uns so bietet? Und siehe da, es gibt eine wesentlich größere Datenbank:

Microsoft Contoso BI-Demodatensatz für die Einzelhandelsbranche

Woher kommen die denn nun? Das ist u. a. das Futter für PowerPivot Demos! :-)

Hey, wer sagt da jetzt, dass ihm der Download zu groß ist? Ihr wolltet doch mehr…

Ach so, es sollen mehr Datensätze aus dem Nix entstehen und zwar genau jetzt! Auch da kann geholfen werden. Es gibt zwar diverse Skripte dafür im Netz, aber die haben wir natürlich nie dann zur Hand, wenn wir diese brauchen. Müssen wir also kurz lernen, wie wir das quasi aus dem Kopf immer wieder schaffen werden.

Es gibt zwar Ansätze mit Schleifen und einzelnen Inserts. Wir wollen das aber mal in einer Query versuchen. Vielleicht wird es auch noch eine Sub-Query.

Rettung naht in Form der master.sys.columns. Wie das jetzt? Nun ja, die ist hoffentlich immer da und hat einige Zeilen. Daher merken:

master.sys.columns

Und? Folgende Query wirft doch gerade mal 659 Zeilen bei mir und da ist auch gar nix nützliches drin!

select COUNT(*)
from master.sys.columns a;

Natürlich sind das jetzt noch zu wenig Zeilen, aber jetzt kommt der zweite Teil zum merken:

cross join

Was? Wozu sollen das denn jetzt taugen? Ok, schaut Euch die folgende Query an:

select COUNT(*) as Anzahl
from master.sys.columns a
cross join master.sys.columns b

Das macht schon mal 434.281 Zeilen bei mir. Und die hier?

select COUNT(*) as Anzahl
from master.sys.columns a
cross join master.sys.columns b
cross join master.sys.columns c

Wow, da kommen nun 286.191.179 Zeilen bei rum. Nur was haben wir damit gewonnen? Den Zähler an den wir unsere Testdaten anhängen können! Nun brauchen wir nur noch kurz eine laufende Nummer. Moment mal, es gibt doch zum Beispiel ROW_NUMBER(). Aber die ist ja vorgesehen für die Over Klausel, aber das lässt sich relativ leicht “aushebeln”. Und mit dem TOP lässt dich die Anzahl genau steuern.

select top 500000
ROW_NUMBER() over( order by a.is_filestream  ) as nummer
from master.sys.columns a
cross join master.sys.columns b
cross join master.sys.columns c

 

ROW_NUMBER() over( order by a.is_filestream  ) as nummer

Hey, jetzt nicht schlapp machen beim merken! Ok? Führen wir mal alles zusammen. Mit der folgenden Query haben wir schon 50.000.000 Zeilen. Mit den Spalten Produkt, Lieferant und Umsatz könnt Ihr wenig spielen.

select
nummer,
N'Produkt'+ CAST( nummer % 100 as nvarchar(15)) as Produkt,
N'Lieferant' + CAST (nummer % 10 as nvarchar(15)) as Lieferant,
CAST(5000+ (nummer % 5000) as money) as Umsatz
into t9
from
(
  select top 50000000
  ROW_NUMBER() over( order by a.is_filestream  ) as nummer
  from master.sys.columns a
  cross join master.sys.columns b
  cross join master.sys.columns c
) x

So, ich hoffe, dass nun der eine oder andere was für sich mitnehmen konnte bzw. nun eine Idee hat, wie aus dem Nix Testdaten entstehen können. Und nun viel Spaß beim Indizieren und passt mir bitte auf, dass Ihr nun nicht produktive Server mit Testdaten flutet!