SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.05.2011 14:54:46

NT Man
Участник
Зарегистрирован: 07.06.2008
Сообщений: 16

Еще раз о View

Имеем следующую вьюшку:


DELIMITER $$

CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `sprut_conclusion_last` AS
SELECT
  MAX(`sprut_conclusion_new`.`id_result`) AS `id_result`,
  `sprut_conclusion_new`.`id_sub`  AS `id_sub`,
  `workflow_results`.`id_document` AS `id_document`,
  `workflow_schemes`.`id_stage`    AS `id_stage`,
  `sprut_conclusion_new`.`fio`     AS `fio`
FROM ((`sprut_conclusion_new`
    JOIN `workflow_results`
      ON ((`sprut_conclusion_new`.`id_result` = `workflow_results`.`id_result`)))
   JOIN `workflow_schemes`
     ON ((`workflow_results`.`id_scheme` = `workflow_schemes`.`id_scheme`)))
GROUP BY `workflow_results`.`id_document`,`workflow_results`.`id_scheme`,`sprut_conclusion_new`.`id_sub`$$

DELIMITER ;
 


Прошу обратить внимание на то что ALGORITHM=MERGE

В итоге план вьюхи, выглядит так как будто содержимое вьюхи помещается во временную таблицу, а затем уже по этому содержимому делается WHERE без всяких индексов.

EXPLAIN SELECT * FROM sprut_conclusion_last
   WHERE  id_document = '9208' AND id_stage = 2


http://img101.imageshack.us/img101/1094/mysqlplanview.png

А вот такой план хотелось бы получить (это план если избавиться от вьюхи)

EXPLAIN SELECT
  MAX(sprut_conclusion_new.id_result) AS id_result,
  sprut_conclusion_new.id_sub  AS id_sub,
  workflow_results.id_document AS id_document,
  workflow_schemes.id_stage    AS id_stage,
  sprut_conclusion_new.fio     AS fio
FROM sprut_conclusion_new
   JOIN workflow_results ON sprut_conclusion_new.id_result = workflow_results.id_result
   JOIN workflow_schemes ON workflow_results.id_scheme = workflow_schemes.id_scheme
   WHERE  id_document = '9208' AND id_stage = 2
   GROUP BY workflow_results.id_document,workflow_results.id_scheme,sprut_conclusion_new.id_sub


http://img694.imageshack.us/img694/8515/mysqlplanquery.png

Вопрос почему ALGORITHM=MERGE, работает как TEMPTABLE в моем случае?

Неактивен

 

#2 04.05.2011 01:00:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Еще раз о View

Эм... аналог неверный. Верный аналог — (...) HAVING id_document=9208 AND id_stage=2.

MySQL не может вставить WHERE в текст запроса, т.к. это будет совсем другой, независимый
запрос. Воспользуйтесь хранимыми процедурами.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson