Странная производительность Mysql Query on View - PullRequest
0 голосов
/ 04 мая 2009

У меня есть представление: vcompanyendofday

Следующий запрос выполняется всего за 0,7 с

Select * from vcompanyendofday

Но простое условие условия для этого запроса занимает около 200,0 с

select * from vcompanyendofday where companyid <= 51;

Это определение вида:

 CREATE VIEW `vcompanyendofday` AS 
  select  `c`.`companyid` AS `companyid`,
          `c`.`scripcode` AS `scripcode`,
          `e`.`eoddate` AS `eoddate`,
          `e`.`prevclose` AS `prevclose`,
          `e`.`delqty` AS `delqty` 
  from    (
          `company` `c`
  left join
          `endofday` `e`
  on      ((`c`.`companyid` = `e`.`companyid`)))
  where   (`e`.`eoddate` =
          (
          select  max(`e2`.`eoddate`) AS `max(eoddate)`
          from    `endofday` `e2` 
          where (`e2`.`companyid` = `c`.`companyid`)
          )
  );

Ответы [ 2 ]

1 голос
/ 04 мая 2009

Кажется, у вас нет индекса на endofday.companyid

Когда вы добавляете условие, company становится ведущим в объединении и убивает всю производительность.

Создать индекс для endofday.companyid:

CREATE INDEX ix_endofday_companyid ON endofday(companyid)

Кстати, если вы хотите, чтобы все компании были возвращены, вам нужно поместить подзапрос в предложение ON OUTER JOIN, иначе пропущенные endofday будут отфильтрованы:

CREATE VIEW `vcompanyendofday` AS 
select  `c`.`companyid` AS `companyid`,
        `c`.`scripcode` AS `scripcode`,
        `e`.`eoddate` AS `eoddate`,
        `e`.`prevclose` AS `prevclose`,
        `e`.`delqty` AS `delqty` 
from    (
        `company` `c`
left join
        `endofday` `e`
on      `c`.`companyid` = `e`.`companyid`
        AND `e`.`eoddate` =
        (
        select  max(`e2`.`eoddate`) AS `max(eoddate)`
        from    `endofday` `e2` 
        where (`e2`.`companyid` = `c`.`companyid`)
        )
0 голосов
/ 04 мая 2009

Вы пытались выбрать, использованный для самостоятельного создания представления с предложением WHERE, чтобы увидеть, что происходит?

Если проблема возникает с этим, запустите EXPLAIN для этого запроса, чтобы увидеть, что происходит.

По-видимому, в одной из таблиц отсутствует индекс companyid, скорее всего, на конец дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...