Piktogramm
Admiral
- Registriert
- Okt. 2008
- Beiträge
- 9.254
Servus,
ich brauche größere Mengen Testdaten um das Verhalten eines Datenbanksystems (MS SQL) zu testen. Das Problem dabei ist jedoch, dass ich größere Mengen Testdaten brauche. So ab 60GB wären schön. Die Kür wäre, zwei getrennte Testdatensätze zu erstellen, bei denen die Kollisionshäufigkeit der Daten je Spalte einstellbar sind.
Das Problem dabei ist jedoch, dass die Mittel und Wege die ich ausprobiert habe allesamt langsam sind. Ich könnte den Spaß jetzt fröhlich weiter optimieren (und vor allem in C schreiben). Zeit ist jedoch ein knappes Gut vor Weihnachten und das Problem Testdatensätze zu generieren werde nicht nur ich haben. Also frage ich, ob jemand eine fixe Lösung kennt.
Für Testdatensätze kann ich zwar prinzipiell joinen bis der Festspeicher aus geht, jedoch bringen so zusammengejointe Tabellen sehr viele doppelte Werte mit, was für den testfall nicht taugt.
Meine Ansätze
Bash ist halt wirklich extrem lahm und der Int-Teil spuckt gerade nicht mehr als ein 16bit int aus (nicht schön, aber für den Testfall vernachlässigbar). Der Umweg über eine .csv ist egal, BULK INSERT frisst auch sehr große Dateien in kürzester Zeit.
Ms SQL
Hier fressen die einzelnen INSERT Befehle die Leistung und auch ohne Speichermangel stürzt das Ganze bei einem Loop der größer ist als 500.000 ab -.-
Edit: Das script ist nicht ganz aktuell, hab meine Windowskiste nur nicht zur Hand. Auf den Trichter den Index über den Primärschlüssel fallen zu lassen bin ich auch schon gekommen. Der Einfluss ist bei Ms SQL jedoch sehr klein.
Edit2:
Die Schleifen laufen mit einer stark begrenzten Größe ab, ich weiß, dass mich ein einzelner Durchlauf nicht auf meine gewünschte Größe bringt.
ich brauche größere Mengen Testdaten um das Verhalten eines Datenbanksystems (MS SQL) zu testen. Das Problem dabei ist jedoch, dass ich größere Mengen Testdaten brauche. So ab 60GB wären schön. Die Kür wäre, zwei getrennte Testdatensätze zu erstellen, bei denen die Kollisionshäufigkeit der Daten je Spalte einstellbar sind.
Das Problem dabei ist jedoch, dass die Mittel und Wege die ich ausprobiert habe allesamt langsam sind. Ich könnte den Spaß jetzt fröhlich weiter optimieren (und vor allem in C schreiben). Zeit ist jedoch ein knappes Gut vor Weihnachten und das Problem Testdatensätze zu generieren werde nicht nur ich haben. Also frage ich, ob jemand eine fixe Lösung kennt.
Für Testdatensätze kann ich zwar prinzipiell joinen bis der Festspeicher aus geht, jedoch bringen so zusammengejointe Tabellen sehr viele doppelte Werte mit, was für den testfall nicht taugt.
Meine Ansätze
Code:
#!/bin/bash
for i in {1..1000000}
do
#FLOAT
v=$[100 + (RANDOM % 100)]$[1000 + (RANDOM % 1000)]
v=$[RANDOM % 50000].${v:1:2}${v:4:3}
echo -n $v
echo -n ' ; '
#INT
echo -n $((RANDOM%2147483647+1))$((RANDOM%2147483647+1))$((RANDOM%2147483647+1))
echo -n ' ; '
#DATE
echo -n $((RANDOM%28+1)).$((RANDOM%11+1)).$((RANDOM%7000+1753))
echo -n ' ; '
#STRING
echo $(od -An -N16 -i /dev/urandom) | echo -n $(base64)
echo -e '\r\n'
done
Ms SQL
Code:
CREATE TABLE Datum (id INT NOT NULL IDENTITY(1,1), datum DATE, PRIMARY KEY (id));
CREATE TABLE Zeichenkette (id INT NOT NULL IDENTITY(1,1), zeichenkette VARCHAR(255), PRIMARY KEY (id));
CREATE TABLE Ganzzahl (id INT NOT NULL IDENTITY(1,1), ganzzahl INT, PRIMARY KEY (id));
CREATE TABLE Gleitkomma (id INT NOT NULL IDENTITY(1,1), gleitkomma FLOAT, PRIMARY KEY (id));
DECLARE @counter INT;
DECLARE @max INT;
SET @max = 500000;
SET @counter = 0;
DECLARE @FromDate DATE = '1900-01-01'
DECLARE @ToDate DATE = '3000-12-31'
WHILE @counter < @max
BEGIN
INSERT INTO Gleitkomma (gleitkomma)
SELECT RAND()
INSERT INTO Datum (datum)
SELECT dateadd(day,
rand(checksum(newid()))*(1+datediff(day, @FromDate, @ToDate)),
@FromDate)
INSERT INTO Zeichenkette (zeichenkette)
SELECT SUBSTRING(CONVERT(varchar(255), NEWID()), 0, 9)
INSERT INTO Ganzzahl (ganzzahl)
SELECT CONVERT(INT, @max*100*RAND())
SET @counter = @counter + 1
END;
GO
Edit: Das script ist nicht ganz aktuell, hab meine Windowskiste nur nicht zur Hand. Auf den Trichter den Index über den Primärschlüssel fallen zu lassen bin ich auch schon gekommen. Der Einfluss ist bei Ms SQL jedoch sehr klein.
Edit2:
Die Schleifen laufen mit einer stark begrenzten Größe ab, ich weiß, dass mich ein einzelner Durchlauf nicht auf meine gewünschte Größe bringt.
Zuletzt bearbeitet: