Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Извините - еще раз про открытые и кэшированные  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
Читал и дядю Тома, и 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 май 06, 09:42    [2723550]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Дремучччий
Guest
Простите мою дремучесть, не могли бы вы пояснить какой смысл вы вкладываете в понятие "кэшированный курсор" и ткнуть носом в доку, где это описано?
31 май 06, 10:23    [2723756]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
В доке не знаю где, но одна статья здесь
31 май 06, 10:27    [2723776]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Кудрявцев Леонид
Guest
andreymx
По моему мнению, как минимум 2 курсора не открыты в настоящий момент....


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

Frustratingly for developers, the session statistic 'currently open cursors' can include some cursors that the application has closed....
31 май 06, 10:42    [2723866]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Кэширование курсоров (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;
31 май 06, 10:52    [2723933]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
mcureenab
Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде
То есть все курсоры в v$open_cursor действительно являются открытыми?
31 май 06, 11:01    [2723995]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
andreymx
mcureenab
Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде
То есть все курсоры в v$open_cursor действительно являются открытыми?


Да.
Можешь посмотреть Trace. СУБД сбрасывает в Trace статистику выполнения курсора, когда он закрывается или в нём происходит разбор нового SQL запроса.
Ещё обрати внимание на номера курсоров. У каждого курсора свой номер, хотя SQL запросы в нём могут меняться.
31 май 06, 11:07    [2724033]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Дремучччий
Guest
автор
Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде.

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

CURSOR <s> IS ... SELECT

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

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

CLOSE <s>.

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

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

Вот это я и хотел услышать. Меня смутило, то что автор вопроса видел четкую (а может и не четкую) разницу между "кэшированными" и открытыми курсорами, потому и хотел узнать, какое же понятие он вкладывает в "кэшированные курсоры".
31 май 06, 11:24    [2724189]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
Дремучччий
Вот это я и хотел услышать. Меня смутило, то что автор вопроса видел четкую (а может и не четкую) разницу между "кэшированными" и открытыми курсорами, потому и хотел узнать, какое же понятие он вкладывает в "кэшированные курсоры".
автор сам хотел понять разницу
31 май 06, 11:38    [2724315]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Дремучччий
Guest
andreymx
Дремучччий
Вот это я и хотел услышать. Меня смутило, то что автор вопроса видел четкую (а может и не четкую) разницу между "кэшированными" и открытыми курсорами, потому и хотел узнать, какое же понятие он вкладывает в "кэшированные курсоры".
автор сам хотел понять разницу

Да я ж не упрекаю,просто сомнения автора передались и моей дремучей голове и я усомнился в своей дремучести
31 май 06, 11:50    [2724418]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
вспомнил источник моего заблуждения:
Thom Kyte
Представление V$OPEN_CURSOR
Это представление содержит список открытых курсоров для всех сеансов. Это очень
полезно для выявления "утечек" курсоров и определения, какие именно операторы SQL
выполняются сеансом. Сервер Oracle оставляет курсоры в кэше даже после их явного
закрытия, так что не удивляйтесь, если обнаружите в результатах закрытые курсоры (это
вполне возможно). Например, в том же сеансе SQL*Plus, в котором выше вычислялся
коэффициент Soft Parse Ratio, я обнаружил:

ops$tkyte@ORA8I.WORLD> s e l e c t * from v$open_cursor
2 where s i d = ( s e l e c t s i d from v$mystat where rownum = 1) ;
SADDR SID USER_NAME ADDRESS HASH_VALUE SQL TEXT
/* 13 строк */
13 rows selected.
Как видите, есть некоторое количество открытых курсоров. Однако:
ops$tkyte@ORA8I.WORLD> select * from my_stats where name = 'opened cursors
current';

NAME VALUE
opened cursors current 1

На самом деле открыт один курсор (причем это именно тот курсор, с помощью которого выбирается информация об открытых курсорах). Сервер Oracle держит другие курсоры в кэше на случай повторного выполнения запросов.
Меня сбила с толку фраза "На самом деле открыт один курсор"
31 май 06, 13:53    [2725443]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Maxifly
Member

Откуда:
Сообщений: 522
автор

Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде.



И как заставить эти курсоры закрыться?
31 май 06, 16:43    [2726541]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Maxifly
автор

Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде.
И как заставить эти курсоры закрыться?

SQL> alter session set session_cached_cursors=0;
Но лучше всего, конечно,
SQL> QUIT
31 май 06, 17:33    [2726854]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Александр Соколов
Member

Откуда: Протвино
Сообщений: 1419
Maxifly
автор

Кэширование курсоров (PL/SQL CURSOR POOL) заключается в том, что PL/SQL оставляет открытыми курсоры, которые уже логически закрыты в PL/SQL коде.



И как заставить эти курсоры закрыться?

PL/SQL
В общем случае PL/SQL осуществляет разбор явного курсора только однажды,
когда он открывается в первый раз; и сходным образом только однажды
осуществляет разбор оператора SQL (создавая таким образом неявный
курсор), когда оператор выполняется в первый раз. Все операторы SQL после
разбора кешируются. Оператор SQL разбирается снова, только если он был
выгружен из кеша другим оператором SQL.

Поэтому, хотя перед повторным открытием курсора его необходимо закры-
вать, PL/SQL может не проводить повторный разбор соответствующего опе-
ратора SELECT. Если, например, курсор был закрыт и тут же снова открыт,
очевидно, что повторный разбор не нужен.
31 май 06, 17:36    [2726884]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
а каким запросом можно прочитать текущее значение SESSION_CACHED_CURSORS ?
Что-то ни в v$mystat, ни в v$parameter не нахожу...
1 июн 06, 09:18    [2728190]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
tst> select value from v$parameter where name='session_cached_cursors';

VALUE
--------------------------------------------------------------------------
50

tst> 
1 июн 06, 09:23    [2728208]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
andreymx
а каким запросом можно прочитать текущее значение SESSION_CACHED_CURSORS ?
Что-то ни в v$mystat, ни в v$parameter не нахожу...

Вас подвел uppercase ;)
1 июн 06, 12:14    [2729189]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
вообще-то совсем нет.
SELECT *
FROM v$parameter
WHERE UPPER(NAME) LIKE '%CACHE%'
			 AND 
			UPPER(NAME) LIKE '%SES%'
-- Здесь я конечно увидел VALUE=1
-- но я решил, что недопонимаю что-то
Просто я не понимаю, что делает alter session set session_cached_cursors=0
Это идет сброс курсоров (закрытие тех, которые уже закрыты в Pl/SQL)?
После этого надо ли устанавливать session_cached_cursors в какое-нибудь дефолтное значение?
1 июн 06, 13:24    [2729794]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Александр Соколов
Member

Откуда: Протвино
Сообщений: 1419
andreymx
вообще-то совсем нет.
SELECT *
FROM v$parameter
WHERE UPPER(NAME) LIKE '%CACHE%'
			 AND 
			UPPER(NAME) LIKE '%SES%'
-- Здесь я конечно увидел VALUE=1
-- но я решил, что недопонимаю что-то
Просто я не понимаю, что делает alter session set session_cached_cursors=0
Это идет сброс курсоров (закрытие тех, которые уже закрыты в Pl/SQL)?
После этого надо ли устанавливать session_cached_cursors в какое-нибудь дефолтное значение?

Это разные механизмы и курсоры:
Oracle
Oracle checks the library cache to determine whether more than three parse requests
have been issued on a given statement. If so, then Oracle assumes that the session
cursor associated with the statement should be cached and moves the cursor into the
session cursor cache. Subsequent requests to parse that SQL statement by the same
session then find the cursor in the session cursor cache.
To enable caching of session cursors, you must set the initialization parameter
SESSION_CACHED_CURSORS. The value of this parameter is a positive integer
specifying the maximum number of session cursors kept in the cache. An LRU
algorithm removes entries in the session cursor cache to make room for new entries
when needed.
1 июн 06, 14:36    [2730272]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Аудит немного мешается, но и с ним, в общем, понятно:
SQL> create table ane_test(a number)
  2  /

Table created.

SQL> CREATE OR REPLACE PROCEDURE ane_proc_t IS
  2  a NUMBER;
  3  BEGIN
  4  a := 1;
  5  INSERT INTO ane_test VALUES(a);
  6  a := 2;
  7  INSERT INTO ane_test VALUES(a);
  8  END;
  9  /

Procedure created.

SQL> alter session set session_cached_cursors=10;

Session altered.

SQL> select value from v$parameter p where p.NAME='session_cached_cursors';

VALUE                                                                                                                                                 
------------------------------------------------------------------------------------------------------------------------------------------------------
10                                                                                                                                                    

SQL> exec ane_proc_t;

PL/SQL procedure successfully completed.

SQL> select address, hash_value, sql_text from v$open_cursor where sid=(select sid from v$mystat where rownum=1);

ADDRESS          HASH_VALUE SQL_TEXT                                                                                                                  
---------------- ---------- ------------------------------------------------------------                                                              
0000000438433628 3550085129 INSERT INTO ANE_TEST VALUES(:B1 )                                                                                         
0000000438433628 3550085129 INSERT INTO ANE_TEST VALUES(:B1 )                                                                                         
0000000414DC1FB8 1916292307 SELECT COUNT(*)   FROM WMSYS.WM$UDTRIG_INFO  WHERE TRIG_OWNE                                                              
000000044FE23C18 2890300234 select address, hash_value, sql_text from v$open_cursor wher                                                              
000000041E35AEB0 1215863702 SELECT COUNT(*) FROM USER_POLICIES V WHERE V.OBJECT_NAME = :                                                              
000000041E293808 3850026132 SELECT COUNT(*)   FROM WMSYS.ALL_WM_RIC_INFO  WHERE PT_OWNER                                                              
000000041E2932D8  887809517 SELECT COUNT(*)   FROM WMSYS.WM$UDTRIG_INFO  WHERE TRIG_OWNE                                                              
000000041B50EE58 1600975027 SELECT MINOR_VERSION   FROM SYS.CDC_SYSTEM$                                                                               
000000040EF35678  461321563 insert into sys.aud$( sessionid,entryid,statement,timestamp#                                                              
000000041E36E138 4204610748 SELECT COUNT(*) FROM ALL_POLICIES V WHERE V.OBJECT_OWNER = :                                                              
000000041E293AA0 1760133674 SELECT 1   FROM WMSYS.WM$VERSIONED_TABLES  WHERE OWNER = :b1                                                              
000000040ECB88D8 1539424110 SELECT :b1 + :b2 * DECODE(:b3,'A',10,'B',11,'C',12,'D',13,'E                                                              
000000040ECB88D8 1539424110 SELECT :b1 + :b2 * DECODE(:b3,'A',10,'B',11,'C',12,'D',13,'E                                                              

13 rows selected.

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                                                                                                                                       
---------- ----------------------------------------------------------------                                                                           
        13 opened cursors current                                                                                                                     

SQL> alter session set session_cached_cursors=0;

Session altered.

SQL> exec ane_proc_t;

PL/SQL procedure successfully completed.

SQL> select address, hash_value, sql_text from v$open_cursor where sid=(select sid from v$mystat where rownum=1);

ADDRESS          HASH_VALUE SQL_TEXT                                                                                                                  
---------------- ---------- ------------------------------------------------------------                                                              
000000044FE23C18 2890300234 select address, hash_value, sql_text from v$open_cursor wher                                                              
000000040EF35678  461321563 insert into sys.aud$( sessionid,entryid,statement,timestamp#                                                              
000000040ECB88D8 1539424110 SELECT :b1 + :b2 * DECODE(:b3,'A',10,'B',11,'C',12,'D',13,'E                                                              
000000040ECB88D8 1539424110 SELECT :b1 + :b2 * DECODE(:b3,'A',10,'B',11,'C',12,'D',13,'E                                                              

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                                                                                                                                       
---------- ----------------------------------------------------------------                                                                           
         5 opened cursors current                                                                                                                     
1 июн 06, 14:59    [2730417]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Victor V
Member

Откуда: Kiev
Сообщений: 372
mcureenab
andreymx
То есть все курсоры в v$open_cursor действительно являются открытыми?

Да.

Если верить этой статье - то нет.
В v$open_cursor содержатся не открытые, а кэшированные курсоры.
А кэшируются только закрытые курсоры. Так кто прав?
1 июн 06, 15:57    [2730826]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
для меня сейчас важно понять:
что же такое закрытый курсор?
mcureenab
Курсоры с DML операторами открываются и закрываются неявно.

При этом курсор СУБД может оставаться открытым в PL/SQL пуле и сохранять разобраный в нём SQL запрос для повторного выполнения либо может быть использован для разбора другого SQL запроса.
1 июн 06, 16:28    [2731013]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
andreymx
для меня сейчас важно понять:
что же такое закрытый курсор?


На уровне PL/SQL, курсор закрыт, если %ISOPEN = FALSE, но для СУБД это ничего не значит.
На уровне СУБД, курсор закрыт, если его нет в v$open_cursor.

Почитай Oracle Call Interface (OCI). OCI не поддерживает пул курсоров. Если в OCI курсор был закрыт, то он будет закрыт и в СУБД. В PL/SQL это не так.
1 июн 06, 16:58    [2731239]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Victor V
mcureenab
andreymx
То есть все курсоры в v$open_cursor действительно являются открытыми?

Да.

Если верить этой статье - то нет.
В v$open_cursor содержатся не открытые, а кэшированные курсоры.
А кэшируются только закрытые курсоры. Так кто прав?


Действительно. Похоже на то что открытые PL/SQL курсоры не кэшируются, поскольку можно одновременно держать окрытыми больше курсоров, чем указано в session_cached_cursors. Курсор попадает в кэш, когда он больше не нужен PL/SQL программе. Точнее курсор просто меняет владельца, оставаясь при этом открытым.

В v$open_cursor отображаются открытые крсоры независимо от того, кэшированы они или нет. Например для OCI курсоров вообще нет понятия cached cursors, тем не менее они тоже отражаются в v$open_cursor.
1 июн 06, 17:06    [2731290]     Ответить | Цитировать Сообщить модератору
 Re: Извините - еще раз про открытые и кэшированные  [new]
Зануда Вонючая
Guest
mcureenab
На уровне СУБД, курсор закрыт, если его нет в v$open_cursor.
Чушь
mcureenab
Если в OCI курсор был закрыт, то он будет закрыт и в СУБД.
Опять же таки - не сразу. (Почитай ссылочку-то. Не знаю, кто такая эта Наталка (nata1111 ? ), но подавляющая часть всего, что там написано - правда).

mcureenab
Действительно. Похоже на то что открытые PL/SQL курсоры не кэшируются, поскольку можно одновременно держать окрытыми больше курсоров, чем указано в session_cached_cursors.
Подсказали ведь: "Это разные механизмы и курсоры"


mcureenab
В v$open_cursor отображаются открытые крсоры независимо от того, кэшированы они или нет. Например для OCI курсоров вообще нет понятия cached cursors, тем не менее они тоже отражаются в v$open_cursor.
И снова какой-то бред. И опять без тени сомнений. "Все смешалось: люди, кони..." :)

http://www.ixora.com.au/q+a/library.htm
1 июн 06, 19:56    [2732110]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить