powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по оптимизации запроса
6 сообщений из 6, страница 1 из 1
Вопрос по оптимизации запроса
    #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
Вопрос по оптимизации запроса
    #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
Вопрос по оптимизации запроса
    #39457262
MBlack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

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

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

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

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

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


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