Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / оптимизируем запрос / 25 сообщений из 32, страница 1 из 2
08.10.2014, 16:02
    #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
08.10.2014, 16:07
    #38770618
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
Хде DDL таблиц?
...
Рейтинг: 0 / 0
08.10.2014, 16:12
    #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
08.10.2014, 16:13
    #38770626
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
Продолжаем... Хде план?

Третий вопрос позднее задам или зададут.
...
Рейтинг: 0 / 0
08.10.2014, 16:15
    #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
08.10.2014, 16:17
    #38770635
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
Garfish,

не надо JOINы в скобки заключать. В условии where допиши всем полям имена таблиц. Не фига не понятно что там из чего выбирается. Про DDL. Триггеры на не обязательно было приводить.
...
Рейтинг: 0 / 0
08.10.2014, 16:18
    #38770636
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
Garfish, ок... Статистику выполнения запроса и версию сервера?
...
Рейтинг: 0 / 0
08.10.2014, 16:20
    #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
08.10.2014, 16:22
    #38770642
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
wadman,

где статистику выполнения запроса поглядеть?
версия сервера 2.5.2
...
Рейтинг: 0 / 0
08.10.2014, 16:26
    #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
08.10.2014, 16:26
    #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
08.10.2014, 16:27
    #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
08.10.2014, 16:28
    #38770654
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
GarfishPrepare time = 0ms
Execute time = 406ms
Avg fetch time = 58,00 ms
Это действительно долго?
...
Рейтинг: 0 / 0
08.10.2014, 16:30
    #38770656
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
Garfish, в системе предусмотрен "закрытый период"? Если да, то закрытый период можно пересчитывать и складывать в отдельную таблицу в нужно разрезе, а "открытый" период считать на лету, как сделано сейчас.
...
Рейтинг: 0 / 0
08.10.2014, 16:31
    #38770657
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
Garfish,

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

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

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

какой план мой запрос показывает?
...
Рейтинг: 0 / 0
08.10.2014, 16:37
    #38770668
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
Garfishнет расчетов и сохранений по периодам нет, все считается в запросе
И добавить возможности нет?
...
Рейтинг: 0 / 0
08.10.2014, 16:37
    #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
08.10.2014, 16:41
    #38770675
Garfish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
wadman, добавить можно, но там наверно в логику расчетов надо лезти, что то мне кажется придется менять таким подходом весь алгоритм расчета
...
Рейтинг: 0 / 0
08.10.2014, 16:46
    #38770683
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизируем запрос
Garfish,

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

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

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


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