Einzelnen Beitrag anzeigen

Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#4

AW: 100.000 Datensätze in 22 Minuten - geht das noch schneller?

  Alt 18. Apr 2011, 12:07
Der Import der Daten erfolgt von einem Client (lässt sich nicht ändern). Die Daten kommen aus einer Textdatei (Semikolon getrennt).
Es wird nur eine SQL Tabelle verwendet, die nur einen Primärschlüssel besitzt.
Code:
...
CREATE TABLE [dbo].[mat_beweg](
   [id] [int] IDENTITY(1,1) NOT NULL,
   [snr] [nvarchar](9) NOT NULL,
   [b_ftag] [nvarchar](4) NOT NULL,
   [b_datum] [nvarchar](8) NOT NULL,
   [b_art] [nvarchar](2) NULL,
   [b_folge] [nvarchar](3) NULL,
   [ktr] [nvarchar](9) NULL,
   [znr] [nvarchar](3) NULL,
   [sinr] [nvarchar](7) NULL,
   [kst] [nvarchar](4) NULL,
   [k_art] [nvarchar](2) NULL,
   [umbnr] [nvarchar](5) NULL,
   [kz_es] [nvarchar](1) NULL,
   [bestand] [nvarchar](12) NULL,
   [menge] [nvarchar](12) NULL,
   [menge_storno] [nvarchar](12) NULL,
   [wemnr] [nvarchar](6) NULL,
   [bnr] [nvarchar](9) NULL,
   [lnr] [nvarchar](11) NULL,
   [preise] [nvarchar](2) NULL,
   [bpreis] [nvarchar](10) NULL,
   [preisart] [nvarchar](1) NULL,
   [dpreis] [nvarchar](10) NULL,
   [bwert] [nvarchar](11) NULL,
   [buch_datum] [nvarchar](8) NULL,
   [buch_grund] [nvarchar](20) NULL,
   [buch_user] [nvarchar](8) NULL,
   [zchnr] [nvarchar](38) NULL,
   [benennung] [nvarchar](36) NULL,
   [lieferant] [nvarchar](18) NULL,
   [lastupdate] [datetime] NOT NULL,
 CONSTRAINT [PK_mat_beweg] PRIMARY KEY CLUSTERED
(
   [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Stored Procedure "UPSERT"
Code:
/****** Objekt: StoredProcedure [dbo].[sp_upsert]   Skriptdatum: 04/18/2011 12:58:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_upsert]

   -- Add the parameters for the stored procedure here
   @snr nvarchar(9),
   @b_ftag nvarchar(4),
   @b_datum nvarchar(8),
        ...,
   @lastupdate datetime
AS
SET transaction isolation level SERIALIZABLE
SET NOCOUNT ON
BEGIN TRANSACTION Upsert
   
   update mat_beweg set snr = @snr,
                         b_ftag = @b_ftag,
                         b_datum = @b_datum,
                         ...
         lastupdate = @lastupdate
               where snr = @snr

   if @@rowcount = 0 and @@error=0
   begin
      insert into mat_beweg (snr, b_ftag, b_datum, ..., lastupdate)
                    values (@snr, @b_ftag, @b_datum, ..., @lastupdate)
   end
COMMIT TRANSACTION Upsert
Aufruf aus dem Program
Delphi-Quellcode:
...
with sp_upsert do
begin
  ProcedureName := 'sp_upsert';

  // Parameter-Liste aktualisieren
  Parameters.Refresh;

  Prepared := True;

  for i:=0 to 100000 do // symbolisch für die Datensätze
  begin
    Parameters.ParamValues['@snr'] := IntToStr(i);
    Parameters.ParamValues['@b_ftag'] := '6272';
    Parameters.ParamValues['@b_datum'] := '20110418';
    Parameters.ParamValues['@lastupdate'] := Now;
    ...
    ExecProc;
  end;

  Prepared := False;
end;
Das ganze ist nur ein einfacher Import (INSERT oder UPDATE). Ich hoffe die Infos sind ausreichend. Ein Merge funktioniert nicht, da ich SQL Server 2005 Express habe und die Funktion erst ab 2008 existiert.
  Mit Zitat antworten Zitat