Результат отчета - можно ли улучшить SQL? - PullRequest
0 голосов
/ 03 июня 2011

Я создаю отчет о заказе магазинов. SQL-запрос работает как положено.

Он рассчитывает количество заказов из каждого магазина, общую стоимость заказов и нашу комиссию и оставшиеся поля.

Если клиент оплатил наличными при доставке, то в нем отображается поле OutstandingComm Если клиент оплатил картой через Интернет, то в нем отображается outstanding_shop поле

SELECT T.ShopID, T.company, O.order_id, count(*) as NumOfOrders, 
       sum(O.shop_remaining) as ShopEarnings, 
       sum(O.comm_grandtotal) as OurComm, 
       SUM(CASE WHEN payment_method = 'PayCash' AND status = 1 THEN O.comm_grandtotal ELSE 0 END) as OutstandingComm,
       SUM(CASE WHEN payment_method = 'PayCard' AND status = 1 THEN O.shop_remaining ELSE 0 END) as outstanding_shop
FROM Shops as T 
      JOIN orders O ON O.ShopID = T.ShopID 
Group by ShopID

Можно ли улучшить этот SQL-запрос или есть альтернативный лучший способ?

Ответы [ 3 ]

1 голос
/ 03 июня 2011

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

  1. case when смотрит на строку (PayCash / PayCard) . Если вы сделаете это поле числом, поместите в него индекс и проверите числовое значение, оно может работать быстрее. Индекс может не привыкнуть, потому что он имеет низкое количество элементов.
  2. Если вы используете InnoDB, попробуйте разместить индекс на shops.company. Таким образом, MySQL может использовать индекс покрытия для shops.company для получения companyname, и ему не нужно выполнять полное чтение таблицы для магазинов таблиц.
  3. Вы можете рассмотреть разбиение таблиц по полю status. Состояние имеет низкое количество элементов, поэтому индекс, вероятно, не будет использоваться, но если вы разбиваете разделы, MySQL будет читать только из версии таблицы status = 1, это следует делать только при наличии lot из status=0 поля.
  4. В настоящее время вы выбираете все транзакций, это маловероятно. Разделите таблицу по году или месяцу и выберите только текущий год или месяц.
  5. Я уверен, что у вас уже есть основные автоинкрементные ключи на shops.shopid.
  6. У вас также должен быть индекс на orders.shopid
1 голос
/ 03 июня 2011

Ваш SQL уже выглядит хорошо. Вы уже делаете все возможное для своего дизайна.

0 голосов
/ 03 июня 2011

Звучит как кофейник из Максвелл Хауса ... до последней капли! ... мне кажется хорошим, однако, рассмотрим предложение WHERE, поскольку данные могут расти в будущем ... могли бы сделать то же самое, отбросив AND на текущем СОЕДИНЕНИИ.

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