Welches Update ist mit Join oder Sequential schneller?

Diese Frage ist in der Reihenfolge meinerBisherigeFrage Die gleiche Tabelle muss beim Löschen einer Zeile aktualisiert werden.

Ich könnte zwei Lösungen mit schreibenGespeicherte Prozedur anstelle von Trigger oder verschachtelter Abfrage.

Beide verwenden eine Hilfsfunktionmein_signal (msg).

Eine gespeicherte Prozedur zum Löschen eines Mitarbeiters ausEmployee Tabelle.

Faust-Lösung: benutzenUPDATE zeilen in der tabelle,ohne Verknüpfungsoperation:
CREATE PROCEDURE delete_employee(IN dssn varchar(64))
BEGIN
    DECLARE empDesignation varchar(128);
    DECLARE empSsn         varchar(64);
    DECLARE empMssn        varchar(64);
     SELECT SSN, designation, MSSN  INTO empSsn, empDesignation, empMssn 
     FROM Employee 
     WHERE SSN = dssn;

   IF (empSsn IS NOT NULL) THEN
    CASE       
           WHEN empDesignation = 'OWNER' THEN 
               CALL my_signal('Error: OWNER can not deleted!');

           WHEN empDesignation = 'WORKER' THEN 
            DELETE FROM Employee WHERE SSN = empSsn;               

           WHEN empDesignation = 'BOSS' THEN 
               BEGIN 
                   UPDATE Employee
                   SET MSSN = empMssn
                   WHERE MSSN = empSsn;

                DELETE FROM Employee WHERE SSN = empSsn;                   

               END;
    END CASE;
   ELSE 
               CALL my_signal('Error: Not a valid row!');
   END IF;
END//  
Zweite Lösung: wie ich in meiner vorherigen frage vorgeschlagen wurde mitINNER JOIN
CREATE PROCEDURE delete_employee(IN dssn varchar(64))
BEGIN
    DECLARE empDesignation varchar(128);
    DECLARE empSsn         varchar(64);
    DECLARE empMssn        varchar(64);
      SELECT SSN, designation, MSSN  INTO empSsn, empDesignation, empMssn 
      FROM Employee 
      WHERE SSN = dssn;

   IF (empSsn IS NOT NULL) THEN
       IF (empDesignation = 'OWNER') THEN 
        CALL my_signal('Error: OWNER can not deleted!');
       END IF;

       UPDATE `Employee` A INNER JOIN `Employee` B ON A.SSN= B.MSSN
       SET B.MSSN = A.MSSN WHERE A.SSN = empSsn;

       DELETE FROM `Employee` WHERE SSN = empSsn;
   ELSE 
       CALL my_signal('Error: Not a valid row!');
   END IF;    
END//

ich leseHier Die Verwendung von Join ist für Efficient SELECT effizient. Mein Problem besteht jedoch nur aus einer Tabelle, und ich bin der Meinung, dass meine Lösung (erstens) viel effizienter ist als die zweite, da der Join vergleichsweise viel Speicher beansprucht.

Bitte schlagen Sie mir vor, was besser und effizienter ist, wennEmployee table ist ausreichend groß.Was ist besser für mich? Grund

BEARBEITEN: Ich habe nach einer kleinen Tabelle gesucht, die nur aus 7 Zeilen besteht, und beide Lösungen benötigen dieselbe Zeit.

mysql> CALL delete_employee(4);
Query OK, 1 row affected (0.09 sec)

Ich weiß, dass sich die SQL-Funktion aufgrund von Tabellenheuristiken nicht deterministisch verhält. Welche Wahl ist besser? Entweder wenn Sie eine Idee haben, wie die Abfrage weiter optimiert werden kann.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage