Size: a a a

SqlCom.ru - Стиль жизни SQL

2021 February 03

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Anton Kartsev AlarmCRM.ru
Коллеги добрый день.
Достался запрос. Запрос выполняется 5 секунд mysql 5.4.
Основная проблема в:
GROUP BY и ORDER BY
Какие индексы нужно создать и помогут ли они?

Сам запрос
SELECT
   products.product_id, products.url, products.category_id, products.brand_id, products.model, products.description, products.body, products.hit, products.show_menu, products.order_num, products.small_image, products.large_image, DATE_FORMAT(products.created_at, '%Y-%m-%d') as created, DATE_FORMAT(products.updated_at, '%Y-%m-%d') as  modified, products.enabled, products.pricelist_comment as pricedescr, products.pre_order_days, products.rating, products.votes, products.header,
   brands.name as brand, brands.url as brand_url,
   categories.single_name as category, categories.name as category_name, categories.url as category_url, categories.image as category_image,
   pv.price,
   pv.variant_id,
   pv.stock,
   pv.sku,
   pv.old_price,
   pi.price as install_price,
   pi.install_id as install_id,
   pi.city_id as install_city_id,
   pi.ot as install_ot,
   pi.type as install_type,
   media.name as media_image,
   media.id as media_id
FROM products
        LEFT JOIN categories ON categories.category_id = products.category_id
        LEFT JOIN brands ON products.brand_id = brands.brand_id
        LEFT JOIN products_categories ON products.product_id = products_categories.product_id
        LEFT JOIN products_variants as pv ON products.product_id = pv.product_id
        LEFT JOIN products_installs as pi ON products.product_id = pi.product_id
        LEFT JOIN media ON products.product_id = model_id AND model_type = 'App\\Models\\Catalog\\Product' AND media.collection_name = 'main_image'
WHERE
       categories.enabled = 1
 AND products.enabled = 1
 AND (pv.city_id = 0 OR pv.city_id = 0 OR pv.city_id IS NULL) AND
   (pi.city_id = 0 OR pi.city_id = 0 OR pi.city_id IS NULL)
 AND ( (categories.category_id in(149) ) OR (products_categories.category_id in(149) ) )
GROUP BY products.product_id
ORDER BY
   CASE WHEN pv.stock = 0 AND products.pre_order_days = 0 THEN 1 ELSE 0 END,
   CASE WHEN (pv.price = 0 OR pv.price IS NULL) AND pi.price = 0 THEN 1 ELSE 0 END, products.order_num
LIMIT 0, 24;
В общем-то тут видно, что ты не умеешь писать OUTER JOIN , я предлагаю тебе сначала с ними разобраться  и написать запрос верно. Затем уже будешь разбираться с проблемами его производительности, которые могут и уйти (потому что запрос будет другой)
источник

MC

Makha Cloud in SqlCom.ru - Стиль жизни SQL
Какие альтернативы есть оконной функции? Нужно столбчик перемножить на максимальное значение из этого столбца
источник

YS

Yaroslav Schekin in SqlCom.ru - Стиль жизни SQL
Makha Cloud
Какие альтернативы есть оконной функции? Нужно столбчик перемножить на максимальное значение из этого столбца
Вложенные запросы, подзапросы, JOIN-ы...
источник

VK

Vladimir Kolyada in SqlCom.ru - Стиль жизни SQL
выбрать значение в переменную и перемножить, миллион вариантов.
источник

MC

Makha Cloud in SqlCom.ru - Стиль жизни SQL
Vladimir Kolyada
выбрать значение в переменную и перемножить, миллион вариантов.
Парочку можете накидать?
источник

MC

Makha Cloud in SqlCom.ru - Стиль жизни SQL
Yaroslav Schekin
Вложенные запросы, подзапросы, JOIN-ы...
Джойнить правым?
источник

YS

Yaroslav Schekin in SqlCom.ru - Стиль жизни SQL
Makha Cloud
Джойнить правым?
Причём тут "правый"? Я-то запроса не видел.
Если только по Вашему описанию, разве чего-то вроде:
SELECT field1 * (SELECT MAX(x.field1) FROM a_table AS x), ...
 FROM a_table
...
недостаточно?
источник

MC

Makha Cloud in SqlCom.ru - Стиль жизни SQL
Yaroslav Schekin
Причём тут "правый"? Я-то запроса не видел.
Если только по Вашему описанию, разве чего-то вроде:
SELECT field1 * (SELECT MAX(x.field1) FROM a_table AS x), ...
 FROM a_table
...
недостаточно?
Благодарю
источник
2021 February 04

И

Илья in SqlCom.ru - Стиль жизни SQL
Коллеги, вопрос, как в MS SQL посмотреть: в оракле делается так -  select * from v$session , в постгресе - так  SELECT * FROM pg_stat_activity;
источник

И

Илья in SqlCom.ru - Стиль жизни SQL
Спасибо)))
SELECT * FROM sys.dm_exec_sessions
источник

M

Max in SqlCom.ru - Стиль жизни SQL
Илья
Спасибо)))
SELECT * FROM sys.dm_exec_sessions
sp_who2 из коробки, sp_whoisactive тут https://github.com/amachanic/sp_whoisactive
источник

И

Илья in SqlCom.ru - Стиль жизни SQL
Благодарю)
источник

D

Dzmitry in SqlCom.ru - Стиль жизни SQL
Дайте совет какие счётчики мониторинга SQL сервер критичны для отслеживания
источник

O

Oleg T in SqlCom.ru - Стиль жизни SQL
Dzmitry
Дайте совет какие счётчики мониторинга SQL сервер критичны для отслеживания
источник

O

Oleg T in SqlCom.ru - Стиль жизни SQL
Dzmitry
Дайте совет какие счётчики мониторинга SQL сервер критичны для отслеживания
Я бы советовал начать с Lazy Writes/sec, Memory grants pending  (оба в норме = 0) и поняв что они они значат уже дальше посмотреть какие счётчики связаны и помогут понять причины отклонений.
источник

II

Igor Ivakhin in SqlCom.ru - Стиль жизни SQL
Всем привет, глупый вопрос, но все же, напомните плз как обратится к временной таблице из другого окна(например окно зависло и не хочется заново наполнять ее)
Select * from tempdb.dbo.полное название не арбайтн
источник

II

Igor Ivakhin in SqlCom.ru - Стиль жизни SQL
Я точно это как то делал
источник

G

Gopneg in SqlCom.ru - Стиль жизни SQL
если она глобальная временная таблица, то просто по имени ##tablename
а если не глобальная, то чот я не уверен что можно, а гуглить лень
источник

II

Igor Ivakhin in SqlCom.ru - Стиль жизни SQL
Не глобальная, временная, но я как то делал это...
источник

O

Oleg T in SqlCom.ru - Стиль жизни SQL
Igor Ivakhin
Не глобальная, временная, но я как то делал это...
Это нельзя сделать нормальными средствами. Так задумано. Иначе конец изоляции. Brent Ozar показывал как можно по косвенным признакам получить данные из временной таблицы другой сессии - через статистику на этой таблице, но это так себе данные.
источник