Oracle-Abfrage löscht zu viel Zeit
Ich habe eine Frage, wie
DELETE from tablename where colname = value;
dauert schrecklich lange Zeit zu führen.
Was könnte der Grund sein? Ich habe einen index auf colname.
Kommentar zu dem Problem
Könnte Sie veröffentlichen, erklären Sie planen Ihre Abfrage (in SQL*Plus ausführen von "SET AUTOTRACE ON EXPLAIN" dann ist deine Abfrage) ?
SQL - > set autotrace on explain SQL> delete from tablename where nid = 1250626; 1 Zeile gelöscht. Ausführungsplan ---------------------------------------------------------- 0 LÖSCHEN STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Byte=48) 1 0 LÖSCHEN VON 'tablename' 2 1 INDEX (UNIQUE SCAN) OF 'PK_tablename' (INDEX (UNIQUE)) (Cost=1 Card=1 Byte=48) Dies ist für die Löschung von 1 Zeile . Die ursprüngliche Abfrage hat ein " >=' - Bedingung, die ich nicht sehen konnte, eine Fertigstellung bis etwa 20 Minuten. Auch mit '=', es dauert mehr als eine minute
Was über die Leistung von SELECT * FROM tablename WHERE nid = 1250626; ?
Seine schnelle! nur Millisekunden zur Ausführung.! Das problem war in der Tat nicht indizierten Fremdschlüssel wie erwähnt von Vincent
InformationsquelleAutor der Frage Ajay | 2009-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte es mehrere Erklärungen, warum Ihre Abfrage dauert eine lange Zeit:
SELECT NULL FROM tablename WHERE colname=:value FOR UPDATE NOWAIT
,ON DELETE TRIGGER
das bedeutet zusätzliche Arbeit,UNINDEXED REFERENCE CONSTRAINTS
Hinweis auf diese Tabelle (es ist eine Skript von AskTom, dass wird Ihnen helfen, festzustellen, wenn solche nicht indizierten Fremdschlüssel vorhanden ist).InformationsquelleAutor der Antwort Vincent Malgrat
könnte es sein das deine Tabelle mit mehreren Tabellen haben eine große Zeilenanzahl.
InformationsquelleAutor der Antwort Wael Dalloul
Wie selektiv ist, dass index? Wenn Ihre Tabelle hat eine million Zeilen und dieser Wert trifft eine hundert und fünfzig tausend von Ihnen, dann ist dein index ist unbrauchbar. In der Tat ist es schlimmer als nutzlos, wenn es tatsächlich verwendet wird. Denken Sie daran, ein LÖSCHEN ist wie eine SELECT-Anweisung: wir optimieren Ihren Zugang Weg.
Außerdem löscht viel von undo-tablespace, so dass Sie vielleicht suffereing von Streit, wenn das system erlebt schwere verwenden. In einer multi-user-system einer anderen Sitzung kann eine Sperre auf die Zeilen(N), die Sie löschen möchten.
Hast du AUF den Auslöser LÖSCHEN? Haben Sie ON DELETE CASCADE foreign key-Einschränkungen?
Edit: alles, was Sie sagen, und vor allem die betreffende Spalte als Primärschlüssel, so dass Sie versuchen, löschen einer einzelnen Zeile, wenn es eine lange Zeit, es ist viel wahrscheinlicher, dass einem anderen Prozess oder Benutzer hat eine Sperre auf die Zeile. Alles andere zeigt sich in
V$LOCK
?InformationsquelleAutor der Antwort APC
Sieht Ihre Tabelle enthält eine größere Anzahl von Datensätzen ?
Gibt es eine rekursive Programme(einige geschachtelte Schleifen etc..) auf dem Datenbankserver ausgeführt ?
Überprüfen Sie Netzwerk-Probleme, wenn der Datenbank-server auf unterschiedlichen Maschinen ?
InformationsquelleAutor der Antwort Shyju
Wenn sich etwas langsam, und man weiß nicht warum, verfolgen Sie es und finden Sie heraus.
Wie kann ich das beheben von performance-Problemen mit einer Oracle-SQL-Anweisung
InformationsquelleAutor der Antwort Dave Costa
So, ich werde nur nach meiner Erfahrung. Könnte hilfreich sein für jemanden.
Die Abfrage
nahmen 16 Sek. löschen von 1700 Datensätze von 2300 Gesamt in Tabelle
foo
.Überprüfte ich alle Indizes für Fremdschlüssel so richten Sie in anderen Antworten. Das nicht helfen.
Lösung:
Verändert die Abfrage
Habe ich geändert
not in
zuin
und verwendetminus
zu erreichen richtige Ergebnis.Nun wird die Abfrage ausgeführt in 0.04 Sek.
InformationsquelleAutor der Antwort q23main