2013-02-26 1 views
1
select id,firstname,lastname,email,country,portal,language 
from totaluser 
where userid in 
    (select user from (select user, shipping/NULLIF(goodsvalue,0) as difference 
    from shipment 
    where user in 
     (select user 
     from (select user, count(*) as shipcount 
     from shipment 
      where user in 
      (select user from shipment 
      where status in ('3','5') 
      and createdtime between '2012-01-01' 
      and '2013-02-22' group by user) 
      and status in ('3','5') group by user) 
      as a 
     where status in ('3','5') 
     and shipcount=1)) 
    as b 
    where difference > 2.5); 

Я понимаю, что это очень простой оператор и его мгновение на моем тестовом сервере, однако на моем рабочем сервере требуется бесконечное время. Как мне изменить его, чтобы ускорить его?Как ускорить мой простой запрос sql

+0

Оставшиеся СБД .... –

+1

Множество подзапросов, вероятно, выиграют от хорошо подобранных индексов. Можете ли вы разместить дополнительную информацию о своей производственной БД? –

+0

Как показал Silver Quettier, каковы различия между вашим разработчиком и производственным сервером? Являются ли индексы одинаковыми? Версия сервера SQL и т. Д. ...? – rhughes

ответ

1

Попробуйте этот запрос,

select tu.id, tu.firstname, tu.lastname, tu.email, tu.country, tu.portal, tu.language 
from totaluser tu, 
(select user 
    from shipment 
    where status in ('3','5') 
    and createdtime between '2012-01-01' 
    and '2013-02-22' and status in ('3','5') 
    group by user 
    HAVING count(*) = 1 AND shipping/NULLIF(goodsvalue,0) > 2.5) s 
where tu.userid = s.user; 

Я попытался удалить вложенности подзапросов, которые вы создавали из таблицы отгрузки и создал коллекцию объекта, который присоединяется с таблицей totaluser.

+0

Aye Aye капитан .. – Meherzad

1

Ваш запрос выглядит очень грязным. Если я правильно понимаю, это это делает:

SELECT id,firstname,lastname,email,country,portal,language FROM totaluser LEFT JOIN 
(SELECT user,COUNT(*) AS shipcount FROM shipment 
WHERE 
    createdtime BETWEEN '2012-01-01' AND '2013-02-22' AND 
    status IN ('3','5') AND 
    shipping/NULLIF(goodsvalue,0) > 2.5 
    GROUP BY user) AS condid 
ON totaluser.id=condid.user 
WHERE condid.shipcount = 1; 

(Вы можете использовать this fiddle, чтобы проверить, если я прав)

Я рекомендую вам использовать CREATE INDEX индексировать колонки user на shipment, и в целом создать также индекс для любого другого столбца, включенного в предложение where (id, status и createdtime). Это должно ускорить выбор запросов на больших таблицах (но замедлить записи, поэтому, если приложение интенсивно пишет, вы должны найти компромисс).

 Смежные вопросы

  • Нет связанных вопросов^_^