Announcement

Collapse
No announcement yet.

Datensätze einfügen dauert sehr lange wenn ein Index definiert ist

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datensätze einfügen dauert sehr lange wenn ein Index definiert ist

    Hallo zusammen!

    ich habe ein Delphi Programm, mit dem ich innerhalb eines Transaktionsblockes mit "Starttransaktion" und "Commit", Daten in eine Tabelle des SQL Server 2005 oder SQL 2008 Express schreibe.

    Ich verwende hierbei ein Borland Delphi tTable Objekt mit tDatabase und einer ODBC Verknüpfung. Im Prgramm werden die Daten mit Append und Post geschrieben.

    StartTransaktion
    __while Für_alle_Datensätze do begin
    ____Append;
    ____FieldByName('datum').asDateTime := xyz;
    ____....
    ____Post;
    __end;
    Commit

    Nun das Problem:
    Die Zieltabelle hat keinen Index - 5000 Datensätze anhängen dauert ca. 1 Sekunde.
    Hat die Tabelle einen Index (Feld Datum von Typ tDateTime), dauert das Einfügen der gleichen Anzahl Datensätze 5 Minunten.
    Dabei ist der Index als "gruppirt" oder "nicht gruppiert" angelegt - macht keine Unterschied.

    Was muss ich machen, dass der SQL Server trotz des definierten Index beim Append schneller wird?
    Zuletzt editiert von Peter Schmelzer; 29.10.2009, 12:28.
    _________________________________________
    >>> Die Summe der Probleme ist konstant <<<

  • #2
    Alle Indizes der Tabelle vor dem Einfügen löschen und anschließend wieder erzeugen. Ist gar nicht so schlimm wie sich das im ersten Momant anhört. Es gibt ja im ManagementStudio einen Menüpunkt, um sich das Script erzeugen zu lassen (rechter Mausklick auf die Tabelle -> Script für Tabelle als -> CREATE in -> ... ), da kopiert man sich die Statements raus und das DROP vorher sollte ja kein Problem darstellen. Ich habe das auch bei einigen meiner Import-Prozesse so gelöst - wirkt Wunder!

    bye,
    Helmut

    Comment


    • #3
      Index löschen

      Danke für die Info, gibt es noch eine Alternative?
      Habe eine Datenbank, wo das Neuerstellen des Index ca. 1 Min. dauert.
      _________________________________________
      >>> Die Summe der Probleme ist konstant <<<

      Comment


      • #4
        Alle Indizes der Tabelle vor dem Einfügen löschen
        Herrje Helmut, bist Du aber brutal: Seit Sql Server 2005 gibt es ALTER INDEX DISABLE (s.u.). Wenn Du den PK nimmst, werden alle anderen Indizes automatisch mit deaktiviert.

        Ich kann mir aber nicht vorstellen, das ein Index derart brems, selbst wenn der CLUSTERED ist und man die Daten in der falschen Reihenfolge einfügt; vor allem bei bescheidenen 5000 DS.
        Hast Du schon versucht, die Daten per INSERT Statements einzufügen, statt über einen Client Cursor; läuft das schneller?

        [highlight=SQL]USE [AdventureWorks]
        GO
        -- Deaktivieren
        ALTER INDEX PK_Address_AddressID ON Person.Address
        DISABLE;
        GO
        -- Hier die Massen-Operationen
        SELECT is_disabled
        FROM sys.indexes
        WHERE object_id = Object_ID('Person.Address')
        -- Neu erstellen
        ALTER INDEX PK_Address_AddressID ON Person.Address
        REBUILD ;

        SELECT is_disabled
        FROM sys.indexes
        WHERE object_id = Object_ID('Person.Address')
        [/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          TTable? ODBC? Da tipp ich mal drauf das hier die hoffnungslos veraltete BDE querschlägt. Kannst du auf ADO und prepared INSERT-Statements umstellen?

          Comment


          • #6
            Vielen Dank, das DISABLE werde ich probieren.

            ODBC - ja sicher etwas überholt - eine 10 Jahre alte BDE Anwendung kann man nicht mal schnell umbauen.
            _________________________________________
            >>> Die Summe der Probleme ist konstant <<<

            Comment


            • #7
              Hallo O.Helper,

              das mit dem disablen der Indizes kannte ich noch gar nicht - werde ich mir gleich mal ansehen, ob das schneller geht - eine Arbeitserleichterung ist es allemal, weil man die Programmteile mit der Neuanlage der Indizes nicht mehr mitwarten muss.

              danke für den Tip,
              helmut

              Comment


              • #8
                Helmut, auch ich lerne täglich hinzu; ein Grund, warum ich mich in Foren tummele; niemand kennt alles, die Summe macht es und man bekommt regelmäßig gute Ideen für Problemlösungen.

                Schneller wird es definiv nicht laufen, den es macht nichts anderes als den Index komplett neu anzulegen. Der Vorteil ist eben nur, man muss das Design der Indizes nicht (bis in alle Details) wissen, es bleibt unverändert und wird nur neu aufgebaut.
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  Hast du eigentlich mal mit dem SQL Profiter kontrolliert ob wirklich der Insert die Zeitfresser ist. Bei der BDE könnte ich mir viel andere Sachen vorstellen die drum herum Zeit fressen.
                  Zuletzt editiert von Bernhard Geyer; 30.10.2009, 09:22.

                  Comment


                  • #10
                    Habe inzwischen mal die Sache mit dem Cursor verfolgt. Wenn ich nicht via Tabellenobject einfüge, sondern mit einem SQL Statement "insert into .... " dann geht das Einfügen so schnell wier ich es brauche.

                    Vielen Dank für Eure Hinweise
                    _________________________________________
                    >>> Die Summe der Probleme ist konstant <<<

                    Comment


                    • #11
                      Originally posted by Peter Schmelzer View Post
                      Habe inzwischen mal die Sache mit dem Cursor verfolgt. Wenn ich nicht via Tabellenobject einfüge, sondern mit einem SQL Statement "insert into .... " dann geht das Einfügen so schnell wier ich es brauche.
                      TTable-Objekte sind nunmal für Destkop-DB's gedacht und verursachen teilweise bei richtigen SQL Servern Performanceprobleme.

                      Comment

                      Working...
                      X