it-swarm-eu.dev

Jak mohu spustit velký skript s mnoha přílohami, aniž by došel paměť?

Otázka:

Mám skript s přibližně 45 tisíci inzerátů z vybraných prohlášení. Když to zkusím a spustím, zobrazí se chybová zpráva oznamující, že mi došlo nedostatek paměti. Jak mohu spustit tento skript?

Kontext:

  1. Přidáno několik nových datových polí, aby aplikace fungovala pěkně s jinou aplikací, kterou klient používá.
  2. Mám tabulku dat od klienta plnou dat, která mapovala aktuální datové položky na hodnoty pro tato nová pole.
  3. Převedená tabulka k vložení příkazů.
  4. Pokud spustím pouze některá z příkazů, funguje to, ale celý skript ne.
  5. Ne. Nejsou překlepy.

Pokud existuje jiný způsob, jak bych měl načítat tato data, neváhejte mě trestat a dejte mi vědět.

28
spaghetticowboy

Maximální velikost dávky pro SQL Server 2005 je 65 536 * Velikost síťového paketu (NPS), kde NPS je obvykle 4 kB. To funguje na 256 MB. To by znamenalo, že by vaše vložené výpisy každý průměrně 5,8 KB. To se nezdá být v pořádku, ale možná tam jsou mimozemské prostory nebo něco neobvyklého.

Mým prvním návrhem by bylo vložit prohlášení „GO“ po každém příkazu INSERT. Tím rozdělíte jednu dávku 45 000 příkazů INSERT na 45 000 samostatných šarží. To by mělo být snazší strávit. Buďte opatrní, pokud některá z těchto příloh selže, může být obtížné najít vinníka. Možná se budete chtít chránit transakcí. Tyto příkazy můžete přidat rychle, pokud má editor dobré vyhledávání a nahrazování (které vám umožní hledat a nahrazovat návratové znaky jako\r\n) nebo makro.

Druhým návrhem je použít Wizard) k importu dat přímo z Excelu. Průvodce vytvoří pro vás malý balíček SSIS za scénami a poté jej spustí. To nebude mít problém.

17
darin strait

BULK INSERT nebo bcp se zdají vhodnější možnosti než 45 000 příkazů vložení.

Pokud potřebujete dodržet příkazy vložit, zvážil bych několik možností:

Odpověď: Použijte transakce a zalomte šarže 100 nebo 500 nebo 1 000 příkazů v každém z nich, abyste minimalizovali dopad na protokol a dávku. např.

BEGIN TRANSACTION;
INSERT dbo.table(a, ...) SELECT 1, ...
INSERT dbo.table(a, ...) SELECT 2, ...
...
INSERT dbo.table(a, ...) SELECT 500, ...
COMMIT TRANSACTION;
GO

BEGIN TRANSACTION;
INSERT dbo.table(a, ...) SELECT 1, ...
INSERT dbo.table(a, ...) SELECT 2, ...
...
INSERT dbo.table(a, ...) SELECT 500, ...
COMMIT TRANSACTION;
GO

B: Místo jednotlivých příkazů vložení použijte UNION ALL pro 100 nebo 500 příkazů najednou, např.

INSERT dbo.table(a, ...)
SELECT 1, ...
UNION ALL SELECT 2, ...
...
UNION ALL SELECT 500, ...
GO

INSERT dbo.table(a, ...)
SELECT 501, ...
UNION ALL SELECT 502, ...
...
UNION ALL SELECT 1000, ...
GO

Nechal jsem chyby zpracovat pro stručnost, ale jde o to, že bych se nikdy nepokusil odeslat jednu dávku 45 000 jednotlivých příkazů na SQL Server.

14
Aaron Bertrand

Nejsem si jistý, proč se vám nedaří dostatek paměti, ale existuje jednodušší přístup.

Pokud můžete exportovat data z tabulky do odděleného formátu (např. Csv), můžete k vložení dat použít průvodce importem dat v SSMS:

SSMS import data task.

9
datagod

Pomocí více SqlBulkCopy vytvořte dočasnou tabulku. Vložte nová data do dočasné tabulky a poté sloučte data v dočasné tabulce do stávající. Příklad použití metody C # SqlBulkCopy.WriteToServer (DataTable) . Doufám, že to pomůže

0
Hung Vu

Ano, mohli bychom to udělat, pokusil jsem se s přístupem [~ # ~] bcp [~ # ~] (program hromadné kopie), abychom se vyhnuli Vydání OutOfMemory .

Poznámka : Vyzkoušeno na serveru SQL Server 2014.

V BCP musíme nejprve exportovat data zdrojové databáze do souboru bcp (v místní složce adresáře) a poté je třeba importovat bcp soubor do cílové databáze.

enter image description here

Níže jsou kroky k procházce dortem:

Poznámka:

a) Zkontrolujte, zda je v cílové databázi prázdná tabulka

b) Ujistěte se, že složka Temp je na jednotce [~ # ~] c [~ # ~]

  1. Vytvořte soubor bat s názvem Export_Data.bat pomocí následujícího příkazu:

    bcp.exe [Source_DataBase_Name].[dbo].[TableName] OUT "C:\Temp\TableName.bcp" -S "Computer Name" -U "SQL Server UserName" -P "SQL Server Password" -n -q 
    

    pauza

  2. Spusťte tento bat soubor, v důsledku toho bude generován soubor bcp ve složce Temp

  3. Poté vytvořte další bat soubor s názvem Import_Data.bat s následujícím příkazem:

    bcp.exe [Destination_DataBase_Name].[dbo].[TableName] IN "C:\Temp\TableName.bcp" -S "Computer Name" -U "SQL Server UserName" -P "SQL Server Password" -n -q 
    

    Pauza

A tady jdeme!

0
Kms