powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
11 сообщений из 11, страница 1 из 1
Помогите оптимизировать запрос
    #40090315
В таблице БД содержится информация о приходе расходе товаров
Мне нужно получить актуальные остатки по каждому товару, его место хранения и прочее...
Сам запрос нагородил вот такой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT registernomenklatur.IDNomenklatura, 
(SELECT IDGroupNomenklatura AS unit FROM nomenklatura WHERE nomenklatura.IDNomenklatura=registernomenklatur.IDNomenklatura) AS IDGroupNomenklatura,
(SELECT NameNomenklatura FROM nomenklatura WHERE nomenklatura.IDNomenklatura=registernomenklatur.IDNomenklatura) AS NameNomenklatura, 
(SELECT (SELECT IDUnit FROM unit WHERE unit.IDUnit=nomenklatura.IDUnit) AS unit FROM nomenklatura WHERE nomenklatura.IDNomenklatura=registernomenklatur.IDNomenklatura) AS IDUnit, 
(SELECT (SELECT AbbreviatedName FROM unit WHERE unit.IDUnit=nomenklatura.IDUnit) AS unit FROM nomenklatura WHERE nomenklatura.IDNomenklatura=registernomenklatur.IDNomenklatura) AS NameUnit, 
IDlocationstorage,
(SELECT Namelocation FROM locationstorage WHERE IDlocation=IDlocationstorage) AS Namelocation, 
(SELECT LAST_VALUE(Debit) FROM  registernomenklatur AS nom WHERE nom.IDNomenklatura=registernomenklatur.IDNomenklatura AND IDType=1 LIMIT 1) AS Debit,  
SUM(NumberNomenklatura) as TailingsNomenklatura, 
SUM(AmountNomenklatura) as AmountNomenklatura, 
ROUND(SUM(AmountNomenklatura)/SUM(NumberNomenklatura),2) as AveragePrice
FROM  registernomenklatur WHERE IDNomenklatura<>0
GROUP BY IDNomenklatura, IDlocationstorage


Но он очень долго обрабатывает данные около 24-26 сек.
При этом записей в таблице около 37000 и естественно будет увеличиваться
Сам запрос стал тормозить когда добавил конструкцию
Код: sql
1.
(SELECT LAST_VALUE(Debit) FROM  registernomenklatur AS nom WHERE nom.IDNomenklatura=registernomenklatur.IDNomenklatura AND IDType=1 LIMIT 1) AS Debit


Эта конструкция получает счет учета на который был принят последний приход товара.
Можно ли как-то оптимизировать этот запрос?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090382
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия MySQL хоть какая??
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090392
Akina
Версия MySQL хоть какая??


10.1.41-MariaDB
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090412
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создайте fiddle на https://dbfiddle.uk/?rdbms=mariadb_10.3 - структуры таблиц и пример данных (5-10 записей на таблицу, не больше). Воспроизводить этот ужастик (кто только имена придумывал?) как-то не тянет... и проверять в уме тоже.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090454
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090467
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
-- Переработанный запрос
SELECT registernomenklatur.IDNomenklatura,
       nomenklatura.IDGroupNomenklatura AS IDGroupNomenklatura,
       nomenklatura.NameNomenklatura AS NameNomenklatura, 
       unit.IDUnit,
       unit.AbbreviatedName AS NameUnit, 
       registernomenklatur.IDlocationstorage,
       locationstorage.Namelocation,
       nom.Debit,
       SUM(registernomenklatur.NumberNomenklatura) as TailingsNomenklatura, 
       SUM(registernomenklatur.AmountNomenklatura) as AmountNomenklatura,
       ROUND(SUM(registernomenklatur.AmountNomenklatura)/SUM(registernomenklatur.NumberNomenklatura),2) as AveragePrice
FROM registernomenklatur
JOIN nomenklatura ON nomenklatura.IDNomenklatura=registernomenklatur.IDNomenklatura
JOIN unit ON unit.IDUnit=nomenklatura.IDUnit
JOIN locationstorage ON locationstorage.IDlocation=registernomenklatur.IDlocationstorage
JOIN ( SELECT IDNomenklatura,
              LAST_VALUE(Debit) AS Debit
       FROM registernomenklatur
       WHERE IDType=1
       GROUP BY IDNomenklatura ) AS nom  ON nom.IDNomenklatura=registernomenklatur.IDNomenklatura
WHERE registernomenklatur.IDNomenklatura<>0
GROUP BY registernomenklatur.IDNomenklatura, 
         registernomenklatur.IDlocationstorage



fiddle

Проверяйте.

PS. Вот мне в упор не нравится LAST_VALUE - но трогать не стал.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090472
Akina,

Большое спасибо!
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090476
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Георгий Тарарин , в порядке понимания эффекта - выложите EXPLAIN для обоих запросов и время их выполнения на одном и том же реальном наборе данных.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090482
Akina
Георгий Тарарин , в порядке понимания эффекта - выложите EXPLAIN для обоих запросов и время их выполнения на одном и том же реальном наборе данных.


Как правильно это выложить незаню поэтому прикреплю вот так:

Неоптимизированный запрос: Отображение строк 0 - 24 (6204 всего, Запрос занял 25.3797 сек.)


Оптимизированный запрос: Отображение строк 0 - 24 (6188 всего, Запрос занял 0.1583 сек.)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090537
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Георгий Тарарин
Неоптимизированный запрос: Отображение строк 0 - 24 ( 6204 всего , Запрос занял 25.3797 сек.)

Георгий Тарарин
Оптимизированный запрос: Отображение строк 0 - 24 ( 6188 всего , Запрос занял 0.1583 сек.)

Тэк-с... а в чём разница?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #40090545
Akina,

Разница в том, что запрос с JOIN не подтягивает строки в которых в которых к примеру нет места хранения или не указан ИД номенклатуры, бы ли и такие. Но это ошибочные записи и мне их учитывать не надо.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]