Извините - еще раз про открытые и кэшированные

andreymx
Дата: 31.05.2006 09:42:52
Читал и дядю Тома, и Natalku Roshak, и ответы на мои предыдущие вопросы. Но нужных ответов так и не нашёл
Пример:
--Малельнкая процедурка:
CREATE OR REPLACE PROCEDURE proc_t IS
a NUMBER;
BEGIN
a := 1;
INSERT INTO PROBA1 VALUES(a);
a := 2;
INSERT INTO PROBA1 VALUES(a);
END proc_t;
Вызываем ее в SQL+
SQL*Plus: Release 8.1.7.0.0 - Production on Ñð. Òðâ 31 08:36:01 2006

(c) Copyright 2000 Oracle Corporation.  All rights reserved.


Connected to:
Oracle8i Enterprise Edition Release 8.1.7.2.0 - Production
With the Partitioning option
JServer Release 8.1.7.2.0 - Production

SQL> begin
  2  proc_t();
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select * from v$open_cursor where sid=(select sid from v$mystat where rownum=1)
  2  ;

SADDR           SID USER_NAME                      ADDRESS  HASH_VALUE
-------- ---------- ------------------------------ -------- ----------
SQL_TEXT
------------------------------------------------------------
800E3A34         32 BUX                            82EFAB6C 2273624951
select * from v$open_cursor where sid=(select sid from v$mys

800E3A34         32 BUX                            82F30024 2747761965
INSERT INTO PROBA1 VALUES ( :b1  )

800E3A34         32 BUX                            82F30024 2747761965
INSERT INTO PROBA1 VALUES ( :b1  )


SQL> select a.value, b.name 
  2              from v$mystat a, v$statname b 
  3             where a.statistic# = b.statistic#
  4               and a.statistic#= 3;

     VALUE NAME
---------- ----------------------------------------------------------------
         3 opened cursors current
По моему мнению, как минимум 2 курсора не открыты в настоящий момент, а кешированы.
Вопросы:
1. Сколько у меня действительно открытых и сколько кешированных курсоров?
2. Можно ли определить конкретно, какие открытые, какие кешированные:
3. Сколько жрёт ресурсов и каких именно каждый открытый и каждый кешированный курсор?
------------------
Извините, с английским проблемы - читать читаю, вот понимаю с трудом
Дремучччий
Дата: 31.05.2006 10:23:57
Простите мою дремучесть, не могли бы вы пояснить какой смысл вы вкладываете в понятие "кэшированный курсор" и ткнуть носом в доку, где это описано?
andreymx
Дата: 31.05.2006 10:27:55
В доке не знаю где, но одна статья здесь
Кудрявцев Леонид
Дата: 31.05.2006 10:42:40
andreymx
По моему мнению, как минимум 2 курсора не открыты в настоящий момент....


Так в твоей статье и написано:

Frustratingly for developers, the session statistic 'currently open cursors' can include some cursors that the application has closed....
mcureenab
Дата: 31.05.2006 10:52:00
Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде.

Курсор объявленый оператором

CURSOR <s> IS ... SELECT

это не есть непосредственно курсор СУБД, но есть промежуточный объект, который оператором
OPEN <s>

отображается на курсор СУБД кэшированный в курсорном пуле PL/SQL машины, и отвязывается от курсора СУБД оператором

CLOSE <s>.

Курсоры с DML операторами открываются и закрываются неявно.

При этом курсор СУБД может оставаться открытым в PL/SQL пуле и сохранять разобраный в нём SQL запрос для повторного выполнения либо может быть использован для разбора другого SQL запроса.

На SQL запросы тоже распространяется правило оформления повторяющихся кусков кода в процедуры. Чтобы не открывать в СУБД однотипные курсоры не повторяй их в тексте PL/SQL, инкапсулируй их в процедуру. Например так:


CREATE OR REPLACE PROCEDURE proc_t IS
a NUMBER;
procedure ins
is
begin
    INSERT INTO PROBA1 VALUES(a);
end ins;
BEGIN
a := 1; ins;
a := 2; ins;
END proc_t;
andreymx
Дата: 31.05.2006 11:01:20
mcureenab
Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде
То есть все курсоры в v$open_cursor действительно являются открытыми?
mcureenab
Дата: 31.05.2006 11:07:23
andreymx
mcureenab
Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде
То есть все курсоры в v$open_cursor действительно являются открытыми?


Да.
Можешь посмотреть Trace. СУБД сбрасывает в Trace статистику выполнения курсора, когда он закрывается или в нём происходит разбор нового SQL запроса.
Ещё обрати внимание на номера курсоров. У каждого курсора свой номер, хотя SQL запросы в нём могут меняться.
Дремучччий
Дата: 31.05.2006 11:24:15
автор
Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде.

Курсор объявленый оператором

CURSOR <s> IS ... SELECT

это не есть непосредственно курсор СУБД, но есть промежуточный объект, который оператором
OPEN <s>

отображается на курсор СУБД кэшированный в курсорном пуле PL/SQL машины, и отвязывается от курсора СУБД оператором

CLOSE <s>.

Курсоры с DML операторами открываются и закрываются неявно.

При этом курсор СУБД может оставаться открытым в PL/SQL пуле и сохранять разобраный в нём SQL запрос для повторного выполнения либо может быть использован для разбора другого SQL запроса.

Вот это я и хотел услышать. Меня смутило, то что автор вопроса видел четкую (а может и не четкую) разницу между "кэшированными" и открытыми курсорами, потому и хотел узнать, какое же понятие он вкладывает в "кэшированные курсоры".
andreymx
Дата: 31.05.2006 11:38:25
Дремучччий
Вот это я и хотел услышать. Меня смутило, то что автор вопроса видел четкую (а может и не четкую) разницу между "кэшированными" и открытыми курсорами, потому и хотел узнать, какое же понятие он вкладывает в "кэшированные курсоры".
автор сам хотел понять разницу
Дремучччий
Дата: 31.05.2006 11:50:16
andreymx
Дремучччий
Вот это я и хотел услышать. Меня смутило, то что автор вопроса видел четкую (а может и не четкую) разницу между "кэшированными" и открытыми курсорами, потому и хотел узнать, какое же понятие он вкладывает в "кэшированные курсоры".
автор сам хотел понять разницу

Да я ж не упрекаю,просто сомнения автора передались и моей дремучей голове и я усомнился в своей дремучести