Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2015, 10:42   #11
EnMac
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
SELECT a.*,c.DATA,c.Ostatok
  FROM SprTovar a
    LEFT JOIN (
      SELECT S1.KodTov,S1.DATA,S1.Kol AS Ostatok
        FROM Sklad S1
        WHERE S1.KodSklad=0 and S1.DATA<='14.04.2015' AND
              NOT EXISTS(SELECT 0
                           FROM Sklad S2
                           WHERE S2.KodSklad=0 and S2.KodTov=S1.KodTov AND
                                 S2.DATA>S1.DATA AND S2.DATA<='14.04.2015')) c ON c.KodTov=a.KOD
  order by lower(a.Name)
и внимательно на индексы Sklad посмотреть
Эта версия запроса выполняется 50 секунд в sql-утилите.
Индексы по таблице Sklad такие: (KodTov, KodSklad, Data)
EnMac вне форума Ответить с цитированием
Старый 15.04.2015, 12:04   #12
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от EnMac Посмотреть сообщение
А в приложении у меня предполагается загрузка всех записей. (почему? потому что клиент так хочет
А если их будет 10 млн? что даже по дате нельзя ограничить или пагинацию сделать? что за бред?
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 15.04.2015, 13:01   #13
EnMac
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
А если их будет 10 млн? что даже по дате нельзя ограничить или пагинацию сделать? что за бред?
Ну за последние 10 лет записей товаров не превышало 10000.

Использую подсказку Аватара.
В общем, если дату не выбирать, то запрос получается такой.
Код:
select a.*, 
    (SELECT top 1 S.Kol 
       FROM Sklad S 
       WHERE S.KodSklad=0 AND S.KodTov=a.KOD AND S.DATA<='15.04.2015'
       ORDER BY S.DATA DESC) as Ostatok 
  FROM SprTovar a 
  order by lower(a.Name)
В приложении выборка выполняется по времени от 1,00 до 1,20 сек. Что почти приемлемо. В идеале было бы отлично, если бы время занимало не более 0,5сек.

Если выбирать с датой, то запрос получился такой:
Код:
select a.*, 
    (SELECT top 1 S.Kol 
       FROM Sklad S 
       WHERE S.KodSklad=0 AND S.KodTov=a.KOD AND S.DATA<='15.04.2015'
       ORDER BY S.DATA DESC) as Ostatok, 
    (SELECT top 1 S.DATA 
       FROM Sklad S 
       WHERE S.KodSklad=0 AND S.KodTov=a.KOD AND S.DATA<='15.04.2015'
       ORDER BY S.DATA DESC) as DATA 
  FROM SprTovar a 
  order by lower(a.Name)
И время выполнения его в приложении равняется от 2,00 до 2,20 сек.

Нельзя ли в одном подзапросе выбрать и дату и количество? Подскажите, а то не получается.
Если пробовать так:
Код:
select a.*, 
    (SELECT top 1 S.Kol, S.Data 
       FROM Sklad S 
       WHERE S.KodSklad=0 AND S.KodTov=a.KOD AND S.DATA<='15.04.2015'
       ORDER BY S.DATA DESC) 
  FROM SprTovar a 
  order by lower(a.Name)
то пишет ошибку:
poQuery: Error 7200: AQE Error: State = S0000; NativeError = 2166; [iAnywhere Solutions][Advantage SQL Engine]SELECT sub-query returns more than one column.

Последний раз редактировалось Stilet; 15.04.2015 в 15:18.
EnMac вне форума Ответить с цитированием
Старый 15.04.2015, 14:47   #14
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от EnMac Посмотреть сообщение
Ну за последние 10 лет записей товаров не превышало 10000.
Это не меняет сути, писать нужно правильно изначально, должна быть хотя бы пагинация, или что по вашему правильно грузить для отображения сразу 10 тыс записей?
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 15.04.2015, 14:48   #15
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

план смотреть надо
ну и показывать 5000 записей юзеру смысла нет

Последний раз редактировалось lomastr_; 15.04.2015 в 14:57.
lomastr_ вне форума Ответить с цитированием
Старый 15.04.2015, 14:55   #16
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
а так
Код:
select a.*, S.KOL, S.DATA
  FROM SprTovar a 
   left join (SELECT KodTov, MAX(S.DATA) AS DATA 
       FROM Sklad
       WHERE KodSklad=0 AND DATA<='15.04.2015'
       group by KodTov) AS S ON S.KodTov = a.KOD
  order by lower(a.Name)
?

+ план смотреть надо
ну и показывать 5000 записей юзеру смысла нет

так про то и речь... следующий вопрос автора будет в другой ветки как ускорить отрисовку записей в гриде.

Фильтры и пагинатор - это стандарт!
Я часть той силы, что вечно хочет зла, но вечно совершает благо..

Последний раз редактировалось Stanislav; 15.04.2015 в 14:59.
Stanislav вне форума Ответить с цитированием
Старый 15.04.2015, 14:58   #17
EnMac
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
а так
Код:
select a.*, S.KOL, S.DATA
  FROM SprTovar a 
   left join (SELECT KodTov, MAX(S.DATA) AS DATA 
       FROM Sklad
       WHERE KodSklad=0 AND DATA<='15.04.2015'
       group by KodTov) AS S ON S.KodTov = a.KOD
  order by lower(a.Name)
?
Тут S.Kol брать неоткуда.
EnMac вне форума Ответить с цитированием
Старый 15.04.2015, 15:00   #18
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

мой запрос не правильный получился
потом заметил что пишу то что в топике, а удалить забыл, перед отправкой
lomastr_ вне форума Ответить с цитированием
Старый 15.04.2015, 15:02   #19
EnMac
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
так про то и речь... следующий вопрос автора будет в другой ветки как ускорить отрисовку записей в гриде.
Фильтры и пагинатор - это стандарт!
Я не буду задавать следующий вопрос в другой ветке по поводу отрисовки грида.
Я только прошу помочь с улучшением или переделкой SQL-запроса, применимо к текущей ситуации.

Мне важны все мнения, я внимательно все изучаю.
EnMac вне форума Ответить с цитированием
Старый 15.04.2015, 15:07   #20
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

лучше план изучите вашего первого
lomastr_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация запроса russian-stalker SQL, базы данных 1 11.10.2011 13:17
Оптимизация запроса Spyhunter1983 SQL, базы данных 2 05.10.2011 15:24
Оптимизация запроса stalsoft SQL, базы данных 0 05.07.2011 14:51
оптимизация запроса pray_driver SQL, базы данных 3 13.12.2010 15:40
Оптимизация запроса za4ot SQL, базы данных 0 11.06.2010 09:24