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.
UPDATE
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.