SlideShare a Scribd company logo
1
"РазгоняСм" Π²Ρ‹Π·ΠΎΠ²Ρ‹
PL/SQL-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²
SQL-запросах
Π˜Π³ΠΎΡ€ΡŒ МСльников
melnikov_ii@mail.ru
Π˜Π³ΠΎΡ€ΡŒ МСльников
2006-2022: Oracle Corporation: Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚
2022-2024: Postgres Pro: Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚
2024 – настоящСС врСмя: нСзависимый ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚
Π‘Ρ„Π΅Ρ€Π° Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ : Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Extended RAC,, Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄
вСрсии Π‘Π£Π‘Π” Oracle, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π‘Π” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
Advanced Compression, оптимизация ΠΊΠΎΠ΄Π° PL/SQL (статичСский
Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PL/Scope ΠΈ Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²
ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ), миграция с RISC-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Π½Π° Linux x86 ΠΈ Ρ‚.Π΄.
Π’Π°ΠΊΠΆΠ΅ Π² послСднСС врСмя занимаюсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ
с Oracle Π½Π° PostgreSQL, Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄ΠΎΠΌ вСрсии PostgreSQL ΠΈ
тСхничСской ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π‘Π£Π‘Π” Oracle ΠΈ PostgreSQL.
3
План
1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ β€œΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста”
2. Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
ΠΏΡ€Π°Π³ΠΌΡ‹ UDF
3. PL/Scope ΠΈ Π΅Π³ΠΎ использованиС для автоматичСского
Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° PL/SQL-ΠΊΠΎΠ΄Π°
4. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ статистики SQL-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ для
Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² SQL-запросах
5. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
4
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ β€œΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
контСкста”
ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ SQL Π² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΌ ΠΊΠΎΠ΄Π΅ PL/SQL
5
PL/SQL VM ΠΈ SQL – это Ρ€Π°Π·Π½Ρ‹Π΅ β€œΠ΄Π²ΠΈΠΆΠΊΠΈβ€ выполнСния
6
ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ PL/SQL Π² SQL
SELECT
DISTINCT
get_domain(catalog_url
)
FROM
orders;
SQL Engine PL/SQL Runtime Engine
PL/SQL Function
FUNCTION get_domain(p_url
VARCHAR2) RETURN
VARCHAR2 IS
BEGIN
… … ..
END;
Procedural
statement
executor
β€’ НакладныС расходы Π½Π° Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΈΠ· SQL Engine Π² PL/SQL ΠΈ Π½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ²
7
ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ PL/SQL-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прямо Π² SQL-запросС
Π’ΠΏΠ΅Ρ€Π²Ρ‹Π΅ появилась Π² Oracle Database 12.1
WITH
FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS
pos PLS_INTEGER;
len PLS_INTEGER;
BEGIN
pos := INSTR(url, 'www.');
len := INSTR(SUBSTR(url, pos + 4), '.') - 1;
RETURN SUBSTR(url, pos + 4, len);
END;
SELECT
DISTINCT get_domain(catalog_url)
FROM
orders;
8
Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° (ΠΏΡ€Π°Π³ΠΌΠ°) компиляции UDF
Π’ΠΏΠ΅Ρ€Π²Ρ‹Π΅ появилась Π² Oracle Database 12.1
CREATE FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS
PRAGMA UDF;
pos PLS_INTEGER;
len PLS_INTEGER;
BEGIN
pos := INSTR(url, 'www.');
len := INSTR(SUBSTR(url, pos + 4), '.') - 1;
RETURN SUBSTR(url, pos + 4, len);
END;
β€’ Для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² SQL Π²Π²Π΅Π΄Π΅Π½Π° новая Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°
компилятора PRAGMA UDF:
β€’ Π’Ρ‹ΡˆΠ΅ быстродСйствиС
β€’ ГСнСрируСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ M-ΠΊΠΎΠ΄ для PL/SQL VM для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ
Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста
9
PL/Scope для автоматичСского
Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΊΠΎΠ΄Π°
10
Анализ исходного ΠΊΠΎΠ΄Π° PL/SQL прямо Π² Π‘Π£Π‘Π”
Появился Π΅Ρ‰Π΅ Π² Oracle Database 11g
β€’ Π‘Π±ΠΎΡ€ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± всСх ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°Ρ… ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²
исходного ΠΊΠΎΠ΄Π° PL/SQL
β€’ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ PLSCOPE_SETTINGS – для опрСдСлСния Ρ‚ΠΈΠΏΠ° собираСмых
ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²
β€’ ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡ DBA | USERS _IDENTIFIERS ΠΈ DBA | USERS _
STATEMENTS– для просмотра ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ
β€’ ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Π° пСрСкомпиляция PL/SQL ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²
β€’ Для wrapped-ΠΊΠΎΠ΄Π° сбор ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½!
β€’ Π‘Π±ΠΎΡ€ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎ использованиС статичСского SQL Π² PL/SQL, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ
присутствуСт Π²Ρ‹Π·ΠΎΠ²Ρ‹ PL/SQL доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ начиная с 12.2
11
ИспользованиС PL/Scope
ΠŸΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ PL/SQL-ΠΊΠΎΠ΄ с Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для
PL/Scope
SQL> ALTER SYSTEM SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL, STATEMENTS:ALL'
scope=both;
System altered.
SQL> STARTUP UPGRADE;
SQL> @?/rdbms/admin/utlirp.sql
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
SQL> @?/rdbms/admin/utlrp.sql
12
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования PL/Scope
ΠŸΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ PL/SQL-ΠΊΠΎΠ΄ с Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для
PL/Scope
create or replace package test_udf_plscope is
cursor v_xCur is
select
*
from
dual
where 2=getDay2(dummy);
β€’ ΠŸΡƒΡΡ‚ΡŒ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ курсор c запросом, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ вызываСтся PL/SQL-функция:
β€’ Находим Π²Ρ‹Π·ΠΎΠ² ΠΊ PL/SQL Π² SQL-запросС Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅:
13
АвтоматичСская вставка ΠΏΡ€Π°Π³ΠΌΡ‹ UDF Π½Π° основС
ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ PL/Scope
АвтоматичСски вставляСм ΠΏΡ€Π°Π³ΠΌΡƒ UDF Π² исходный ΠΊΠΎΠ΄
create or replace function getDay2(p varchar2) return number is
begin
if length(p) > 10 then
return 2;
end if;
return 0;
end;
β€’ Код Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ послС выполнСния скрипта make_udf.sql: просматриваСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ
PL/Scope, Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ исходный ΠΊΠΎΠ΄ ΠΈΠ· DBA_SOURCE, парсит Π΅Π³ΠΎ, вставляСт ΠΏΡ€Π°Π³ΠΌΡƒ UDF ΠΈ
Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ скрипты пСрСсоздания ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ):
β€’ ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:
create or replace function getDay2(p varchar2) return number is
PRAGMA UDF; --added by make_udf.sql
begin
… … …
end;
14
ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° статистики SQL-
ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ ΠΏΡ€ΠΈ использовании
Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
15
ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
β€’ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ β€œΠ½Π΅ знаСт” число Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… строк Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:
SELECT
*
FROM
TABLE(AdminUtils.GetAccess(User, 8, :pKey)))
β€’ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ всСгда ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ 8168 строк:
Execution Plan
----------------------------------------------------------
Plan hash value: 2019876094
--------------------------------------------------------------------------------------------|
Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------------------|
| 0 | SELECT STATEMENT | | 8168 | 16336 | 29 (0) | 00:00:01 |
| 1 | COLLECTION ITERATOR PICKLER FETCH| GETACCESS | 8168 | 16336 | 29 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
16
PL/SQL-интСрфСйс ΠΊ SQL-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ
create or replace type my_data_optimizer_stats AS OBJECT (
-- ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅
dummy_attribute number,
-- Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ конструктор
static function ODCIGetInterfaces (v_pInterfaces out sys.ODCIObjectList)
return number,
-- Π­Ρ‚Π° функция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° (callback), Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ
ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π½Π° этапС построСния ΠΏΠ»Π°Π½Π°.
-- Она Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ количСство строк, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅
Π²Π΅Ρ€Π½Π΅Ρ‚ наша табличная функция.
static function ODCIStatsTableFunction(v_pFunction in sys.ODCIFuncInfo,
v_pStats out
sys.ODCITabFuncStats,
v_pArgs in
sys.ODCIArgDescList ) return number);
17
ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π‘Π’Πž количСство строк Π² table-function
static function ODCIStatsTableFunction(v_pFunction in sys.ODCIFuncInfo,
v_pStats out
sys.ODCITabFuncStats,
v_pArgs in
sys.ODCIArgDescList ) return number is
begin
if v_pFunction.ObjectSchema = β€˜MY_SCHEMA' and
v_pFunction.ObjectName = β€˜ADMINUTILS' then
if v_pFunction.MethodName = β€˜GETACCESS' then
v_pStats :=
sys.ODCITabFuncStats(my_schema.adminutils.v_gNumberList.Count);
end if;
end if;
return ODCIConst.success;
end;
end;
Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ
пСрСмСнная ΠΏΠ°ΠΊΠ΅Ρ‚Π°
для хранСния
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° table-
function
18
РСгистрируСм Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² SQL-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅
SQL> ASSOCIATE STATISTICS WITH PACKAGES my_schema.AdminUtils USING
my_data_optimizer_stats;
Statistics associated.
SQL> SELECT * FROM TABLE(AdminUtils.GetAccess(User, 8, :pKey)))
Execution Plan
----------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
(%CPU)| Time |
----------------------------------------------------------------------
----
| 0 | SELECT STATEMENT | | 3 | 6 | 29
(0)| 00:00:01 |
| 1 | COLLECTION ITERATOR PICKLER FETCH| GETACCESS| 3 | 6
| 29 (0)| 00:00:01 |
19
Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
20
Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
β€’ ИспользованиС ΠΏΡ€Π°Π³ΠΌΡ‹ UDF позволяСт ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ
быстродСйствиС запросов с PL/SQL-функциями, Π·Π° счСт
ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста
β€’ CтатичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° PL/Scope позволяСт
автоматичСски Π½Π°ΠΉΡ‚ΠΈ Π² исходном PL/SQL-ΠΊΠΎΠ΄Π΅ статичСский
SQL с Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ PL/SQL-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
β€’ Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ скрипта ΠΌΠΎΠΆΠ½ΠΎ автоматичСски
Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π³ΠΌΡƒ UDF Π² исходный ΠΊΠΎΠ΄ PL/SQL-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅
Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² SQL
β€’ ИспользованиС интСрфСйса ΠΊ SQL-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ позволяСт
ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π‘Π’Πž количСство строк Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΉ
Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ качСство ΠΏΠ»Π°Π½ΠΎΠ² выполнСния
21
Бпасибо
Π·Π°
Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!

More Related Content

Featured (20)

PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
Search Engine Journal
Β 
PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
Chiara Aliotta
Β 
PDF
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
OECD Directorate for Financial and Enterprise Affairs
Β 
PDF
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
SocialHRCamp
Β 
PDF
2024 State of Marketing Report – by Hubspot
Marius Sescu
Β 
PDF
Everything You Need To Know About ChatGPT
Expeed Software
Β 
PDF
Product Design Trends in 2024 | Teenage Engineerings
Pixeldarts
Β 
PDF
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
Β 
PDF
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
marketingartwork
Β 
PDF
Skeleton Culture Code
Skeleton Technologies
Β 
PDF
PEPSICO Presentation to CAGNY Conference Feb 2024
Neil Kimberley
Β 
PDF
Content Methodology: A Best Practices Report (Webinar)
contently
Β 
PPTX
How to Prepare For a Successful Job Search for 2024
Albert Qian
Β 
PDF
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
Β 
PDF
Trends In Paid Search: Navigating The Digital Landscape In 2024
Search Engine Journal
Β 
PDF
5 Public speaking tips from TED - Visualized summary
SpeakerHub
Β 
PDF
ChatGPT and the Future of Work - Clark Boyd
Clark Boyd
Β 
PDF
Getting into the tech field. what next
Tessa Mero
Β 
PDF
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Lily Ray
Β 
PDF
How to have difficult conversations
Rajiv Jayarajah, MAppComm, ACC
Β 
2024 Trend Updates: What Really Works In SEO & Content Marketing
Search Engine Journal
Β 
Storytelling For The Web: Integrate Storytelling in your Design Process
Chiara Aliotta
Β 
Artificial Intelligence, Data and Competition – SCHREPEL – June 2024 OECD dis...
OECD Directorate for Financial and Enterprise Affairs
Β 
How to Leverage AI to Boost Employee Wellness - Lydia Di Francesco - SocialHR...
SocialHRCamp
Β 
2024 State of Marketing Report – by Hubspot
Marius Sescu
Β 
Everything You Need To Know About ChatGPT
Expeed Software
Β 
Product Design Trends in 2024 | Teenage Engineerings
Pixeldarts
Β 
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
Β 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
marketingartwork
Β 
Skeleton Culture Code
Skeleton Technologies
Β 
PEPSICO Presentation to CAGNY Conference Feb 2024
Neil Kimberley
Β 
Content Methodology: A Best Practices Report (Webinar)
contently
Β 
How to Prepare For a Successful Job Search for 2024
Albert Qian
Β 
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
Β 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Search Engine Journal
Β 
5 Public speaking tips from TED - Visualized summary
SpeakerHub
Β 
ChatGPT and the Future of Work - Clark Boyd
Clark Boyd
Β 
Getting into the tech field. what next
Tessa Mero
Β 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Lily Ray
Β 
How to have difficult conversations
Rajiv Jayarajah, MAppComm, ACC
Β 

How optimize PL/SQL by decrease overhead for context switching between SQL and PL/SQL: using pragma UDF and PL/Scope

  • 2. Π˜Π³ΠΎΡ€ΡŒ МСльников 2006-2022: Oracle Corporation: Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚ 2022-2024: Postgres Pro: Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚ 2024 – настоящСС врСмя: нСзависимый ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚ Π‘Ρ„Π΅Ρ€Π° Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ : Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Extended RAC,, Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄ вСрсии Π‘Π£Π‘Π” Oracle, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π‘Π” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Advanced Compression, оптимизация ΠΊΠΎΠ΄Π° PL/SQL (статичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PL/Scope ΠΈ Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ), миграция с RISC-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Π½Π° Linux x86 ΠΈ Ρ‚.Π΄. Π’Π°ΠΊΠΆΠ΅ Π² послСднСС врСмя занимаюсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ с Oracle Π½Π° PostgreSQL, Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄ΠΎΠΌ вСрсии PostgreSQL ΠΈ тСхничСской ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π‘Π£Π‘Π” Oracle ΠΈ PostgreSQL.
  • 3. 3 План 1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ β€œΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста” 2. Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π°Π³ΠΌΡ‹ UDF 3. PL/Scope ΠΈ Π΅Π³ΠΎ использованиС для автоматичСского Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° PL/SQL-ΠΊΠΎΠ΄Π° 4. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ статистики SQL-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ для Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² SQL-запросах 5. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
  • 5. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ SQL Π² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΌ ΠΊΠΎΠ΄Π΅ PL/SQL 5 PL/SQL VM ΠΈ SQL – это Ρ€Π°Π·Π½Ρ‹Π΅ β€œΠ΄Π²ΠΈΠΆΠΊΠΈβ€ выполнСния
  • 6. 6 ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ PL/SQL Π² SQL SELECT DISTINCT get_domain(catalog_url ) FROM orders; SQL Engine PL/SQL Runtime Engine PL/SQL Function FUNCTION get_domain(p_url VARCHAR2) RETURN VARCHAR2 IS BEGIN … … .. END; Procedural statement executor β€’ НакладныС расходы Π½Π° Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΈΠ· SQL Engine Π² PL/SQL ΠΈ Π½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ²
  • 7. 7 ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ PL/SQL-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прямо Π² SQL-запросС Π’ΠΏΠ΅Ρ€Π²Ρ‹Π΅ появилась Π² Oracle Database 12.1 WITH FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS pos PLS_INTEGER; len PLS_INTEGER; BEGIN pos := INSTR(url, 'www.'); len := INSTR(SUBSTR(url, pos + 4), '.') - 1; RETURN SUBSTR(url, pos + 4, len); END; SELECT DISTINCT get_domain(catalog_url) FROM orders;
  • 8. 8 Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° (ΠΏΡ€Π°Π³ΠΌΠ°) компиляции UDF Π’ΠΏΠ΅Ρ€Π²Ρ‹Π΅ появилась Π² Oracle Database 12.1 CREATE FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS PRAGMA UDF; pos PLS_INTEGER; len PLS_INTEGER; BEGIN pos := INSTR(url, 'www.'); len := INSTR(SUBSTR(url, pos + 4), '.') - 1; RETURN SUBSTR(url, pos + 4, len); END; β€’ Для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² SQL Π²Π²Π΅Π΄Π΅Π½Π° новая Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° компилятора PRAGMA UDF: β€’ Π’Ρ‹ΡˆΠ΅ быстродСйствиС β€’ ГСнСрируСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ M-ΠΊΠΎΠ΄ для PL/SQL VM для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста
  • 10. 10 Анализ исходного ΠΊΠΎΠ΄Π° PL/SQL прямо Π² Π‘Π£Π‘Π” Появился Π΅Ρ‰Π΅ Π² Oracle Database 11g β€’ Π‘Π±ΠΎΡ€ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± всСх ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°Ρ… ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² исходного ΠΊΠΎΠ΄Π° PL/SQL β€’ ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ PLSCOPE_SETTINGS – для опрСдСлСния Ρ‚ΠΈΠΏΠ° собираСмых ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² β€’ ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡ DBA | USERS _IDENTIFIERS ΠΈ DBA | USERS _ STATEMENTS– для просмотра ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ β€’ ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Π° пСрСкомпиляция PL/SQL ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² β€’ Для wrapped-ΠΊΠΎΠ΄Π° сбор ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½! β€’ Π‘Π±ΠΎΡ€ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎ использованиС статичСского SQL Π² PL/SQL, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ присутствуСт Π²Ρ‹Π·ΠΎΠ²Ρ‹ PL/SQL доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ начиная с 12.2
  • 11. 11 ИспользованиС PL/Scope ΠŸΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ PL/SQL-ΠΊΠΎΠ΄ с Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для PL/Scope SQL> ALTER SYSTEM SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL, STATEMENTS:ALL' scope=both; System altered. SQL> STARTUP UPGRADE; SQL> @?/rdbms/admin/utlirp.sql SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP; SQL> @?/rdbms/admin/utlrp.sql
  • 12. 12 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования PL/Scope ΠŸΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ PL/SQL-ΠΊΠΎΠ΄ с Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для PL/Scope create or replace package test_udf_plscope is cursor v_xCur is select * from dual where 2=getDay2(dummy); β€’ ΠŸΡƒΡΡ‚ΡŒ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ курсор c запросом, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ вызываСтся PL/SQL-функция: β€’ Находим Π²Ρ‹Π·ΠΎΠ² ΠΊ PL/SQL Π² SQL-запросС Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅:
  • 13. 13 АвтоматичСская вставка ΠΏΡ€Π°Π³ΠΌΡ‹ UDF Π½Π° основС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ PL/Scope АвтоматичСски вставляСм ΠΏΡ€Π°Π³ΠΌΡƒ UDF Π² исходный ΠΊΠΎΠ΄ create or replace function getDay2(p varchar2) return number is begin if length(p) > 10 then return 2; end if; return 0; end; β€’ Код Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ послС выполнСния скрипта make_udf.sql: просматриваСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ PL/Scope, Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ исходный ΠΊΠΎΠ΄ ΠΈΠ· DBA_SOURCE, парсит Π΅Π³ΠΎ, вставляСт ΠΏΡ€Π°Π³ΠΌΡƒ UDF ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ скрипты пСрСсоздания ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ): β€’ ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: create or replace function getDay2(p varchar2) return number is PRAGMA UDF; --added by make_udf.sql begin … … … end;
  • 14. 14 ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° статистики SQL- ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ ΠΏΡ€ΠΈ использовании Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
  • 15. 15 ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€’ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ β€œΠ½Π΅ знаСт” число Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… строк Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: SELECT * FROM TABLE(AdminUtils.GetAccess(User, 8, :pKey))) β€’ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ всСгда ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ 8168 строк: Execution Plan ---------------------------------------------------------- Plan hash value: 2019876094 --------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time --------------------------------------------------------------------------------------------| | 0 | SELECT STATEMENT | | 8168 | 16336 | 29 (0) | 00:00:01 | | 1 | COLLECTION ITERATOR PICKLER FETCH| GETACCESS | 8168 | 16336 | 29 (0)| 00:00:01 | --------------------------------------------------------------------------------------------
  • 16. 16 PL/SQL-интСрфСйс ΠΊ SQL-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ create or replace type my_data_optimizer_stats AS OBJECT ( -- ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅ dummy_attribute number, -- Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ конструктор static function ODCIGetInterfaces (v_pInterfaces out sys.ODCIObjectList) return number, -- Π­Ρ‚Π° функция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° (callback), Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π½Π° этапС построСния ΠΏΠ»Π°Π½Π°. -- Она Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ количСство строк, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Π΅Ρ€Π½Π΅Ρ‚ наша табличная функция. static function ODCIStatsTableFunction(v_pFunction in sys.ODCIFuncInfo, v_pStats out sys.ODCITabFuncStats, v_pArgs in sys.ODCIArgDescList ) return number);
  • 17. 17 ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π‘Π’Πž количСство строк Π² table-function static function ODCIStatsTableFunction(v_pFunction in sys.ODCIFuncInfo, v_pStats out sys.ODCITabFuncStats, v_pArgs in sys.ODCIArgDescList ) return number is begin if v_pFunction.ObjectSchema = β€˜MY_SCHEMA' and v_pFunction.ObjectName = β€˜ADMINUTILS' then if v_pFunction.MethodName = β€˜GETACCESS' then v_pStats := sys.ODCITabFuncStats(my_schema.adminutils.v_gNumberList.Count); end if; end if; return ODCIConst.success; end; end; Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ пСрСмСнная ΠΏΠ°ΠΊΠ΅Ρ‚Π° для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° table- function
  • 18. 18 РСгистрируСм Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² SQL-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ SQL> ASSOCIATE STATISTICS WITH PACKAGES my_schema.AdminUtils USING my_data_optimizer_stats; Statistics associated. SQL> SELECT * FROM TABLE(AdminUtils.GetAccess(User, 8, :pKey))) Execution Plan ---------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------- ---- | 0 | SELECT STATEMENT | | 3 | 6 | 29 (0)| 00:00:01 | | 1 | COLLECTION ITERATOR PICKLER FETCH| GETACCESS| 3 | 6 | 29 (0)| 00:00:01 |
  • 20. 20 Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€’ ИспользованиС ΠΏΡ€Π°Π³ΠΌΡ‹ UDF позволяСт ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ быстродСйствиС запросов с PL/SQL-функциями, Π·Π° счСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста β€’ CтатичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° PL/Scope позволяСт автоматичСски Π½Π°ΠΉΡ‚ΠΈ Π² исходном PL/SQL-ΠΊΠΎΠ΄Π΅ статичСский SQL с Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ PL/SQL-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€’ Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ скрипта ΠΌΠΎΠΆΠ½ΠΎ автоматичСски Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π³ΠΌΡƒ UDF Π² исходный ΠΊΠΎΠ΄ PL/SQL-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² SQL β€’ ИспользованиС интСрфСйса ΠΊ SQL-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π‘Π’Πž количСство строк Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ качСство ΠΏΠ»Π°Π½ΠΎΠ² выполнСния