Datenbanken

Datenbanken

Posts 1-10 of 22
  • Jürg Danuser
    Jürg Danuser
    The company name is only visible to registered members.
    [MSSQL] Delete-Statement dauert extrem lange
    Hallo zusammen,

    Ich habe eine Tabelle mit ca. 280'000 Einträgen. Wenn ich einen SELECT auf die Primary-ID mache (SELECT * FROM MyTable WHERE Id = 12345) dauert eine Abfrage weniger als 100ms.
    Möchte ich jedoch eine Row löschen über die Primary-Id (DELETE FROM MyTable WHERE Id = 12345) dauert die Abfrage über 5,5 Sekunden.

    Kann mir da jemand weiterhelfen, warum dies so ist? Meine Anwendung wird extrem langsam wegen der langen langen 'löschtzeit'...

    Vielen Dank für eure Hilfe

    Gruss Jürg
  • Lars Pohlmann
    Lars Pohlmann    Premium Member
    The company name is only visible to registered members.
    Re: [MSSQL] Delete-Statement dauert extrem lange
    Ich bin kein MSSQL-Fachmann, aber:
    Sind irgendwelche Trigger auf der Tabelle?
    Oder Foreign-Key Constraints mit kaskadierendem Delete?
    This post was modified on 12 Feb 2008 at 12:43 pm.
  • Bernd Khalil
    Bernd Khalil    Premium Member
    The company name is only visible to registered members.
    Re^2: [MSSQL] Delete-Statement dauert extrem lange
    Ist der Index auf der Spalte id zu sehr fragmentiert?
  • Jürg Danuser
    Jürg Danuser
    The company name is only visible to registered members.
    Re^2: [MSSQL] Delete-Statement dauert extrem lange
    Ja es gibt einen Trigger, der wurde jedoch disabled und Fremdschlüssel gibt es nur einen auf andere Rows in der selben Tabelle. Der Datensatz auf den der Fremdschlüssel zeigt wird jedoch nicht gelöscht. Ausserdem kann diese NULL sein.
  • Jürg Danuser
    Jürg Danuser
    The company name is only visible to registered members.
    Re^3: [MSSQL] Delete-Statement dauert extrem lange
    Bernd Khalil schrieb:
    Ist der Index auf der Spalte id zu sehr fragmentiert?
    1: Wie kann ich den Fragmentierungsgrad nachschauen?
    2: Wenn es so währe, wieso ist dann die Abfrage per Select so extrem schnell?
  • Bjoern Rost
    Bjoern Rost
    The company name is only visible to registered members.
    Re^3: [MSSQL] Delete-Statement dauert extrem lange
    Jürg Danuser schrieb:
    Fremdschlüssel gibt es nur einen auf andere Rows in der selben Tabelle. Der Datensatz auf den der Fremdschlüssel zeigt wird jedoch nicht gelöscht. Ausserdem kann diese NULL sein.
    Das wird es aber sein. Wenn in einer anderen Tabelle B ein foreign key auf diese Tabelle angelegt ist, muss beim loeschen einer Zeile in A doch in B geprueft werden, ob nicht doch ein Verweis auf die zu loeschende Spalte gibt (denn sonst wuerde doch der contraint verletzt werden).
    Und wenn B nun gross ist und die entsprechende Spalte nicht indiziert ist, dann kostet das dort auch nochmal einen FTS.
  • Jürg Danuser
    Jürg Danuser
    The company name is only visible to registered members.
    Re^4: [MSSQL] Delete-Statement dauert extrem lange
    Vielen Dank für den Hinweis!

    Leider ist dies nicht das Problem, da ich in der betreffenden Spalte NULL drin habe und zudem habe ich versuchsweise den foreign key gelöscht und das Löschen dauert immer noch gleich lange.
    SELECT: 203ms
    DELETE: 5954ms
    (beides hat in der WHERE-Bedingung 1 Wert des Primary Key's)
  • Post visible to registered members
  • Georgios Skouras
    Georgios Skouras
    The company name is only visible to registered members.
    Re^6: [MSSQL] Delete-Statement dauert extrem lange
    Hallo,
    sich den query plan anzuschauen ist bestimmt gut. daraus kann man ersehen ob der pk/index richtig bzw. überhaupt verwendet wird.
    falls ein index existiert:
    ist die index tabelle aktuell? denn: werden viele einträge in die tabelle durchgeführt, kann die indextable nicht mehr optimal aufgebaut sein, so dass der zugriff einfach länger braucht
  • Christoph Pratsch
    Christoph Pratsch    Premium Member
    The company name is only visible to registered members.
    Re: [MSSQL] Delete-Statement dauert extrem lange
    kann es sein, dass während des Löschvorgangs andere, lesende Vorgänge auf der Tabelle stattfinden?
    Das Löschen braucht einen exclusive Lock (Sperre) auf dem Datensatz oder -block oder der ganzen Tabelle. Wenn die Sperre nicht gleich erteilt werden kann, wartet das Kommando, bis sie erteilt wird - zur Not bis in alle Ewigkeit (Standardeinstellung des lock timeout).
    Das Lesen hingegen braucht nur einen shared lock, und der kann zusätzlich zu anderen shared locks sofort genehmigt werden.
    Die Sperren kann man sich mit sp_lock oder mit dem Managament Studio anzeigen lassen.