heiko: aufräumen inkonsistenter DB

hi, ich habe eine datenbank mit 2 tabellen und jeweils einem primärschlüssel, der sich "userID" nennt. jeder datensatz wird also in beiden tabellen angelegt, und ist mit der gemeinsamen userID verbungen. aufgrund von fehlprogrammierung, ist es nun so, dass datensätze nur in einer tabelle angelegt wurden. diese datensätze sollen erst gefiltert und dann gelöscht werden. ich habe hierz ein script geschrieben, es kommt aber immer zum timeout?? vielleicht kann mich ja jemand korrekieren.

danke schonmal,
heiko

<%
dim cn
dim rs

set cn=Server.Createobject("ADODB.connection")
set rs=Server.Createobject("ADODB.recordset")

cn.Open="Provider=SQLOLEDB;SERVER=XXX;UID=XX;PWD=XXX;DATABASE=XXX"

rs.Open "SELECT * FROM user", cn

do until rs.eof=true
 dim rs2
 set rs2=Server.Createobject("ADODB.recordset")
 rs2.Open "SELECT * FROM profil WHERE userID=" & rs.Fields("UserID").value , cn
 if rs2.eof=true then
  rs.delete
  cn.execute "DELETE FROM user WHERE userID=" & rs.Fields("userID").value)
 end if
 rs2.Close
 Set rs2 = Nothing
rs.movenext
loop

rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
%>

  1. Hi Heiko,

    ich kenne die SQL-Einbindung in ASP nicht - aber wenn Du lediglich Datensätze löschen willst, reicht Dir doch das DELETE mit passender WHERE-Klausel - wozu brauchst Du das SELECT?

    rs2.Open "SELECT * FROM profil WHERE userID=" & rs.Fields("UserID").value , cn

    Das hier produziert einen Haufen Daten, die an Dein ASP-Skript übertragen werden, in welchem ich aber keinerlei Weiterverarbeitung erkennen kann. (Das kann den Server ggf. so heftig belasten, daß er Dein Skript abschießt.)

    cn.execute "DELETE FROM user WHERE userID=" & rs.Fields("userID").value)

    Und das hier alleine hätte meiner Meinung nach ausreichen müssen.
    Wie groß sind denn Deine Datenmengen so? Vielleicht schaffst Du das Löschen gar nicht in einem Arbeitsgang (bedenke, daß Indexbäume angepaßt werden müssen etc.!) und solltest es in mehrere Teilschritte zerlegen.

    Falls Du überhaupt die Tabelle nur leer haben willst (so ganz habe ich Dein ASP nicht verstanden), ist DELETE übrigens _ganz_ schlecht (wegen der ungeheuerlich vielen Schreibzugriffe).
    Viele Datenbanken haben eine explizite Anweisung zum schnellen Leeren einer Tabelle (TRUNCATE oder Ähnliches); ersatzweise wäre auch DROP TABLE und Neu-Anlegen deutlich performanter.

    Viele Grüße
          Michael

  2. Hallo,

    um ehrlich zu sein, ich habe endlich nicht verstanden, was du eigentlich meinst. Willst du eine ganze Tabelle in anderen kopieren, oder willst du unter bestimmte Bedingungen einige von sätzen löschen. Beim erteren gibt es eine SelectMischung-Anweisung, die das ohne jedes Problem macht. Um etwas zu löschen, hast du aber ganz viel mühe auf dich genommen.

    Erläutere dein Problem etwas genauer.

    Sohail