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

Собственно вопрос звучит так: есть ли разница между вариантами? Или оптимизатор и так сообразит?
...
Рейтинг: 0 / 0
02.02.2007, 15:51
    #34302846
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Евгений ФадеевВозник следующий вопрос:
есть некий кусок кода вида 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
02.02.2007, 15:57
    #34302871
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
чуть в сторону (сравнение 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
02.02.2007, 16:09
    #34302940
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
вроде соображает (в смысле соображает не оптимизатор, а где-то позже кто-то соображает что пора останавливаться, в оракл чуть удобнее там в плане фраза 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
02.02.2007, 16:55
    #34303142
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
vasilisпохоже, что "оптимизатор и так сообразит" , но я бы особо не доверял :)Вот я и не доверяю :))
Но проверить сложно, решил спросить у тех кто в теме.

Журавлев Денисвроде соображает (в смысле соображает не оптимизатор, а где-то позже кто-то соображает что пора останавливатьсяА позже-то где? Правда я под оптимизатором в данном контексте понимаю всю машину исполнения (а не только ту часть, которая план строит), то есть весьма широко :)
...
Рейтинг: 0 / 0
02.02.2007, 17:03
    #34303166
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Евгений ФадеевА позже-то где? Правда я под оптимизатором в данном контексте понимаю всю машину исполнения (а не только ту часть, которая план строит), то есть весьма широко :)Прошу прощения, я видимо неправильно понял изначальный вопрос.
...
Рейтинг: 0 / 0
02.02.2007, 18:00
    #34303357
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
А еще вот какой моент мне не очень понятен (хотя, возможно, я не слишком силен читать информиксовый 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
02.02.2007, 18:27
    #34303438
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Евгений ФадеевПочему в первом случае Estimated Cost: 5, а во втором 1?А, понял. У него Estimated # of Rows Returned разный (как-то не заметил это сразу)...
...
Рейтинг: 0 / 0
02.02.2007, 20:06
    #34303610
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Евгений Фадеев Евгений ФадеевПочему в первом случае Estimated Cost: 5, а во втором 1?А, понял. У него Estimated # of Rows Returned разный (как-то не заметил это сразу)...Запрос разный where tabid>99, tabid>999.
...
Рейтинг: 0 / 0
02.02.2007, 20:11
    #34303618
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Оптимизатор не видит 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
05.02.2007, 11:58
    #34305919
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Код: 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
05.02.2007, 11:59
    #34305924
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Журавлев Денис....
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
08.02.2007, 15:20
    #34316233
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Журавлев Денис Журавлев Денис....
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
08.02.2007, 15:37
    #34316311
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Евгений Фадеев...
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
08.02.2007, 15:48
    #34316374
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Журавлев Денис Евгений Фадеев...
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
08.02.2007, 16:36
    #34316614
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Евгений ФадеевЭто SPL (я поэтому и поправился про два куска кода). Про индексы я специально не упомянул (так как есть оба варианта - индексы покрывают/не покрывают <Condition>). Ну и разумеется это чуть упрощенный пример (то есть в реальности <Table> это не одна таблица, а несколько и <Condition> это не только фильтры, но и связки), но суть не меняется.
тогда 1-й вариант, сколько миллионов строк не важно, работать будет до 1-й.
Но я бы писал IF EXISTS (SELECT 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
из эстетических соображений.
...
Рейтинг: 0 / 0
08.02.2007, 16:53
    #34316694
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
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
08.02.2007, 17:08
    #34316759
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Журавлев Денистогда 1-й вариант, сколько миллионов строк не важно, работать будет до 1-й.
Но я бы писал IF EXISTS (SELECT 1 FROM <Table> WHERE <Condition>) THEN <Do something> END IF;
из эстетических соображений.То есть смысла писать FIRST 1 1 - никакого? А можно план для такой (то есть с FIRST) процедурки глянуть? А то у меня нет такой возможности :((
...
Рейтинг: 0 / 0
08.02.2007, 17:15
    #34316781
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Евгений ФадеевТо есть смысла писать 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
08.02.2007, 17:29
    #34316834
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
да и смысла нет никакого, проверил:

Код: 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
08.02.2007, 17:31
    #34316845
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Журавлев Денисда и смысла нет никакого, проверил:

Код: 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
08.02.2007, 19:39
    #34317309
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Но что забавно - код с FIRST у меня вполне себе компилируется и работает :). Как-то я сразу это не обозначил...
...
Рейтинг: 0 / 0
09.02.2007, 08:38
    #34317793
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Евгений ФадеевНо что забавно - код с FIRST у меня вполне себе компилируется и работает :). Как-то я сразу это не обозначил...версия какая информикса?
...
Рейтинг: 0 / 0
09.02.2007, 09:54
    #34317955
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
...
Рейтинг: 0 / 0
09.02.2007, 11:23
    #34318304
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS
Журавлев Денис Евгений ФадеевНо что забавно - код с FIRST у меня вполне себе компилируется и работает :). Как-то я сразу это не обозначил...версия какая информикса?9.40.FC7
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / IF EXISTS / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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