Im gestrigen Posting zu SQL habe ich noch einen anderen Trick von Itzik Ben-Gan verwendet, mit dem man besonders effizient Daten generieren und in eine Tabelle schreiben kann: beim Füllen der Hilfstabelle, in der z.B. die Zahlen von 1 bis 8000 gespeichert werden und daher nur eine Spalte "n" hat.
Prozedural würde man eine Schleife von 1 bis 8000 machen und 8000 Insert-Befehle absetzen. Das ist allerdings im mengenorientirten SQL sehr ungünstig, weil die vielen Einzeloperationen unnötig viel Zeit kosten. Den Unterschied bemerkt man vor allem, wenn es anstelle der 8.000 mal 8.000.000 Datensätze sind…
Viel effizienter ist es einen Datensatz einzufügen und dann in einer Schleife die Daten immer wieder zu kopieren (und damit zu verdoppeln). Für 8.000 Datensätze sind dann gerade mal 13 Inserts notwendig. Aber erst mit 80.000 bzw. 800.000 Datensätzen wird die Performance "spürbar". Im Vergleich zur "normalen" Schleife ergibt sich auf meinen heimischen PC ein Performance-Unterschied von Faktor 3 bis 6.
declare @max integer,
@rc integer;
set @max=8000;
set @rc=1;
insert into hilfstabelle (n) values (1);
while @rc<=@max begin -- sehr effizentes Füllen durch mengenorientierten Ansatz: insert into hilfstabelle (n) select @rc+n from hilfstabelle where @rc+n<=@max; set @rc=@rc*2; end
Damit nicht ungewollt zu viele Datensätze eingefügt werden, ist der Filter "where @rc+n<=@max" im SELECT des Inserts notwendig.
Vorbereitung:
if object_id(N'hilfstabelle') is not null drop table hilfstabelle
create table hilfstabelle (n integer primary key)
Der Code steht auch zum Download bereit.
[…] wird. Es git auch Unterschiede: Die Methode, wie die Helper-Table gefüllt wird, ist der von Itzik unterlegen. Außerdem kannte ich die Variante noch nicht, dass man auf diese Weise auch Strings […]