Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по оптимизации запроса / 6 сообщений из 6, страница 1 из 1
22.05.2017, 12:35
    #39457243
MBlack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оптимизации запроса
Здорова товарищи, вопрос в следующем, сразу говорю не бейте сильно

Есть таблицы две

1. я содержит детали заказа
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
CREATE GENERATOR GEN_ORDERSDETAILS_ID;

CREATE TABLE ORDERSDETAILS (
    ID                 DINT_NOT_NULL NOT NULL /* DINT_NOT_NULL = INTEGER NOT NULL */,
    ORDID              DINT_NOT_NULL /* DINT_NOT_NULL = INTEGER NOT NULL */,
    PRODUCTID          DINT_NOT_NULL /* DINT_NOT_NULL = INTEGER NOT NULL */,
    QUANTITY           SMALLINT,
    UNITPRICE          DMONEY /* DMONEY = DECIMAL(15,2) */,
    DISCOUNT           DINT_NULL /* DINT_NULL = INTEGER */,
    TAKCIYA            SMALLINT DEFAULT 0,
    MOREINFOITEM       DVARCHAR /* DVARCHAR = VARCHAR(250) */,
    CURRMINFOMOREITEM  DMONEY DEFAULT 0 /* DMONEY = DECIMAL(15,2) */,
    TPRODUCT           SMALLINT DEFAULT 1,
    RESTITEM           SMALLINT DEFAULT 0
);

/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE ORDERSDETAILS ADD CONSTRAINT PK_ORDERSDETAILS PRIMARY KEY (ID);


/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/

ALTER TABLE ORDERSDETAILS ADD CONSTRAINT FK_ORDERSDETAILS_1 FOREIGN KEY (ORDID) REFERENCES ORDERS (ID) ON UPDATE CASCADE;
ALTER TABLE ORDERSDETAILS ADD CONSTRAINT FK_ORDERSDETAILS_2 FOREIGN KEY (PRODUCTID) REFERENCES PRODUCTS (ID) ON DELETE CASCADE ON UPDATE CASCADE;


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX ORDERSDETAILS_IDX1 ON ORDERSDETAILS (QUANTITY);
CREATE INDEX ORDERSDETAILS_IDX2 ON ORDERSDETAILS (UNITPRICE);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;

/* Trigger: ORDERSDETAILS_BI */
CREATE OR ALTER TRIGGER ORDERSDETAILS_BI FOR ORDERSDETAILS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_ordersdetails_id,1);
end
^



2- я таблица, продукты
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
CREATE GENERATOR GEN_PRODUCTS_ID;

CREATE TABLE PRODUCTS (
    ID           DINT_NOT_NULL NOT NULL /* DINT_NOT_NULL = INTEGER NOT NULL */,
    ID_FAC       DINT_NULL DEFAULT 0 /* DINT_NULL = INTEGER */,
    ID_CAT       DINT_NOT_NULL /* DINT_NOT_NULL = INTEGER NOT NULL */,
    PRODUCTNAME  DVCHAR_AVERAGE /* DVCHAR_AVERAGE = VARCHAR(150) */,
    UNITPRICE    DMONEY /* DMONEY = DECIMAL(15,2) */,
    DESCPROD     BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    UNITDIMEN    VARCHAR(5),
    QUANTSG      DINT_NULL /* DINT_NULL = INTEGER */,
    AKCIYA       SMALLINT DEFAULT 2
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE PRODUCTS ADD CONSTRAINT PK_PRODUCTS PRIMARY KEY (ID);


/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/

ALTER TABLE PRODUCTS ADD CONSTRAINT FK_PRODUCTS_1 FOREIGN KEY (ID_CAT) REFERENCES CATEGORIES (ID) ON DELETE CASCADE ON UPDATE CASCADE;


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX PRODUCTS_IDX1 ON PRODUCTS (ID_FAC);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



/* Trigger: PRODUCTS_BD0 */
CREATE OR ALTER TRIGGER PRODUCTS_BD0 FOR PRODUCTS
ACTIVE BEFORE DELETE POSITION 0
AS
declare variable cRec integer;
begin
  /* Trigger text */
  select count(id) from ordersdetails where productid = old.id into :cRec;
  if (:cRec > 0) then exception not_delete_products;
end
^


/* Trigger: PRODUCTS_BI */
CREATE OR ALTER TRIGGER PRODUCTS_BI FOR PRODUCTS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_products_id,1);
end
^


SET TERM ; ^



Делаю запрос следующего характера (хочу узнать какое количество и сколько продано каждого товара)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select r.productid,
             sum(r.quantity) as qty, sum(proiz) as sm
           , r.productname
from (
    select od.productid,
             od.quantity, (od.quantity*od.unitprice) as proiz, p.productname
              from ordersdetails od join products p on od.productid = p.id
) r group by r.productid, r.productname



План запроса следующий

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
PLAN SORT (JOIN (R P NATURAL, R OD INDEX (FK_ORDERSDETAILS_2)))

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 141ms
Среднее время на получение одной записи = 1,02 ms
Current memory = 35 159 776
Max memory = 56 550 940
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 73 696



Вопрос в следующем нормально ли что он выполняется 141ms

В таблице детали заказа, где 36 тыс записей
...
Рейтинг: 0 / 0
22.05.2017, 12:43
    #39457255
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оптимизации запроса
MBlack,

вот так попробуй

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as (
select
  productid,
  sum(quantity) as qty,
  sum(quantity * unitprice) as sm
from ordersdetails
group by productid
)
select
  p.id as productid,
  p.productname as productname,
  t.qty as qty,
  t.sm as sm
from t
join products p on p.id = t.productid
...
Рейтинг: 0 / 0
22.05.2017, 12:48
    #39457262
MBlack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оптимизации запроса
Симонов Денис,

Спасибо, действительно быстро...

А в моем случае, что не так было? Что я сделал не так?
...
Рейтинг: 0 / 0
22.05.2017, 12:52
    #39457265
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оптимизации запроса
MBlack,

у меня ширина сортировки меньше. Ну и возможно план другой (скорее всего группировка с использованием индекса делается)
...
Рейтинг: 0 / 0
22.05.2017, 13:00
    #39457274
AltHasp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оптимизации запроса
MBlack,

статистику по полю productid в студию.
...
Рейтинг: 0 / 0
22.05.2017, 14:39
    #39457389
MBlack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по оптимизации запроса
AltHasp,

Как дать план по полю productid?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по оптимизации запроса / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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