Какое обновление быстрее при использовании соединения или последовательного?
Этот вопрос в последовательности моегопредыдущийВопрос требуется обновить ту же таблицу при удалении строки.
Я мог бы написать два решения, используяХранимая процедура вместо триггера или вложенного запроса.
Оба используют вспомогательную функциюmy_signal (MSG).
Хранимая процедура удаления сотрудника изEmployee
Таблица.
UPDATE
строки в таблице,без операции соединения: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//
Второе решение: как мне было предложено в моем предыдущем вопросе, используяINNER 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//
Я читаюВот что использование соединения эффективно для Efficient SELECT. Но моя проблема включает в себя только одну таблицу, и я считаю, что мое решение (первое) гораздо эффективнее второго, потому что объединение будет потреблять память сравнительно.
Пожалуйста, предложите мне, что лучше и эффективнее, еслиEmployee table
достаточно большой.Что лучше для меня? причина
РЕДАКТИРОВАТЬ: Я проверил, что небольшая таблица состоит из 7 строк, и оба решения занимают одно и то же время.
mysql> CALL delete_employee(4);
Query OK, 1 row affected (0.09 sec)
Я знаю, что функция SQL ведет себя недетерминированно, потому что таблица эвристическая. Какой выбор лучше? Либо, если у вас есть представление о том, как можно оптимизировать запрос.