powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / оптимизируем запрос
25 сообщений из 32, страница 1 из 2
оптимизируем запрос
    #38770613
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите как оптимизировать запрос, количество записей постепенно увеличивается в таблице sdelki около 30000 строк,
"GROUP" около 15 строк, instrument около 600 строк, время выполнения запроса растет, сейчас составляет около 0,5 секунду, запрос используется в расчетах и при построении отчета время уже составляет 30 секунд
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    Select
        "GROUP".id,
        "GROUP".name,
        sum(sdelki.profit) as summa
    From sdelki
        join (instrument
            join "GROUP" on ("GROUP".id = instrument.group_id)
        )on (sdelki.instrument_id = instrument.id)
    where ispolnena_id=2
        and close_datetime>=:OPEN_DATE
        and close_datetime<=:CLOSE_DATE
    group by id, name
    order by name
    into :id, :name, :summa
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770618
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хде DDL таблиц?
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770622
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Код: plsql
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.
/******************************************************************************/
/***               Generated by IBExpert 08.10.2014 16:10:39                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_GROUP_ID;

CREATE TABLE "GROUP" (
    ID       INT32 NOT NULL /* INT32 = INTEGER */,
    NAME     CHAR256 /* CHAR256 = VARCHAR(256) */,
    "NAMES"  CHAR256 /* CHAR256 = VARCHAR(256) */,
    COMMENT  CHAR1024 /* CHAR1024 = VARCHAR(1024) */
);




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

ALTER TABLE "GROUP" ADD CONSTRAINT PK_GROUP PRIMARY KEY (ID);


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


SET TERM ^ ;



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



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


SET TERM ; ^



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/



Код: plsql
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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
/******************************************************************************/
/***               Generated by IBExpert 08.10.2014 16:11:14                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_SDELKI_ID;

CREATE TABLE SDELKI (
    ID                 INT32 NOT NULL /* INT32 = INTEGER */,
    CHET_ID            INT32 NOT NULL /* INT32 = INTEGER */,
    INSTRUMENT_ID      INT32 NOT NULL /* INT32 = INTEGER */,
    OPEN_T_SYSTEM_ID   INT32 NOT NULL /* INT32 = INTEGER */,
    CLOSE_T_SYSTEM_ID  INT32 NOT NULL /* INT32 = INTEGER */,
    TYPE_SDELKI_ID     INT32 NOT NULL /* INT32 = INTEGER */,
    ISPOLNENA_ID       INT32 NOT NULL /* INT32 = INTEGER */,
    OCENKA_ID          INT32 NOT NULL /* INT32 = INTEGER */,
    GRADE_ID           INT32 NOT NULL /* INT32 = INTEGER */,
    USERS_ID           INT32 NOT NULL /* INT32 = INTEGER */,
    OPEN_DATETIME      DATETIMES NOT NULL /* DATETIMES = TIMESTAMP */,
    CLOSE_DATETIME     DATETIMES NOT NULL /* DATETIMES = TIMESTAMP */,
    PRICE_OPEN         "REAL" DEFAULT 0 NOT NULL /* "REAL" = DOUBLE PRECISION */,
    PRICE_CLOSE        "REAL" DEFAULT 0 NOT NULL /* "REAL" = DOUBLE PRECISION */,
    KOLVO              "REAL" DEFAULT 0 NOT NULL /* "REAL" = DOUBLE PRECISION */,
    COMISSION          "REAL" DEFAULT 0 NOT NULL /* "REAL" = DOUBLE PRECISION */,
    STOP_LOSS          "REAL" DEFAULT 0 NOT NULL /* "REAL" = DOUBLE PRECISION */,
    TAKE_PROFIT        "REAL" /* "REAL" = DOUBLE PRECISION */,
    PROFIT             "REAL" DEFAULT 0 NOT NULL /* "REAL" = DOUBLE PRECISION */,
    RISK_PROFIT        "REAL" /* "REAL" = DOUBLE PRECISION */,
    COMMENTS           CHARVAR /* CHARVAR = BLOB SUB_TYPE 1 SEGMENT SIZE 1 */,
    IMG1               BIN /* BIN = BLOB SUB_TYPE -1 SEGMENT SIZE 1 */,
    IMG2               BIN /* BIN = BLOB SUB_TYPE -1 SEGMENT SIZE 1 */,
    IMG3               BIN /* BIN = BLOB SUB_TYPE -1 SEGMENT SIZE 1 */,
    BIN_COMMENT1       BIN /* BIN = BLOB SUB_TYPE -1 SEGMENT SIZE 1 */,
    DEL                BOOL DEFAULT 0 NOT NULL /* BOOL = VARCHAR(1) */
);




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

ALTER TABLE SDELKI ADD CONSTRAINT PK_SDELKI PRIMARY KEY (ID);


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

ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_1 FOREIGN KEY (INSTRUMENT_ID) REFERENCES INSTRUMENT (ID);
ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_2 FOREIGN KEY (TYPE_SDELKI_ID) REFERENCES TYPE_SDELKI (ID);
ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_3 FOREIGN KEY (CHET_ID) REFERENCES CHET (ID);
ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_4 FOREIGN KEY (OPEN_T_SYSTEM_ID) REFERENCES T_SYSTEM (ID);
ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_5 FOREIGN KEY (CLOSE_T_SYSTEM_ID) REFERENCES T_SYSTEM (ID);
ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_6 FOREIGN KEY (OCENKA_ID) REFERENCES OCENKA (ID);
ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_7 FOREIGN KEY (ISPOLNENA_ID) REFERENCES ISPOLNENA (ID);
ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_8 FOREIGN KEY (GRADE_ID) REFERENCES GRADE (ID);
ALTER TABLE SDELKI ADD CONSTRAINT FK_SDELKI_9 FOREIGN KEY (USERS_ID) REFERENCES USERS (ID);


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

CREATE INDEX SDELKI_IDX1 ON SDELKI (OPEN_DATETIME);
CREATE INDEX SDELKI_IDX2 ON SDELKI (CLOSE_DATETIME);
CREATE INDEX SDELKI_IDX3 ON SDELKI (ISPOLNENA_ID);
CREATE INDEX SDELKI_IDX4 ON SDELKI (USERS_ID);
CREATE INDEX SDELKI_IDX5 ON SDELKI (CHET_ID);


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


SET TERM ^ ;



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



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


SET TERM ; ^



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/



Код: plsql
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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
/******************************************************************************/
/***               Generated by IBExpert 08.10.2014 16:11:54                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_INSTRUMENT_ID;

CREATE TABLE INSTRUMENT (
    ID          INT32 NOT NULL /* INT32 = INTEGER */,
    NAME        CHAR64 NOT NULL /* CHAR64 = VARCHAR(64) */,
    "NAMES"     CHAR128 /* CHAR128 = VARCHAR(128) */,
    NAMEL       CHAR128 /* CHAR128 = VARCHAR(128) */,
    COMMENT     CHAR1024 /* CHAR1024 = VARCHAR(1024) */,
    MARKET_ID   INT32 NOT NULL /* INT32 = INTEGER */,
    GROUP_ID    INT32 NOT NULL /* INT32 = INTEGER */,
    BIRJA_ID    INT32 NOT NULL /* INT32 = INTEGER */,
    NVAL_ID     INT32 /* INT32 = INTEGER */,
    GARANT_OB   "REAL" DEFAULT 1 NOT NULL /* "REAL" = DOUBLE PRECISION */,
    LOT_SIZE    "REAL" NOT NULL /* "REAL" = DOUBLE PRECISION */,
    TICK_SIZE   "REAL" NOT NULL /* "REAL" = DOUBLE PRECISION */,
    STOIM_TICK  "REAL" DEFAULT 1 NOT NULL /* "REAL" = DOUBLE PRECISION */,
    DATE_ISP    DATES /* DATES = DATE */,
    DEL         BOOL DEFAULT 0 NOT NULL /* BOOL = VARCHAR(1) */
);




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

ALTER TABLE INSTRUMENT ADD CONSTRAINT PK_INSTRUMENT PRIMARY KEY (ID);


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

ALTER TABLE INSTRUMENT ADD CONSTRAINT FK_INSTRUMENT_3 FOREIGN KEY (MARKET_ID) REFERENCES MARKET (ID);
ALTER TABLE INSTRUMENT ADD CONSTRAINT FK_INSTRUMENT_4 FOREIGN KEY (GROUP_ID) REFERENCES "GROUP" (ID);
ALTER TABLE INSTRUMENT ADD CONSTRAINT FK_INSTRUMENT_5 FOREIGN KEY (BIRJA_ID) REFERENCES BIRJA (ID);
ALTER TABLE INSTRUMENT ADD CONSTRAINT FK_INSTRUMENT_6 FOREIGN KEY (NVAL_ID) REFERENCES VALUTA (ID);


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

CREATE INDEX INSTRUMENT_IDX1 ON INSTRUMENT (MARKET_ID);
CREATE INDEX INSTRUMENT_IDX2 ON INSTRUMENT (BIRJA_ID);


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


SET TERM ^ ;



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



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


SET TERM ; ^



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/

...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770626
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаем... Хде план?

Третий вопрос позднее задам или зададут.
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770630
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Код: plsql
1.
PLAN SORT (SORT (JOIN (SDELKI INDEX (SDELKI_IDX2, FK_SDELKI_7), INSTRUMENT INDEX (PK_INSTRUMENT), GROUP INDEX (PK_GROUP))))
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770635
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

не надо JOINы в скобки заключать. В условии where допиши всем полям имена таблиц. Не фига не понятно что там из чего выбирается. Про DDL. Триггеры на не обязательно было приводить.
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770636
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish, ок... Статистику выполнения запроса и версию сервера?
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770640
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
begin
for
    Select
        "GROUP".id,
        "GROUP".name,
        sum(sdelki.profit) as summa
    From sdelki
        join instrument on (sdelki.instrument_id = instrument.id)
        join "GROUP" on ("GROUP".id = instrument.group_id)
    where sdelki.ispolnena_id=2
        and sdelki.close_datetime>=:OPEN_DATE
        and sdelki.close_datetime<=:CLOSE_DATE
    group by id, name
    order by name
    into :id, :name, :summa
do
  suspend;
end
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770642
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

где статистику выполнения запроса поглядеть?
версия сервера 2.5.2
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770645
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

статистика

------ Performance info ------
Prepare time = 0ms
Execute time = 406ms
Avg fetch time = 58,00 ms
Current memory = 35 260 992
Max memory = 62 659 504
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 285 733
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770647
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WITH T AS (
  SELECT
    INSTRUMENT.GROUP_ID AS GROUP_ID,
    SUM(SDELKI.PROFIT) AS SUMMA
  FROM
    SDELKI
    JOIN INSTRUMENT ON SDELKI.INSTRUMENT_ID = INSTRUMENT.ID
  WHERE SDELKI.ISPOLNENA_ID = 2
    AND SDELKI.CLOSE_DATETIME BETWEEN :OPEN_DATE AND :CLOSE_DATE
  GROUP BY INSTRUMENT.GROUP_ID
)
SELECT
    "GROUP".ID AS ID,
    "GROUP".NAME AS NAME,
    T.SUMMA AS SUMMA
FROM T
JOIN "GROUP" ON "GROUP".ID = T.GROUP_ID
ORDER BY "GROUP".NAME



чуток побыстрее будет (может быть)
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770651
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

быстрее, а еще где оптимизировать можно7

------ Performance info ------
Prepare time = 0ms
Execute time = 219ms
Avg fetch time = 31,29 ms
Current memory = 35 264 712
Max memory = 62 659 504
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 175 952
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770654
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarfishPrepare time = 0ms
Execute time = 406ms
Avg fetch time = 58,00 ms
Это действительно долго?
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770656
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish, в системе предусмотрен "закрытый период"? Если да, то закрытый период можно пересчитывать и складывать в отдельную таблицу в нужно разрезе, а "открытый" период считать на лету, как сделано сейчас.
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770657
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

а зачем?
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770658
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

долго, там таких процедур около 15 штук, они однотипные, а потом на основе их графики строятся в итоге долго. а для одного запроса конечно быстро, я написал процедуру для замера времени в милиисекундах их выполнение в программе
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770665
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

нет расчетов и сохранений по периодам нет, все считается в запросе
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770666
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

какой план мой запрос показывает?
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770668
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfishнет расчетов и сохранений по периодам нет, все считается в запросе
И добавить возможности нет?
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770669
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Код: plsql
1.
PLAN SORT (JOIN (SORT (JOIN (T SDELKI INDEX (SDELKI_IDX2, FK_SDELKI_7), T INSTRUMENT INDEX (PK_INSTRUMENT))), GROUP INDEX (PK_GROUP)))
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770675
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, добавить можно, но там наверно в логику расчетов надо лезти, что то мне кажется придется менять таким подходом весь алгоритм расчета
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770683
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

судя по всему запрос дальше оптимизировать не получится. Можно конечно ещё попробовать память под сортировку больше дать, но не факт что поможет.
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770685
Фотография Garfish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

а как память увеличить?
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770687
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfishтам таких процедур около 15 штук, они однотипные, а потом на основе их графики строятся в итоге долго. а для одного запроса конечно быстро
если постоянно сношать одни и те же данные, которых день ото дня становится больше, то с каждым разом все будет медленнее, как ни ускоряй.
...
Рейтинг: 0 / 0
оптимизируем запрос
    #38770688
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garfish,

firebird.conf параметр TempCacheLimit
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / оптимизируем запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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