MSSQL multiple insert, SQL SERVER 2005

Článek určen pro ty, kdo jsou vázání na SQL SERVER 2005 a starší. Popisuje hlavně rozdíly mezi MySQL. Dnes se jedná o hromadný insert (což považuji za jednu z killer optimalizačních features). Stejný problém však najdete i u sqlite.


Čas od času potřebujete databázi naplnit větším množstvím dat, u mne se běžně jedná třeba jen o klíč a hodnotu.

Hromadný insert je jedna z dalších nedostatků starších verzí jazyka T-SQL, který se projevuje u verzí SQL Serveru 2005 a starších.

V MySQL hromadný insert vypadá takto:

  1. INSERT INTO table (id, key, value) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12);

Rychlost tohoto dotazu je obrovská v porovnání s řešením v MSSQL.

Kde to lze řešit dvěma způsoby, opakovaným dotazem:

  1. INSERT INTO table (id, key, value) VALUES (1, 2, 3);
  2. INSERT INTO table (id, key, value) VALUES (4, 5, 6);
  3. INSERT INTO table (id, key, value) VALUES (7, 8, 9);

nebo sjednoceným selectem v jednom dotazu:

  1. INSERT INTO table (id, key, value)
  2. SELECT 1, 2, 3
  3. UNION ALL
  4. SELECT 4, 5, 6
  5. UNION ALL
  6. SELECT 7, 8, 9

Druhá možnost je sice rychlejší, nicméně testování na desítkách tisíc záznamů se mi jeví jako žalostné, bavíme se tady o desítkách sekund na celkem výkonném hardware.

POZOR SQLITE JE NA TOM STEJNĚ!