Обновить таблицу, если данные из других таблиц не совпадают - PullRequest
1 голос
/ 30 августа 2011

Определение обеих таблиц (это просто пример, я не могу объединить таблицы, нет):

CREATE TABLE `MyTable`(
  `id` int NOT NULL,
  `a` varchar(10) NOT NULL, 
  `b`  varchar(10) NOT NULL,
  `state` tinyint NOT NULL,
  PRIMARY KEY (`id`)
);

Цель: обновить записи MyTable1, у которых нет общего значения, с "a" ИЛИ b "из MyTable2.

Мое решение:

update MyTable1 as t1 
  inner join MyTable2 as t2 on (t1.a != t2.a and t1.b != t2.b) 
set t1.state=3;

Я в основном объединяю таблицы, в которых нет совпадающих столбцов, чтобы я мог обновлять состояние таких записей.

Моя проблема: это медленно. Это заняло 6 секунд с 5000 записей в MyTable1 и 3000 записей в MyTable2.

Вопрос: Может ли это быть немного быстрее (если ваше решение пойдет намного быстрее, я тоже его приму;)?

РЕДАКТИРОВАТЬ: мое "решение" на самом деле не работает вообще.

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Ваше объединение может найти тонну совпадений в строке.Это может сделать соединение действительно дорогим.Попробуйте вместо not exists:

update  MyTable1 as t1
set     t1.state = 3
where   not exists
        (
        select  *
        from    MyTable2 as t2 
        where   t1.a = t2.a 
                or t1.b = t2.b
        )

или даже двойной подзапрос:

where   not exists
        (
        select  *
        from    MyTable2 as t2 
        where   t1.a = t2.a 
        )
        and not exists
        (
        select  *
        from    MyTable2 as t2 
        where   t1.b = t2.b
        )
0 голосов
/ 31 августа 2011

Это может быть быстрее:

UPDATE table1 t1 SET t1.state = 3
WHERE t1.id IN
  (SELECT s.id FROM 
     (SELECT T2.id FROM Table1 t2
      LEFT JOIN table2 t3 ON (t2.a = t3.a AND t2.b = t3.b)
      WHERE T3.ID IS NULL
     ) s
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...