powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / IF EXISTS
26 сообщений из 26, показаны все 2 страниц
IF EXISTS
    #34302685
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возник следующий вопрос:
есть некий кусок кода вида IF EXISTS (бла-бла-бла). Вариантов этого самого бал-бла-бла мне видится 3:
1) SELECT * FROM ...
2) SELECT FIRST 1 * FROM ...
3) SELECT FIRST 1 <FieldName> FROM ... (при условии, что <FieldName> входит в фильты/индексы которые зацепит SELECT)

Собственно вопрос звучит так: есть ли разница между вариантами? Или оптимизатор и так сообразит?
...
Рейтинг: 0 / 0
IF EXISTS
    #34302846
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ФадеевВозник следующий вопрос:
есть некий кусок кода вида IF EXISTS (бла-бла-бла). Вариантов этого самого бал-бла-бла мне видится 3:
1) SELECT * FROM ...
2) SELECT FIRST 1 * FROM ...
3) SELECT FIRST 1 <FieldName> FROM ... (при условии, что <FieldName> входит в фильты/индексы которые зацепит SELECT)

Собственно вопрос звучит так: есть ли разница между вариантами? Или оптимизатор и так сообразит?
imho: в SELECT FIRST 1 * FROM, звездочка лишнее, select first 1 1 from, и возможно в таблицу не пойдем, обойдемся индексом (Key-Only).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
QUERY:
------
select {+explain} first 1 1 from systables where tabid>99

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 5
Estimated # of Rows Returned: 93

  1) informix.systables: INDEX PATH

    (1) Index Keys: tabid   (Key-Only)
        Lower Index Filter: informix.systables.tabid > 99





Еще можно так, если удобнее обязательно возвращать строку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
QUERY:
------
select {+explain} count(*) from table(set{1}) where exists (select 1 from systables where tabid>999)

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 1
Estimated # of Rows Returned: 1

  1) informix.unnamed_tbl_0: COLLECTION SCAN

        Filters: EXISTS <subquery>

    Subquery:
    ---------
    Estimated Cost: 1
    Estimated # of Rows Returned: 1

      1) informix.systables: INDEX PATH

        (1) Index Keys: tabid   (Key-Only)
            Lower Index Filter: informix.systables.tabid > 999


1 или 0
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
QUERY:
------
select {+explain} case count(*) when 0 then 0 else 1 end from table(set{1}) where exists (select 1 from systables where tabid>9)

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 1
Estimated # of Rows Returned: 1

  1) informix.unnamed_tbl_0: COLLECTION SCAN

        Filters: EXISTS <subquery>

    Subquery:
    ---------
    Estimated Cost: 8
    Estimated # of Rows Returned: 165

      1) informix.systables: INDEX PATH

        (1) Index Keys: tabid   (Key-Only)
            Lower Index Filter: informix.systables.tabid > 9
...
Рейтинг: 0 / 0
IF EXISTS
    #34302871
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чуть в сторону (сравнение IN и EXISTS) но есть намеки и на твой вопрос (выделено мной)

=============================
> What could be the difference between IN and EXISTS in an SQL.
> Similarly NOT IN and NOT exists particularly in IDS 9.20.
> Results wise both are same but any inside Info.

They should be equivalent as to results but the EXISTS is generally much
faster. (My experiments show 2 - 10 times faster.) This is because the IN
requires the subquery to run to completion before it can be evaluated but
the EXISTS need only return the first row to satisfy the condition . This
is true of other RDBMS' as well. ( There was a good discussion of this in
the latest [last?] Informix Tech Notes, Vol. 11, Issue 2, pp73, entitled
"Optimizing Informix SQL: Examples and Analysis".)


As for NOT IN vs NOT EXISTS, I haven't tested it but it would seem that
the subquery would have to run to completion in either case and hence
there should not be such a marked difference in query performance.

Thank you,
Lucky Leavell
=============================
Т.е. похоже, что "оптимизатор и так сообразит" , но я бы особо не доверял :)
...
Рейтинг: 0 / 0
IF EXISTS
    #34302940
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде соображает (в смысле соображает не оптимизатор, а где-то позже кто-то соображает что пора останавливаться, в оракл чуть удобнее там в плане фраза stop видна, хотя стоимость естественно тоже дикая показывается):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 > time echo "select first 1 a,count(*) from test_w_blob group by a;"|dbaccess bt 
Database selected.
          a       (count(*))
          1         10000000
1 row(s) retrieved.
Database closed.

real     0m10.610s 
user    0m0.004s
sys     0m0.008s

Код: plaintext
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.
 > time echo "select {+explain} case count(*) when 0 then 0 else 1 end from table(set{1}) 
where exists (select 1 from test_w_blob where a=1);"|dbaccess bt 
Database selected.
(expression)
           1
1 row(s) retrieved.
Database closed.
real     0m0.044s 
user    0m0.008s
sys     0m0.012s

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 1
Estimated # of Rows Returned: 1

  1) informix.unnamed_tbl_0: COLLECTION SCAN

        Filters: EXISTS <subquery>

    Subquery:
    ---------
    Estimated Cost: 339683
    Estimated # of Rows Returned: 1000000

      1) informix.test_w_blob: SEQUENTIAL SCAN

            Filters: informix.test_w_blob.a = 1

...
Рейтинг: 0 / 0
IF EXISTS
    #34303142
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilisпохоже, что "оптимизатор и так сообразит" , но я бы особо не доверял :)Вот я и не доверяю :))
Но проверить сложно, решил спросить у тех кто в теме.

Журавлев Денисвроде соображает (в смысле соображает не оптимизатор, а где-то позже кто-то соображает что пора останавливатьсяА позже-то где? Правда я под оптимизатором в данном контексте понимаю всю машину исполнения (а не только ту часть, которая план строит), то есть весьма широко :)
...
Рейтинг: 0 / 0
IF EXISTS
    #34303166
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ФадеевА позже-то где? Правда я под оптимизатором в данном контексте понимаю всю машину исполнения (а не только ту часть, которая план строит), то есть весьма широко :)Прошу прощения, я видимо неправильно понял изначальный вопрос.
...
Рейтинг: 0 / 0
IF EXISTS
    #34303357
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще вот какой моент мне не очень понятен (хотя, возможно, я не слишком силен читать информиксовый explain)

Журавлев Денис
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
QUERY:
------
select {+explain} first 1 1 from systables where tabid>99

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 5
Estimated # of Rows Returned: 93

  1) informix.systables: INDEX PATH

    (1) Index Keys: tabid   (Key-Only)
        Lower Index Filter: informix.systables.tabid > 99





Еще можно так, если удобнее обязательно возвращать строку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
QUERY:
------
select {+explain} count(*) from table(set{1}) where exists (select 1 from systables where tabid>999)

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 1
Estimated # of Rows Returned: 1

  1) informix.unnamed_tbl_0: COLLECTION SCAN

        Filters: EXISTS <subquery>

    Subquery:
    ---------
    Estimated Cost: 1
    Estimated # of Rows Returned: 1

      1) informix.systables: INDEX PATH

        (1) Index Keys: tabid   (Key-Only)
            Lower Index Filter: informix.systables.tabid > 999

Почему в первом случае Estimated Cost: 5, а во втором 1?
...
Рейтинг: 0 / 0
IF EXISTS
    #34303438
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ФадеевПочему в первом случае Estimated Cost: 5, а во втором 1?А, понял. У него Estimated # of Rows Returned разный (как-то не заметил это сразу)...
...
Рейтинг: 0 / 0
IF EXISTS
    #34303610
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Фадеев Евгений ФадеевПочему в первом случае Estimated Cost: 5, а во втором 1?А, понял. У него Estimated # of Rows Returned разный (как-то не заметил это сразу)...Запрос разный where tabid>99, tabid>999.
...
Рейтинг: 0 / 0
IF EXISTS
    #34303618
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оптимизатор не видит first и не понимает что нужна 1-я строка, поэтому для 100-й гарантии стоит писать first_rows.

select {+first_rows} first 1 1 from systables where tabid>99

select count(*) from table(set{1}) where exists (select {+first_rows} 1 from systables where tabid>999)
...
Рейтинг: 0 / 0
IF EXISTS
    #34305919
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
QUERY:
------
select {+explain} case count(*) when 0 then 0 else 1 end from table(set{1}) where exists (select * from systables where tabid>9)

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 1
Estimated # of Rows Returned: 1

  1) informix.unnamed_tbl_0: COLLECTION SCAN

        Filters: EXISTS <subquery>

    Subquery:
    ---------
    Estimated Cost: 17
    Estimated # of Rows Returned: 165

      1) informix.systables: SEQUENTIAL SCAN

            Filters: informix.systables.tabid > 9


мда 1(единичка) лучше *
...
Рейтинг: 0 / 0
IF EXISTS
    #34305924
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис....
select count(*) from table(set{1}) where exists (select {+first_rows} 1 from systables where tabid>999)

FIRST_ROWS Optimization goal directive only allowed in top-level query.

select {+first_rows} count(*) from table(set{1}) where exists (select 1 from systables where tabid>999)
...
Рейтинг: 0 / 0
IF EXISTS
    #34316233
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис Журавлев Денис....
select count(*) from table(set{1}) where exists (select {+first_rows} 1 from systables where tabid>999)

FIRST_ROWS Optimization goal directive only allowed in top-level query.

select {+first_rows} count(*) from table(set{1}) where exists (select 1 from systables where tabid>999)Уф! Я окончательно потерялся! :))

Давайте я попробую задать вопрос еще раз (с учетом уже полученной информации)? Итак, есть два запроса (точнее два куска кода):

1) IF EXISTS (SELECT * FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
2) IF EXISTS (SELECT FIRST 1 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF;

Будет ли разница в скорости их выполнения (при условии, что <Table> достаточно "длинная", скажем несколько млн. записей)?
...
Рейтинг: 0 / 0
IF EXISTS
    #34316311
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Фадеев...
1) IF EXISTS (SELECT * FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
2) IF EXISTS (SELECT FIRST 1 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
...это spl или абстракция?

1. запрос может вернуть 200 полей и миллион строк, а если ваше приложение захочет отфетчить все?

2. второй запрос вернет или ноль или одну строку, причем одно поле, и если WHERE <Condition> попадает в индекс то в таблицу вообще не пойдем, т.е. стоимость будет 1...6(7). Просто спуск по btree индексу.
Но для увеличения вероятности прохода по индексу рекомендую SELECT {+first_rows} FIRST 1 1 ....
Но такой код (FIRST) не работает в spl.


В общем второй вариант имеет меньший cost
...
Рейтинг: 0 / 0
IF EXISTS
    #34316374
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис Евгений Фадеев...
1) IF EXISTS (SELECT * FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
2) IF EXISTS (SELECT FIRST 1 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
...это spl или абстракция?

1. запрос может вернуть 200 полей и миллион строк, а если ваше приложение захочет отфетчить все?

2. второй запрос вернет или ноль или одну строку, причем одно поле, и если WHERE <Condition> попадает в индекс то в таблицу вообще не пойдем, т.е. стоимость будет 1...6(7). Просто спуск по btree индексу.
Но для увеличения вероятности прохода по индексу рекомендую SELECT {+first_rows} FIRST 1 1 ....
Но такой код (FIRST) не работает в spl.


В общем второй вариант имеет меньший costЭто SPL (я поэтому и поправился про два куска кода). Про индексы я специально не упомянул (так как есть оба варианта - индексы покрывают/не покрывают <Condition>). Ну и разумеется это чуть упрощенный пример (то есть в реальности <Table> это не одна таблица, а несколько и <Condition> это не только фильтры, но и связки), но суть не меняется.
...
Рейтинг: 0 / 0
IF EXISTS
    #34316614
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ФадеевЭто SPL (я поэтому и поправился про два куска кода). Про индексы я специально не упомянул (так как есть оба варианта - индексы покрывают/не покрывают <Condition>). Ну и разумеется это чуть упрощенный пример (то есть в реальности <Table> это не одна таблица, а несколько и <Condition> это не только фильтры, но и связки), но суть не меняется.
тогда 1-й вариант, сколько миллионов строк не важно, работать будет до 1-й.
Но я бы писал IF EXISTS (SELECT 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
из эстетических соображений.
...
Рейтинг: 0 / 0
IF EXISTS
    #34316694
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1-ка лучше

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
drop PROCEDURE test();
create PROCEDURE test();
IF EXISTS (select * from systables where tabid> 9 ) THEN insert into  test_w_blob(a) values ( 1 ); END IF;
END PROCEDURE;

drop PROCEDURE test1();
create PROCEDURE test1();
IF EXISTS (select  1  from systables where tabid> 9 ) THEN insert into  test_w_blob(a) values ( 1 ); END IF;
END PROCEDURE;


Код: plaintext
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.
$> echo "set explain on; update statistics for procedure test();"|dbaccess bt
$> echo "set explain on; update statistics for procedure test1();"|dbaccess bt

$> tail -n 150 sqexplain.out

----------
Procedure: informix.test
select x0.tabname ,x0.owner ,x0.partnum ,x0.tabid ,x0.rowsize ,x0.ncols ,x0.nindexes ,x0.nrows 
,x0.created ,x0.version ,x0.tabtype ,x0.locklevel ,x0.npused ,x0.fextsize ,x0.nextsize ,x0.flags ,x0.site 
,x0.dbname ,x0.type_xid ,x0.am_id ,x0.pagesize from "informix".systables x0 where (x0.tabid > 9 )


QUERY:
------


Estimated Cost: 5
Estimated # of Rows Returned: 52

  1) informix.systables: SEQUENTIAL SCAN

        Filters: informix.systables.tabid > 9
.....

Procedure: informix.test1
select 1 from "informix".systables x0 where (x0.tabid > 9 )

QUERY:
------


Estimated Cost: 3
Estimated # of Rows Returned: 52

  1) informix.systables: INDEX PATH

    (1) Index Keys: tabid    (Key-Only) 
        Lower Index Filter: informix.systables.tabid > 9
...
Рейтинг: 0 / 0
IF EXISTS
    #34316759
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денистогда 1-й вариант, сколько миллионов строк не важно, работать будет до 1-й.
Но я бы писал IF EXISTS (SELECT 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
из эстетических соображений.То есть смысла писать FIRST 1 1 - никакого? А можно план для такой (то есть с FIRST) процедурки глянуть? А то у меня нет такой возможности :((
...
Рейтинг: 0 / 0
IF EXISTS
    #34316781
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ФадеевТо есть смысла писать FIRST 1 1 - никакого? А можно план для такой (то есть с FIRST) процедурки глянуть? охохоо, я же выше написал что использовать first в spl нельзя (Но такой код (FIRST) не работает в spl.).


Код: plaintext
1.
2.
3.
4.
create PROCEDURE testt();
IF EXISTS (select first  1   1    from systables where tabid> 9 ) THEN insert into  test_w_blob(a) values ( 1 ); END IF;
END PROCEDURE;

  944 : Cannot use "first", "limit" or "skip" in this context.


Евгений Фадеев
А то у меня нет такой возможности :((Что так? Нет доступа к файлам продакшина? И тестовый сервак собрать нельзя?
...
Рейтинг: 0 / 0
IF EXISTS
    #34316834
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и смысла нет никакого, проверил:

Код: plaintext
1.
2.
3.
4.
drop PROCEDURE test();
create PROCEDURE test();
IF EXISTS (select * from test_w_blob) THEN insert into  test_w_blob(a) values ( 1 ); END IF;
END PROCEDURE;


Код: plaintext
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.
> echo "set explain on; update statistics for procedure test();"|dbaccess bt

> tail -n 50 sqexplain.out
Procedure: informix.test
select x0.a from "informix".test_w_blob x0

QUERY:
------


Estimated Cost:  339683 
Estimated # of Rows Returned: 10000000

  1) informix.test_w_blob: SEQUENTIAL SCAN


> time echo "execute procedure test();"|dbaccess bt

Routine executed.

real     0m0.034s 
user    0m0.008s
sys     0m0.008s


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

Код: plaintext
1.
2.
3.
4.
drop PROCEDURE test();
create PROCEDURE test();
IF EXISTS (select * from test_w_blob) THEN insert into  test_w_blob(a) values ( 1 ); END IF;
END PROCEDURE;


Код: plaintext
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.
> echo "set explain on; update statistics for procedure test();"|dbaccess bt

> tail -n 50 sqexplain.out
Procedure: informix.test
select x0.a from "informix".test_w_blob x0

QUERY:
------


Estimated Cost:  339683 
Estimated # of Rows Returned: 10000000

  1) informix.test_w_blob: SEQUENTIAL SCAN


> time echo "execute procedure test();"|dbaccess bt

Routine executed.

real     0m0.034s 
user    0m0.008s
sys     0m0.008s


Ок, спасибо. Вопрос закрыт.
...
Рейтинг: 0 / 0
IF EXISTS
    #34317309
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но что забавно - код с FIRST у меня вполне себе компилируется и работает :). Как-то я сразу это не обозначил...
...
Рейтинг: 0 / 0
IF EXISTS
    #34317793
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ФадеевНо что забавно - код с FIRST у меня вполне себе компилируется и работает :). Как-то я сразу это не обозначил...версия какая информикса?
...
Рейтинг: 0 / 0
IF EXISTS
    #34317955
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
IF EXISTS
    #34318304
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис Евгений ФадеевНо что забавно - код с FIRST у меня вполне себе компилируется и работает :). Как-то я сразу это не обозначил...версия какая информикса?9.40.FC7
...
Рейтинг: 0 / 0
IF EXISTS
    #34318589
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Фадеев9.40.FC7У меня постарее видимо: 10.00.UC3
Похоже теперь добавили такую фичу: In SPL routines, the value that follows the SKIP keyword (or the FIRST keyword) can also be a local variable, rather than a literal integer.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Informix [игнор отключен] [закрыт для гостей] / IF EXISTS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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