История этой задачки началась с форума Oracle на , куда я однажды случайно забрел. Один из участников форума пытался перенести в Oracle схему БД, подготовленную в другой системе. В таблице было поле, названное NUMBER. Очевидно, в нем хранилось какое-то число; с этим-то полем в Oracle и случилась незадача. Ее раскрывает следующий (уже мой) пример:
SQL> CREATE TABLE t(number NUMBER); CREATE TABLE t(number NUMBER) * ERROR at line 1: ORA-00904: : invalid identifier
Автор вопроса правильно сообразил, что NUMBER - это зарезервированное в Oracle слово (мы помним, что перед обработкой предложения SQL Oracle повышает регистр букв в именах объектов), и ошибка возникает при синтаксическом разборе. В документации про ошибку ORA-00904 сказано: "… [column name] may not be a reserved word". Раз уж говорим о заморочках, обратите внимание на текст сообщения: между двумя двоеточиями по замыслу разработчиков должно стоять то самое неправильное имя, а в нашем случае оно оказалось настолько неправильным, что не попало в результат синтаксического анализатора ! Не самый большой грех в Oracle, но ведь по теме статьи.
Неужели перенося базу в Oracle придется править схему, а значит и приложение ? Если не выход, то лазейку из положения автор вопроса в форум нашел правильно. Заключив имя объекта в Oracle в двойные кавычки мы приобретем право использовать абсолютно любые доступные в кодировке символы, хоть звездочки, хоть точки, хоть пробелы:
SQL> CREATE TABLE t(" ./()*" NUMBER, "NUMBER" NUMBER);
Table created.
SQL> DESCRIBE t Name Null? Type ------------------- -------- ---------------------- ./()* NUMBER NUMBER NUMBER
SQL> ALTER TABLE t DROP COLUMN " ./()*";
Table altered.
SQL> DESCRIBE t Name Null? Type ------------------- -------- ---------------------- NUMBER NUMBER
Если смириться с неудобством двойных кавычек, это вполне рабочий вариант:
SQL> INSERT INTO t VALUES (123);
1 row created.
SQL> UPDATE t SET "NUMBER" = "NUMBER";
Следующий пример показывает архитектурное упущение создателей Oracle. Оно обязано одному из недальновидных решений, принятых в первых версиях Oracle, очевидно в угоду скорости утверждения на рынке. Позже, подобно некоторым другим подобным в этом отношении "ранним" решениям Oracle, исправить положение дел уже не представилось возможным.
К счастью, проблема неожидаемой маскировки объекта в БД, о которой пойдет речь, довольно специфична. Однако ж она вполне реальна.
Рассмотрим пример функции в схеме SCOTT:
SQL> CREATE FUNCTION ename RETURN VARCHAR2 AS 2 BEGIN RETURN 'I am a function'; END; 3 /
Function created.
Это не запрещено, несмотря на наличия поля ENAME в одной из таблиц схемы, так как пространства имен функций и столбцов не пересекаются (и правильно !). Но что произойдет, если к ней обратиться при выборке данных из таблицы EMP ? Если выполнить следующий запрос, что мы увидим: столбец или функцию ?
SELECT ename FROM emp;
Правильный ответ дает документация, где в одном из бесчисленных закоулков перечислена последовательность обработки имен объектов в предложениях SQL. Однако в данном случае гораздо проще изматывающего поиска в документации поставить эксперимент и убедиться, что по принципу "своя рубашка ближе к телу" СУБД выдаст значения столбца таблицы.
Закономерно возникает вопрос: а как при обращении к EMP выдать значение функции ENAME ? Несложные эксперименты приводят к необходимости указать полное имя функции, снабдив его именем схемы:
SELECT scott.ename, ename FROM emp;
Или же (что в некоторых смыслах более правильно)
SELECT scott.ename, emp.ename FROM emp;
Крайне неудачная система обозначений (в SCOTT.ENAME SCOTT - это имя схемы, а в такой же по виду записи EMP.ENAME EMP - это имя таблицы), но свое дело она делает. К сожалению, этим дело не кончается. Пространства имен схем и пакетов тоже разные, что тоже правильно. Рассмотрим теперь следующее:
CREATE OR REPLACE PACKAGE scott IS FUNCTION ename
RETURN varchar2; END scott; /
CREATE OR REPLACE PACKAGE BODY scott IS FUNCTION ename RETURN varchar2 IS BEGIN RETURN 'I am a package function'; END ename; END scott; /
SELECT scott.ename FROM emp;
Убедитесь, что получим 'I am a package function'. Но теперь, обращаясь к EMP мы никогда не увидим результат самостоятельной (не пакетированной) функции ENAME ! Если в вашем приложении были запросы типа SELECT scott.ename FROM emp, то после создания пакета они начнут выдавать попросту другой ответ.
Способ формирования составных имен не идеален и в других языках. Например, даже в таком архитектурно продуманном языке, как Java, понять по тексту смысл каждой компоненты в имени java.lang.System.out.println без дополнительной информации невозможно. Но другой системы, кроме Oracle, где допускалось бы исчезновение видимости имени одного объекта вследствие вполне законного заведения других, мне неизвестно.
PL/SQL в Oracle относится к языкам, в которых рекурсивные вызовы подпрограмм разрешены. В теле одной подпрограммы можно обратиться к самой себе, или же, например, к другой, а та, в свою очередь к первой. Рекурсия иногда удобна. Пример из учебников - вычисление факториала. Более жизненный пример - размечивание весами древовидной структуры, позволяющее организовать быстрый доступ к хранимому в БД справочнику без привлечения нестандартных и несовместимых конструкций (в Oracle это конструкция CONNECT BY).
Особенность в том, что машина PL/SQL в СУБД Oracle никак не регламентирует глубину повторных обращений, что оставляет лазейку "бесконечного" зацикливания. Ответственность за его возникновение СУБД перекладывает на программистов. Хуже того, организовать такое зацикливание может любой пользователь, обладающий всего только-то привилегией CREATE SESSION:
SQL> CONNECT / AS SYSDBA Connected. SQL> CREATE USER adam IDENTIFIED BY eva;
User created.
SQL> GRANT CREATE SESSION TO adam;
Grant succeeded.
SQL> CONNECT adam/eva Connected.
Прежде чем двигаться дальше, удостоверьтесь, что вы готовы перезагрузить свою БД.
SQL> DECLARE PROCEDURE a IS BEGIN a; END; BEGIN a; END; /
Дальнейшее лучше наблюдать какой-нибудь программой ОС, показывающей использование процессорного времени и оперативной памяти.
Во-первых, сеанс пользователя ADAM начинает жадно расходовать процессорное время. Другие сеансы связи с СУБД это сразу почувствуют.
Во-вторых, сеанс пользователя ADAM начинает неумолимо захватывать оперативную память во все больших и больших количествах. Пусть не сразу, но другие сеансы связи с СУБД почувствуют и это.
Если ваша база загружена какой-то реальной работой, проделанная простая операция - эффективный способ дезорганизовать эту работу. У меня ни разу не хватило терпения дождаться, когда Oracle исчерпает всю оперативную память, и проверить его способность самому переварить проблему. Но если не препринять заблаговременных мер по нейтрализации подобных диверсий, даже естественная попытка убить вредоносный сеанс не будет простой. Сначала из-за страшно медленной реакции СУБД на ваши действия от имени SYS, а потом из-за страшно медленного освобождения памяти после команды ALTER SYSTEM KILL SESSION.
Вопрос, стоило ли разработчикам Oracle оставлять возможность неограниченной рекурсии, способен разжечь спор. Но сделано то, что сделано: Oracle награждает нас здесь одновременно со свободой действий и риском потери нормальной работы СУБД.
Преподаватель технологий Oracle
... "Да вот веревкой хочу море морщить
Да вас, проклятое племя, корчить".
А. С. Пушкин,
Сказка о попе и его работнике Балде
Преподаватель технологий Oracle
Церковь была отворена, за оградой стояло несколько саней;
по паперти ходили люди.
«Сюда! сюда!» — закричало несколько голосов ...
А. С. Пушкин, «Метель»
Мысли, возникающие по поводу возможного использования ссылок на курсор в программе, несколько осаждаются существующими ограничениями, часть которых, если вдуматься, имеют свою логику. Как упоминалось, ссылки на курсор не представлены типом SQL (до некоторой степени это естественно), и не могут храниться в качестве переменных пакета PL/SQL. Более полно: ссылки на курсор не могут объявляться как переменные пакета PL/SQL и их нельзя передавать через переменные пакета
ссылкам на курсор нельзя присваивать значение NULL (в версии 10 уже можно) и их нельзя сравнивать друг с другом (но их можно присваивать друг другу)ссылки на курсор нельзя хранить в столбцах таблиц и в элементах коллекцииссылки на курсор нельзя передавать от сервера к серверу с помощью RPCссылки на курсор нельзя использовать с пакетом DBMS_SQL
ссылки на курсор не допускают над собой выражений.
На каком бы языке вы не общались с БД посредством ссылки на курсор, без программирования на PL/SQL не обойтись. Формальная сторона работы со ссылкой на курсор в PL/SQL обставлена просто.
Во-первых, чтобы завести в PL/SQL переменную-ссылку на курсор, нужно сначала описать ее тип. Это делается в разделе описания с помощью предложения TYPE:
TYPE имя_типа_ссылки_на_курсор IS REF CURSOR [RETURN тип_записи];
Если конструкция RETURN присутствует, ссылка на курсор называется строгой; если нет – нестрогой. Нестрогая может ссылаться на любой курсор (запрос), а строгая – только на тот, что возвращает результат указанного типа.
Пример описания обоих типов ссылки на курсор:
DECLARE TYPE any_curtype IS REF CURSOR; generic_curvar any_curtype;
TYPE departments_curtype IS REF CURSOR RETURN dept%ROWTYPE; departments_cur departments_curtype;
BEGIN NULL; END; /
Открытие курсора с помощью переменной-ссылки на курсор: OPEN ссылка_на_курсор FOR предложение_SELECT;
Команды FETCH и CLOSE используются как обычно, толькот вместо имени курсора указываем имя ссылки на курсор.
Во-вторых, для удобства программирования поддерживается «системный» тип SYS_REFCURSOR нестрогой ссылки на курсор. Так, в блоке выше, в разделе описания можно было бы не приводить предложение TYPE, а сразу сказать: generic_curvar SYS_REFCURSOR;
Тип SYS_REFCURSOR сокращает текст программы, а иногда позволяет и обойтись без создания служебного пакета (пример чего в этой статье не рассматривается).
В клиентской программе на Java обращаться к БД через ссылку на курсор можно с помощью собственных расширений, сделанных фирмой Oracle в реализации ею драйвера JDBC. В программе ниже предполагается имя СУБД MYDB. Обратите внимание, что текст с запросом SQL передается нашему пакету объектом класса CallableStatement, а извлечение в программу ссылки на курсор делается после приведения этого объекта к сугубо Oracle’овскому классу OracleCallableStatement.
Получение в программу ссылки на курсор соответствует формированию объекта класса ResultSet, обработка которого делается стандартно.
Выдача второго запроса в программе ниже демонстрирует возможность использования одного и того же пакета для получения результата разной структуры. Очевидно, по своей гибкости эта техника находится посередине между тем, что имеется в PL/SQL и в SQL*Plus.
Подготовим файл GenericRefCursor.java: import java.sql.DriverManager; import java.sql.Connection; import java.sql.CallableStatement; import java.sql.ResultSet; import oracle.jdbc.driver.OracleCallableStatement; import oracle.jdbc.driver.OracleTypes;public class GenericRefCursor
{public static void main ( String[] args ) {
try { DriverManager.registerDriver ( new oracle.jdbc.driver.OracleDriver ( ) );
Connection cn; cn = DriverManager.getConnection ( "jdbc:oracle:oci:@mydb", "scott", "tiger" );
CallableStatement cst; OracleCallableStatement ocst; ResultSet rs;
cst = cn.prepareCall ( "BEGIN generic_ref_cursor.get_ref_cursor ( ?, ? ); END;" ); cst.setString ( 1, "SELECT sal FROM emp" ); cst.registerOutParameter ( 2, OracleTypes.CURSOR );
cst.execute ( );
ocst = ( OracleCallableStatement ) cst;
rs = ocst.getCursor ( 2 );
while ( rs.next ( ) ) { System.out.println ( rs.getInt ( 1 ) ); }
/* Новый запрос ... */ cst.setString ( 1, "SELECT dname, loc FROM dept" ); cst.execute ( ); rs = ocst.getCursor ( 2 ); while ( rs.next ( ) ) { System.out.println ( rs.getString ( 1 ) + rs.getString ( 2 ) ); }
/* ... и так далее, запрос за запросом */ cst.close ( ); } catch ( Exception e ){System.out.println ( e ); } }
}
В ОС оттранслируем класс GenericRefCursor и выполним программу: >javac GenericRefCursor.java >java GenericRefCursor
В этом примере с помощью нашего пакета открываем курсор и передаем ссылку на курсор в программу. Извлечение результатов предложений SELECT выполняется отдельными процедурами, причем для результатов с разной структурой мы вынуждены предусмотреть разные процедуры извлечения. Это – плата за минимализм и общность пакета.
Выдадим в SQL*Plus: SET SERVEROUTPUT ON
DECLARE lrc SYS_REFCURSOR;
PROCEDURE fetchandclose ( rc IN sys_refcursor) IS somename VARCHAR2 ( 20 ); BEGIN DBMS_OUTPUT.PUT_LINE ( '------------------------------' ); LOOP FETCH rc INTO somename; EXIT WHEN rc%NOTFOUND; DBMS_OUTPUT.PUT_LINE ( somename ); END LOOP; CLOSE rc; END; PROCEDURE fetch2andclose ( rc IN sys_refcursor) IS somename VARCHAR2 ( 20 ); somenumber NUMBER; BEGIN DBMS_OUTPUT.PUT_LINE ( '------------------------------' ); LOOP FETCH rc INTO somename, somenumber; EXIT WHEN rc%NOTFOUND; DBMS_OUTPUT.PUT_LINE ( RPAD ( somename, 10, ' ' ) somenumber ); END LOOP; CLOSE rc; END;
BEGIN -- Примеры:generic_ref_cursor.get_ref_cursor ( 'SELECT ename FROM emp', lrc ); fetchandclose ( lrc );
generic_ref_cursor.get_ref_cursor ( 'SELECT dname FROM dept', lrc ); fetchandclose ( lrc );
generic_ref_cursor.get_ref_cursor ( 'SELECT job, sal FROM emp', lrc ); fetch2andclose ( lrc ); END; /
(Чтобы не усложнять пример, результат на экране почти не оформляется).
Обратим внимание: программам, обрабатывающим по общей схеме однотипные курсоры, мы передаем не тексты запроса, а ссылки на уже открытый и динамически (а не статически, как в случае его определения в отдельном пакете) сформированный курсор.
SQL*Plus позволяет заводить собственные переменные, в том числе и типа нестрогой ссылки на курсор. Открывается курсор, как и в примере выше, нашим пакетом, а вот извлечение возможно обычной командой PRINT. Эта команда умеет распознавать структуру фактического курсора, что очень удобно для работы.
Выдадим в SQL*Plus: VARIABLE refcur REFCURSOR
BEGIN generic_ref_cursor.get_ref_cursor ( 'SELECT ename, sal FROM emp', :refcur ); END; /
PRINT refcur
BEGIN generic_ref_cursor.get_ref_cursor ( 'SELECT * FROM emp', :refcur ); END; /
PRINT refcur
В отличие от предыдущего примера команда PRINT закрывает курсор, так что вторичная выдача PRINT refcur
приведет к ошибке.
Приводимые ниже примеры в каждой из трех сред программирования будут использовать для доступа к БД через ссылку на курсор один и тот же пакет. В реальной жизни именно на подобный пакет и ляжет описание требуемой программной логики. Тут же он воимя наглядности устроен максимально просто, (почти) безо всякой программно-прикладной логики, но это обстоятельство и обеспечивает ему универсальность.
Выдадим в SQL*Plus: CONNECT scott/tiger
CREATE OR REPLACE PACKAGE generic_ref_cursor AS PROCEDURE get_ref_cursor(sqlselect IN VARCHAR2, rc OUT sys_refcursor); END; /
CREATE OR REPLACE PACKAGE BODY generic_ref_cursor AS PROCEDURE get_ref_cursor(sqlselect IN VARCHAR2, rc OUT sys_refcursor) AS BEGIN OPEN rc FOR sqlselect; END; END; /
В реальной практике такому выхолощенному пакету вполне может найтись свое место, однако часто будут использоваться и другие, общие с приведенным выше только тем, что
(а) в теле будет обязательно присутствовать предложение OPEN
(б) среди параметров должен присутствовать выходной типа ссылки на курсор (возможно строгой).
Остальное регламентируется исключительно логикой приложения и организации программы.
В пору моего обучения в техническом ВУЗе люди, как и сечас, были склонны называть себя как угодно, и в народе бытовал критерий настоящего математика. Право им назваться отдавалось тому, кто знал, что такое поле Галуа. Таки не ставши математиком, не берусь судить о корректности этого критерия (сдается, он ребяческий), однако занимаясь Oracle, могу предложить другой критерий профессионализма: для программиста этой СУБД.
В диалекте SQL, придуманном фирмой Oracle, есть много разных конструкций, не всякому известных; например, для аналитические функции, или же средства для работы с рукотворными объектами. Но это вещи специфические, не каждому программисту потребные, а вот ссылки на курсор – явление безусловно общего характера.
Ссылка на курсор дает возможность не заводить структуры курсора (CURSOR … IS …) в клиентской программе, а ограничиться в ней выделением памяти только для адреса курсора, в то время как сам курсор будет располагаться целиком в СУБД. Программист способен прожить и без ссылок на курсор, однако те могут дать программам заметные конструктивные выгоды:
Они позволяют перенести программную логику на сервер. Клиентские приложения оказываются не так жестко привязаны к конкретным запросам; одни и те же запросы могут вызываться с одинаковым эффектом из программ на PL/SQL, C или Java.
Они позволяют перенести вычислительную нагрузку на сервер.
Поскольку принципиально для программирования ссылки на курсоры не нужны, большинство разработчиков обходится обычным способом общения с СУБД. Выгоды же извлекают программисты, которых и можно в данном контексте признать профессионалами.
Ссылки на курсор реализованы в Oracle программно и в SQL. В программе они реализуются в виде специальной переменной, и именно этот вариант показан в этой статье. Клиентскими средами будут выступать PL/SQL, SQL*Plus и Java.
Преподаватель технологий Oracle
... Родила царица в ночь
Не то сына, не то дочь;
Не мышонка, не лягушку,
А неведому зверюшку.
А. С. Пушкин, «Сказка о царе Салтане»
В некоторых случаях использование курсорного выражения в SELECT дает выгоду и вне программы.
Средства XSQL, поставляемые в рамках штатной поставки ПО СУБД Oracle («XML Development Kit», XDK), позволяют хранить на сервере web сервлет, порождающий по запросу SELECT к базе данных документ XML. Этот сервлет способен обрабатывать ссылки на курсор, порождаемые курсорным выражением.
Подготовим файл departments.xsql: <?xml version="1.0"? <xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql" SELECT dname ,CURSOR ( SELECT ename FROM emp WHERE emp.deptno = dept.deptno )
AS employees
FROM dept </xsql:query
Создадим каталог company в месте файловой системы, предусмотренным в Oracle для расположения файлов формата XSQL. Например, при установленном расширении XDK ПО Oracle версии 9.2 этим местом может быть $ORACLE_HOME/xdk/demo/java. Обратимся браузером по адресу
http://localhost:7778/xsql/company/departments.xsql (сервер HTTP при этом должен быть запущен). Получим примерно такой результат:
В этом изображении для краткости узлы ROW с атрибутами num = "2" и num = "3" свернуты средствами браузера.
Полученный документ XML может играть для сервера приложений в web как самостоятельную роль (выдавая результат обращений по определенному адресу в web в формате XML), так и роль исходного материала для дальнейшего преобразования XSL (выдавая результат в конечном итоге в формате HTML, в том числе с графическим оформлением). Эти преобразования здесь не рассматриваются, как не относящиеся к возможностям собственно Oracle.
Замечательно, что обрабатывающий запросы XSQL сервлет, разработанный фирмой Oracle, способен обрабатывать не только одиночные, но и вложенные выражения типа CURSOR. Подготовим еще один файл multicursor.xsql и положим его в тот же каталог company: <?xml version="1.0"? <xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql" SELECT TO_CHAR ( SYSTIMESTAMP,'SS:FF3' ) AS seconds , CURSOR ( SELECT TO_CHAR ( SYSTIMESTAMP,'SS:FF3' ) secondsone , CURSOR ( SELECT TO_CHAR( SYSTIMESTAMP,'SS:FF3' ) AS secondstwo
Рассмотрим следующий пример блока PL/SQL, где используется (а) обычный курсор для SELECT и (б) курсорное выражение внутри: SET SERVEROUTPUT ON
DECLARE CURSOR main_cur IS SELECT dname , CURSOR ( SELECT ename FROM emp WHERE emp.deptno = dept.deptno )
FROM dept ; deptname dept.dname%TYPE; empname emp.ename%TYPE; inner_cur SYS_REFCURSOR;
BEGIN OPEN main_cur; LOOP FETCH main_cur INTO deptname, inner_cur;
EXIT WHEN main_cur%NOTFOUND; dbms_output.put_line ( '-----------------' deptname ); LOOP FETCH inner_cur INTO empname; EXIT WHEN inner_cur%NOTFOUND; dbms_output.put_line( empname ); END LOOP; CLOSE inner_cur; END LOOP; CLOSE main_cur; END; /
В результате такой организации запроса мы не просто выдали список отделов и их сотрудников, но смогли обработать каждый раз возникающий перечень сотрудников программно. Если бы не было выражения CURSOR, такого рода программную обработку можно было бы организовать только заведя в программе два курсора, а не один (а при использовании в одном предложении SELECT сразу нескольких
курсорных выражений, возможно вложенных, – более чем два).
Более того, этот один программный курсор с выражениями CURSOR просто и точно указывает на логику обработки предложения SELECT (то есть играет документирующую роль), в то время как определение в программе нескольких курсоров без курсорных выражений ничего
не говорит о логике их совместной обработки, так что понять последнюю мы сможем только по процедурным конструкциям, а давно известно, что понять, что делает программа, по процедурным конструкциям гораздо труднее, чем по описаням ее структур.
Более того, при использовании курсорного выражения мы избавлены от необходимости его открывать, сразу приступая к операциям FETCH, что быстрее в исполнении и экономнее в тексте.
Резюме: использование ссылки на курсор в предложении SELECT упрощает код программной
обработки, улучшает читаемость кода и повышает эффективность его исполнения.
Ссылки на курсор могут использоваться не только в программе, но и в предложении SQL. Это обеспечивается указанием во фразе SELECT предложения SELECT выражения CURSOR для формирования столбца результата. Если мы попытаемся сделать это в SQL*Plus, результат покажется довольно неожиданым: SQL SELECT 2 dname 3 , CURSOR ( SELECT ename FROM emp WHERE emp.deptno = dept.deptno )
4 FROM dept; DNAME CURSOR(SELECTENAMEFR -------------- -------------------- ACCOUNTING CURSOR STATEMENT : 2 CURSOR STATEMENT : 2 ENAME
---------- CLARK
KING
MILLER
RESEARCH CURSOR STATEMENT : 2 CURSOR STATEMENT : 2 ENAME ---------- SMITH
JONES
SCOTT
ADAMS
FORD
SALES CURSOR STATEMENT : 2 ... ... ... ...
На деле произошло вот что: предложение SELECT ... FROM dept вернуло во втором столбце результата каждой своей строки ссылку на курсор, сформированный динамически предложением внутри CURSOR ( ... ). Программа SQL*Plus проинтерпретировала эту ссылку, перебрав строки, словно как это делали мы в примерах предыдущей статьи, и выдала строки на экран. В результате мы увидели на экране перечень четырех строк-отделов, и для каждого отдела – перечень сотрудников.
Форма выдачи занятная, но, кажется, практически бесполезная. Так зачем же нужно выражение CURSOR в предложении SELECT ? Чтобы ответить на этот вопрос, снова обратимся к программированию.
Как было показано в предыдущем разделе, при просмотре библиотечного кеша только полностью идентичные операторы SQL будут считаться идентичными. Следовательно, два оператора: select * from emp where empno=1234 и select * from emp where empno=5678
считаются различными и для их выполнения потребуются два полных разбора и две отдельных записи в библиотечном кеше. Вот почему настоятельно рекомендуется для связывания значений в прикладной программе использовать в операторах SQL переменные связывания, фактические значения которых подставляются только во время выполнения программы. Оператор, показанный выше, теперь будет таким:
select * from emp where empno=:x
Его можно выполнять много раз с различными значениями переменной связывания :x. В хорошо написанном приложении будет выполняться один разбор этого оператора, затем его можно выполнять столько раз, сколько требуется, с различными значениями переменной связывания в прикладной программе. Такой подход не только повышает производительность одной программы, он также обеспечивает масштабируемость многочисленных параллельно работающих программ, разделяющих одну и ту же копию данного оператора SQL. Корпорация Oracle рекомендует при программировании приложений всегда использовать этот подход. (Тем не менее есть исключения, об этом см. данные ниже рекомендации в разделе о специфических проблемах приложений для хранилищ данных.)
Тесты (описаны в приложении к этой статье) показывают, что надлежащая установка значения параметра cursor_sharing позволяет повысить производительность приложений, которые были написаны без использования переменных связывания. В частности, время ответа в приложениях с часто повторяющимися операторами SQL, которые отличаются друг от друга только литералами, может быть чрезвычайно большим. Кроме указанного повышения производительности, использование этого параметра также позволяет уменьшить объем потребляемой памяти, так как разделяется большее количество операторов SQL. Однако поскольку по-прежнему выполняется частичный разбор, использование приложений без переменных связывания может привести к проблемам масштабируемости, хотя и на более высоких уровнях пропускной способности.
Кроме того, тесты показывают, что надлежащая установка значения параметра session_cached_cursors может привести к некоторому улучшению масштабируемости некоторых типов приложений, в частности тех, где используются переменные связывания, но для каждого оператора SQL будут выполняться открытие и закрытие курсора или частичный разбор. Надлежащее значение этого параметра обычно находится между количеством часто выполняемых в приложении операторов SQL и значением параметра инициализации экземпляра open_cursors.
Для хорошо спроектированных приложений (многократное выполнение разобранных операторов SQL) установка параметра cursor_space_for_time = true может привести к некоторому улучшению масштабируемости за счет потребления дополнительной памяти.
Параметры инициализации cursor_sharing и session_cached_cursors позволяют разработчикам приложений немного "смягчить" несоблюдение руководящих принципов надлежащей разработки приложений. Однако чтобы полностью обеспечить масштабируемость и производительность системы баз данных Oracle, приложения следует проектировать в соответствии с руководящими принципами корпорации Oracle.
В процессе программирования приложений следует соблюдать следующие общие рекомендации:
операторы SQL, многократно выполняемые в одном и том же модуле приложения, следует связывать с конкретными курсорами, которые открываются один раз: их операторы SQL с переменными связывания разбираются один раз и выполняются многократно. Такой способ обеспечивает возможно лучшие время ответа и масштабируемость. Этого можно добиться, используя явные курсоры в программах Oracle Precompiler и надлежащим образом используя описатели операторов (statement handles) в программах Oracle Call Interface. Программы Oracle Precompiler, использующие неявные курсоры, следует запускать с параметрами HOLD_CURSOR=YES, RELEASE_CURSOR=NO для конкретных операторов SQL или с общим параметром MAXOPENCURSORS, значение которого должно быть достаточно высоким для сохранения открытыми всех часто используемых курсоров; значение этого параметра, устанавливаемое по умолчанию и равное 10, обычно слишком мало. Этот подход также используется в программах, написанных на PL/SQL, и при использовании курсоров в циклах и декларации курсоров в статическом SQL;
операторы SQL, многократно выполняемые в разных модулях приложения, для которых нельзя применить описанный выше метод, следует выполнять с использованием переменных связывания. Если это невозможно, или если в уже написанном приложении необходимо воспользоваться преимуществами использования переменных связывания, можно установить в параметре cursor_sharing значения force или similar. Однако см. ниже замечания по приложениям систем поддержки принятия решений (decision support type applications);
в общем, следует избегать частого частичного разбора операторов SQL или открытия и закрытия курсоров. Если в приложениях это все-таки используется, то некоторого улучшения масштабируемости можно добиться, установив надлежащее значение параметра session_cached_cursors, но установка этого параметра не должна подменять корректного программирования приложений;
не следует совершенно отказываться от использования в приложениях переменных связывания, полностью полагаясь на использование параметра cursor_sharing. Главное достоинство этого параметра заключается в повышении производительности существующих приложений, в которых переменные связывания не используются, что помогает избегать дорогостоящего полного разбора. Заметим, проблемы масштабируемости при обработке SQL возникают также из-за выполнения частичного разбора; использование этого параметра не помогает избавиться от частичного разбора. Заметим также, что никаких преимуществ от использования этого параметра не получают приложения, в которых фактически отсутствует многократное выполнение операторов SQL, отличающихся только литералами, а также приложения, не испытывающие реальных проблем с выполнением разбора;
как исключение операторы SQL, в частности, сложные операторы SQL, которые редко выполняются чаще одного раза, должны разбираться с использованием литералов и без использования переменных связывания, что позволит оптимизатору воспользоваться всеми преимуществами доступных статистик. Более подробно об этом см. в разделе "Особые ситуации".
Примечательно, что кроме повышения производительности, использование параметра cursor_sharing позволяет обеспечить реальное разделение операторов SQL, которые в противном случае были бы различными из-за различий в литералах (это также влияет на потребление памяти).
И еще следует упомянуть, что для некоторых приложений или некоторых частей приложений, использующих литералы, не желателен запуск с установленными значениями параметра cursor_sharing, если они отличаются от значения по умолчанию. В частности, это справедливо, если в вашем приложении используются литералы, которые не изменяются между вызовами. Примером такого оператора SQL может быть оператор со списком литералов в предикате (IN-list), типа: select * from elements where status in (1,4)
Здесь при каждом вызове оператора будут использоваться фактически одни и те же значения литералов: 1 и 4.
При обработке операторов SQL в СУБД Oracle обычно выполняется четыре или пять шагов в зависимости от типа оператора SQL:
Шаг полного разбора (hard parse), во время которого СУБД Oracle разбирает оператор SQL, проверяет его синтаксическую корректность и существование таблиц и столбцов, на которые есть ссылки в операторе.
Шаг частичного разбора (soft parse), во время которого оператор SQL связывается с конкретным сеансом и проверяются права доступа.
Шаг оптимизации (optimization), во время которого СУБД Oracle определяет лучший способ выполнения оператора SQL, используя информацию о размере различных объектов (таблиц, индексов и т.д.), к которым будет осуществляться доступ.
Шаг выполнения (execution), в котором для фактического доступа к данным используются результаты шагов разбора и оптимизации.
Для запросов (то есть операторов select) после шага выполнения следует шаг выборки (fetch), во время которого приложение действительно получает строки запроса.
Понимание обработки операторов SQL в СУБД Oracle позволяет разработчикам приложений писать масштабируемые приложения. В частности избегая полных и частичных разборов, можно существенно уменьшить накладные расходы ЦП и повысить разделение оперативной памяти.
Для выполнения первых трех шагов могут потребоваться значительное время и другие ресурсы, что обычно рассматривается как накладные расходы, так как никакой фактической обработки пользовательских данных не выполняется. Следовательно, приложения нужно писать так, чтобы минимизировать время выполнения этих шагов. Наиболее эффективный способ – по мере возможности избегать выполнения этих шагов.
Главным компонентом СУБД Oracle, задействованным в обработке операторов SQL, является библиотечный кеш (library cache), в которым кешируются текущие выполняемые операторы SQL. Во время шага разбора (с точки зрения программирования приложений существует только одна операция разбора; операции полного и частичного разбора различаются только в СУБД Oracle в зависимости от обстоятельств, описанных ниже). СУБД Oracle сначала проверяет, находится ли оператор SQL в библиотечном кеше. Если это так, то требуется только небольшая дополнительная обработка оператора, такая, как проверка прав доступа и связи с окружением сеанса, и частичный разбор. Если оператор не найден в библиотечном кеше, требуется полный разбор с проверкой синтаксиса, корректности имен таблиц и столбцов и т.д. Предшествующий тип разбора, частичный разбор, выполняется значительно быстрее полного разбора. Следовательно, в приложениях нужно избегать, в частности, полных разборов.
Во время первого выполнения оператора SQL происходит его оптимизация, то есть СУБД Oracle находит лучший путь доступа к данным (в некоторых случаях оптимизация реально выполняется во время первого шага. Это, однако, не относится к теме данной статьи). В конце концов, оператор SQL выполняется, а затем для запросов происходит выборка результирующих строк. После того как оператор разобран и выполнен, его можно эффективно выполнять, не предпринимая шагов разбора и оптимизации.
Для проверки, находится ли уже оператор SQL в библиотечном кеше, СУБД Oracle использует просмотр с хешированием, после этого выполняется просто строковое сравнение. Следовательно, только полностью идентичные операторы SQL будут рассматриваться как идентичные.
Использование переменных связывания в операторах SQL либо непосредственно запрограммированных в приложении, либо косвенно с помощью установки значения параметра cursor_sharing, в общем, позволяет повысить производительность. Однако есть случаи, когда их использование либо не оказывает никакого реального влияния на производительность, либо вы подвергаетесь реальному риску снижения ее. В этом разделе рассматриваются эти проблемы и обсуждаются пути их решения в Oracle9i.
В СУБД Oracle9i параметр cursor_sharing может иметь значение similar (аналогичные операторы), которое позволяет средствам разделения курсоров учитывать особенности запросов в системах поддержки принятия решений. Рассмотрим два оператора SQL, показанных ниже. Предположим, что таблица emp имеет индекс первичного ключа (столбец empno) и индекс столбца deptno: select * from emp where empno=1234 и select * from emp where deptno<400
В первом случае будет выполняться поиск по индексу первичного ключа, и это будет лучшим планом выполнения; решение, принятое оптимизатором не будет изменено, если литерал 1234 будет заменен другим литералом, таким, как 5678. Следовательно, курсоры могут благополучно разделяться, не оказывая никакого влияния на производительность; такие литералы называются надежными литералами (safe literals). Во втором случае с условием неравенства желательно, чтобы оптимизатор сгенерировал другой план выполнения, если, например, литерал 400 будет заменен другим литералом, таким, как 10. Следовательно, несмотря на то что два оператора SQL разбираются одинаково, они не будут иметь разделяемого плана выполнения; такие литералы называются ненадежными литералами (unsafe literals). В СУБД Oracle9i это распознавание осуществляется механизмом разделения курсоров, если значение параметра cursor_sharing – similar.
Значение similar в параметре cursor_sharing также выгодно использовать для изменения поведения механизма разделения курсоров, когда в операторах SQL используются литералы, которые фактически не изменяются между вызовами, как в показанном выше примере оператора со списком литералов в предикате (IN-list).
Кажется заманчивым в СУБД Oracle9i устанавливать параметр cursor_sharing=similar как для OLTP-систем, так и для систем поддержки принятия решений, однако существуют случаи, когда это не выгодно. В тех случаях, когда в операторах SQL есть литералы, фактические значения которых инициируют оптимизацию, а сами значения изменяются почти в каждом операторе, производительность выполнения операторов будет равна производительности выполнения операторов без разделения курсоров (то есть как при установке значения параметра по умолчанию: cursor_sharing=exact), во время которого выполняется полный разбор каждого оператора. Поэтому в таких случаях не следует использовать разделение курсоров. В тех случаях, когда фактические значения литералов изменяются лишь несколько раз, установка параметра cursor_sharing=similar может улучшить масштабируемость и сократить время ответа. Однако представляется, что это редкие случаи, установка параметра cursor_sharing=similar в общем не дает какого-либо положительного эффекта по сравнению с надлежащим программированием приложений. Результаты тестирования, приведенные в приложении, ясно показывают, что установка параметра cursor_sharing=similar реально приводит к небольшому снижению производительности, если фактическое значение литерала (инициирующее оптимизацию) изменяется между вызовами.
Бьерн Энгсиг, ,
(Bind variables and cursor sharing – new directions in Oracle9i, By Bjorn Engsig, Miracle A/S)
Источник: OracleWorld, Copenhagen, Denmark, 24-27 June 2002, (http://www.oracle.com/pls/oow/oow_user.show_public?p_event=12&p_type=session&p_session_id=15524 )
Значения 1234 и 5678 в двух примерах, показанных выше, являются константами (литералами), их использование в операторах SQL является причиной возникновения накладных расходов из-за допол-
нительных разборов и означает, что операторы SQL в библиотечном кеше не разделяются. Тем не менее при разработке многих приложений этому не уделяется должное внимание, поэтому в СУБД Oracle предусмотрено средство уменьшения влияния такого программирования на систему. Оно позволяет разделять в библиотечном кеше информацию о курсорах для тех операторов SQL, которые фактически не являются идентичными, но их различие заключается только в литералах. Реализация данного средства заключается в выполнении простого просмотра оператора SQL, во время которого все обнаруженные литералы заменяются переменными связывания. Этот просмотр выполняется перед фактическим шагом разбора, следовательно, когда СУБД будет разбирать два оператора, показанные выше, они будут заменены оператором, который будет иметь примерно следующий вид:
select * from emp where empno=:SYS_B_0
В этом операторе литерал был заменен переменной связывания, поэтому оператор станет разделяемым и полный разбор будет выполняться только один раз, соответственно уменьшая накладные расходы. Следовательно, даже для приложений, в которых не используются переменные связывания, средство автоматической замены литералов переменными связывания может принести пользу. Данный механизм управляется установкой в файле init.ora значений параметра cursor_sharing (разделение курсоров). Параметр может иметь следующие значения:
exact (точное соответствие)
Отключает данный механизм, то есть для операторов с разными литералами отключается разделение курсоров. Это значение устанавливается по умолчанию.
force (безусловное)
Включает механизм безусловного разделения операторов SQL, но только тех, которые имеют отличающиеся литералы.
similar (аналогичные операторы)
Разделение курсоров осуществляется тогда, когда известно, что оно не окажет никакого влияния на оптимизацию. Это значение не доступно в Oracle8i.
Этот параметр может быть установлен либо глобально в файле init.ora, либо динамически для всех сеансов с помощью оператора alter system или для конкретного сеанса с помощью оператора alter session. Его значение по умолчанию (exact) может быть изменено в будущих версиях СУБД Oracle.
В данной статье обсуждается эффективность разных способов выполнения операторов SQL: с использованием различных моделей программирования и параметров инициализации CУБД Oracle. Тесты были специально спроектированы, чтобы показать эту эффективность. Прогоны тестов выполнялись в испытательной системе с 24 ЦП. Ядро каждого теста – цикл, выполняющий оператор SQL одну тысяч раз, и каждый тест выполнялся как одиночная программа, а также как 3, 6, 12 и 24 параллельно выполняемых копии. Во всех случаях измерялись среднее значение суммы использованного времени всеми копиями, а также время, затраченное на ожидание защелок (время ЦП извлекалось из статистики CУБД Oracle 'CPU used by this session' – "время ЦП, использованное в данном сеансе", а время ожидания защелок из данных события 'latch free' – "время ожидания защелки, занятой другим процессом"). Абсолютные значения результатов не имеют никакого значения, но результаты можно сравнивать для демонстрации преимущества использования конкретных моделей программирования приложений или параметров инициализации CУБД Oracle.
В первом тесте используются переменные связывания, как советует корпорация Oracle для обеспечения лучшей производительности OLTP-приложений. Он демонстрирует эффективность моделей программирования, в которых каждый оператор SQL разбирается и выполняется или один раз разбирается и многократно выполняется, а также эффективность использования параметров session_cached_cursors и cursor_space_for_time startup.
Второй и третий тесты демонстрируют использование параметра cursor_sharing. Второй тест – типичный пример OLTP-приложения с надежными литералами: никакие литералы не инициируют оптимизацию и используется установка параметра cursor_sharing=force. Третий тест – вариант с ненадежными литералами, в котором используется установка параметра cursor_sharing=similar.
В первых двух тестах можно непосредственно сравнивать все полученные показатели, так как реально выполняются одни и те же операторы SQL. В разных частях третьего теста используются различные операторы SQL, поэтому результаты, полученные в разных частях теста, нельзя сравнивать друг с другом и с результатами первого и второго тестов.
Курсор – это указатель на область контекста, с помощью которого приложение выполняет операторы SQL. Приложение может открывать столько курсоров, сколько требуется – в рамках ограничений по памяти и в зависимости от значения параметра open_cursors (максимальное количество открытых в экземпляре курсоров) в файле init.ora, впоследствии курсоры связываются с операторами SQL. Для наиболее эффективного выполнения операторов SQL приложения должны иметь необходимое количество курсоров, чтобы используемые часто операторы всегда были готовы к выполнению. Для этого приложения открывают требуемое количество курсоров и выполняют разбор соответствующих операторов SQL, использующих переменные связывания. Затем, когда будут доступны фактические данные, нужно будет выполнить только шаг выполнения (и шаг выборки для запросов).
Несмотря на то что корпорация Oracle рекомендует использовать данный подход, в большинстве приложений он не применяется или, другими словами, при разработке приложений редко соблюдается эта рекомендация корпорации Oracle. Поэтому приложения либо будут постоянно открывать и закрывать курсоры, либо будут повторно использовать один курсор с различными операторами SQL (в этом случае будет выполняться, по крайней мере, частичный разбор, а во многих случаях полный разбор). Для изменения такого поведения приложений можно использовать параметр инициализации session_cached_cursors (максимальное количество курсоров, кешируемых в сеансе). В этом параметре может быть установлено целочисленное значение. В этом случае некоторая часть области контекста на стороне сервера, связанная с операторами SQL, будет сохраняться, даже если на стороне клиента будут закрываться курсоры или повторно использоваться с новыми операторами SQL.
Для хорошо написанных приложений, которые открывают курсоры и выполняют разбор операторов SQL только один раз, а затем многократно повторяют шаги выполнения одного или более курсоров, требуется некоторая работа по выделению памяти, используемой только во время фазы выполнения оператора SQL (runtime memory). Для того чтобы эта память выделялась только один раз, при первом выполнении, нужно установить в параметре cursor_space_for_time (часть области контекста курсора, используемая во время фазы выполнения) значение true (по умолчанию устанавливается значение false) - это позволит повысить производительность за счет использования дополнительной памяти. Этот параметр следует использовать только тогда, когда ваше приложение имеет строго ограниченный набор операторов SQL, который полностью размещается в разделяемом пуле (shared pool), так как издержки использования памяти могут быть очень велики.
В контексте данной статьи приложения, которые используют сходные (similar) операторы SQL (то есть операторы SQL, отличающиеся только фактическими значениями литералов), можно разделить на три категории:
1.
Приложения, в которых не используются переменные связывания. Такой стиль программирования наблюдается часто, когда разработчики приложений не осведомлены о важности уменьшения количества разборов, или когда приложения переносятся из других СУБД.
2a.
Приложения, выполняющие все шаги для каждого отдельного оператора SQL: открытие курсора, разбор с переменными связывания, выполнение (и выборка для запросов) и закрытие курсора. Это – поведение Oracle Forms при входе и выходе из блоков, а также в собственном динамическом SQL (native dynamic SQL) языка PL/SQL. Преимущества использования переменных связывания при таком подходе не очевидны программистам, работающим с интерфейсом вызовов Oracle (Oracle Call Interface, OCI) или прекомпиляторами Oracle (Oracle Precompilers), поэтому в этой среде переменные связывания встречаются редко.
2b.
Приложения, в которых для каждого оператора SQL один раз открывается курсор, а затем многократно выполняются следующие шаги: разбор с переменными связывания, выполнение (и выборка для запросов). Этот тип приложений часто наблюдается, когда разработчики приложений используют Oracle Precompilers с опциями HOLD_CURSOR=NO (не удерживать курсор) и RELEASE_CURSOR=NO (не освобождать курсор), которые устанавливаются по умолчанию, или когда используется пакет PL/SQL DBMS_SQL.
3.
Приложения, в которых для каждого отдельного (отличного от других) оператора SQL один раз открывается курсор, выполняется разбор с переменными связывания, а затем следует многократное выполнение (и выборка для запросов). Это наиболее эффективный способ разработки приложений, многократно исполняющих одни и те же операторы SQL. Обычно наблюдается в хорошо спроектированных приложениях, разработчики которых использовали Oracle Call Interface или Oracle Precompilers. Особенно это относится к Oracle Precompilers, когда для конкретных операторов SQL используются опции HOLD_CURSOR=YES (удерживать курсор) и RELEASE_CURSOR=NO (не освобождать курсор), или используется установка общего параметра MAXOPENCURSORS (максимальное количество открытых курсоров), которая определяет поведение неявных курсоров для данной категории приложений. Этот подход также используется в программах, написанных на PL/SQL, и при использовании курсоров в циклах и явных курсоров в статическом SQL.
В СУБД Oracle9i оптимизатор считывает фактические значения переменных связывания, если они доступны. В результате оптимизатор при использовании переменных связывания может использовать собранные статистики на уровне таблиц, индексов или столбцов. Это выгодно как для приложений, которые были написаны с использованием переменных связывания, так и для приложений, в которых литералы заменяются переменными связывания (при соответствующей установке значения параметра cursor_sharing).
Проведенное нами тестирование показало, что считывание значений переменных связывания работает как предполагалось: оптимизатор принимает свои решения на основе фактических значений переменных связывания. Но как только оптимизатор сгенерирует план выполнения, дальнейшего считывания значений переменных связывания не будет ни в том же самом сеансе, ни в другом, для которого выполняется разбор такого же оператора SQL. В обоих случаях оператор SQL и связанный с ним план выполнения будут найдены в библиотечном кеше.
Системы поддержки принятия решений, такие, как приложения хранилищ данных, характеризуются небольшим количеством пользователей, выполняющими сложные операторы SQL, которые имеют мало повторений или не имеют их вообще. Для каждого сложного оператора SQL также имеет важное значение то, чтобы оптимизатору для выбора правильного плана выполнения была доступна вся необходимая информация. В СУБД Oracle8i это возможно только в том случае, когда переменные связывания не используются. В Oracle8i использование переменных связывания скрывает от оптимизатора фактические значения, поэтому он для генерации лучшего плана выполнения будет использовать эвристику, вместо того чтобы потенциально использовать информацию о реальном распределении данных. Для этого типа приложений основной объем ресурсов используется не на шагах разбора или оптимизации, поэтому сокращение времени выполнения этих шагов мало влияет на общую производительностью. Важнее то, чтобы шаг выполнения не затягивался на минуты и часы, а шаг оптимизации выполнялся с возможно лучшими доступными данными, позволяющими сгенерировать наиболее эффективный план выполнения. В частности, это справедливо, если вы соберете статистики по столбцам, которые предоставляют оптимизатору детализированную информацию о доступных данных.
Таким образом, для данного типа приложений, работающих под управлением СУБД Oracle8i, не должны использоваться переменные связывания, а значение параметра cursor_sharing должно быть установлено как exact, чтобы курсоры и, следовательно, планы выполнения не разделялись.
В СУБД Oracle9i появились новые средства (значение similar для параметра cursor_sharing и считывание значений переменных связывания), которые могут помочь немного повысить производительность плохо написанных приложений. Тем не менее необходимо подчеркнуть, что возможно лучшая производительность обеспечивается использованием надлежащих методов проектирования приложений, которые фактически не изменились в СУБД Oracle9i. Эти методы можно представить очень просто:
приложения (обычно OLTP- приложения), многократно выполняющие одни и те же операции, должны инициировать разбор операторов SQL только один раз, использовать переменные связывания и реально повторять только шаг выполнения; приложения (обычно приложения систем поддержки принятия решений), выполняющие операции, которые редко повторяются, должны инициировать разбор операторов SQL, использующие литералы, чтобы у оптимизатора была возможность прибегать ко всей доступной информации.
В тестовой программе поиск по простому индексу первичного ключа выполняется так же эффективно, как и в первом тесте, но вместо переменных связывания используются литералы. Во всех тестах открытие и закрытие курсоров выполняется за пределами циклов.
1 |
3 |
6 |
12 |
24 |
|
В тесте используются надежные литералы, установка параметра cursor_sharing=exact (то есть разделение курсоров не используется). |
349 |
407 |
499 |
995
2135
В тесте используются надежные литералы, установка параметра cursor_sharing=force.
85
95
97
102
164
В тестовой программе выполняется запрос индексированного столбца таблицы с несимметричным распределением данных. Статистики столбца собраны вместе, поэтому в некоторых запросах будет использоваться полный просмотр таблицы, а в некоторых - поиск по индексу. Тесты демонстрируют эффективность использования ненадежных литералов, которые более или менее часто изменяются между вызовами, а также эффективность установки параметра cursor_sharing=similar. Во всех тестах открытие и закрытие курсоров выполняется за пределами циклов, в цикле повторяются разбор и выполнение операторов SQL. Кроме того, во всех тестах фактически используется корректный план выполнения (полный просмотр таблицы или поиск по индексу), поэтому различия в результатах не связаны с некорректным планом выполнения.
Заметим: результаты тестирования можно сравнивать только в пределах каждой подгруппы тестов (подгруппы разделены пустой строкой), так как выполняемые в разных подгруппах тесты отличаются друг от друга и имеют разную частоту изменения ненадежных литералов. Результаты нельзя также сравнивать с результатами первых двух тестов.
1 |
3 |
6 |
12 |
24 |
|
В тесте используются ненадежные литералы, которые редко изменяются, параметр cursor_sharing не используется. |
557 |
607 |
670 |
1058 |
2355 |
В тесте используются ненадежные литералы, которые редко изменяются, установка параметра cursor_sharing=similar. |
318 |
350 |
352 |
396 |
554 |
В тесте используются ненадежные литералы, которые изменяются через каждые 10 вызовов, параметр cursor_sharing не используется. |
321 |
389 |
489 |
938 |
1993 |
В тесте используются ненадежные литералы, которые изменяются через каждые 10 вызовов, установка параметра cursor_sharing=similar. |
120 |
139 |
133 |
158 |
222 |
В тесте используются ненадежные литералы, которые изменяются через каждые 3 вызова, параметр cursor_sharing не используется. |
330 |
365 |
485 |
900 |
1949 |
В тесте используются ненадежные литералы, которые изменяются через каждые 3 вызова, установка параметра cursor_sharing=similar. |
172 |
194 |
210 |
264 |
524 |
В тесте используются ненадежные литералы, которые непрерывно изменяются, параметр cursor_sharing не используется. |
316 |
358 |
468 |
846 |
1838 |
В тесте используются ненадежные литералы, которые непрерывно изменяются, установка параметра cursor_sharing=similar. |
369 |
417 |
505 |
824 |
1724 |
В тестовых программах для поиска по простому индексу первичного ключа используются переменные связывания. Тестируются различные комбинации моделей программирования и параметры инициализации. Во всех тестах открытие и закрытие курсоров выполняется за пределами циклов.
1 |
3 |
6 |
12
24
В программе повторяются разбор и выполнение оператора SQL, параметр session_cached_cursors не используется.
74
78
78
95
146
В программе повторяются разбор и выполнение оператора SQL, установка параметра session_cached_cursors=1.
68
67
66
73
83
В программе выполняется только один разбор, повторяется выполнение оператора SQL, параметр cursor_space_for_time не используется.
33
32
37
43
47
В программе выполняется только один разбор, повторяется выполнение оператора SQL, установка параметра cursor_space_for_time=true.
28
28
31
35
33
cursor_sharing | Этот параметр позволяет повысить масштабируемость и производительность приложений, которые были написаны с использованием в операторах SQL литералов, а не переменных связывания. Использование значения force этого параметра может привести к большому увеличению пропускной способности и к некоторому увеличению масштабируемости. В СУБД Oracle8i в системах поддержки принятия решений и приложениях хранилищ данных его следует использовать осторожно или не использовать вообще. В СУБД Oracle9i появилось новое значение этого параметра similar, которое во многих случаях позволяет разделять курсоры в системах поддержки принятия решений и приложениях хранилищ данных. |
Хотя многие задачи data mining резервируются за аналитиками данных, бизнес-пользователи, похоже, чувствуют себя комфортно с деревьями решений. Эти деревья логичны, хорошо воспринимаются визуально, и результат может быть объяснен в типичных бизнес-терминах.
Использование дерева решений - это способ классификации существующих данных, определения факторов или правил, которые имеют отношение к целевому результату (target result), и их применения для прогнозирования результата, что означает:
Бизнес-пользователи могут определять факторы, которые в наибольшей степени влияют на решения о покупках; Департаменты маркетинга могут "целиться" в "правильные" группы потенциальных клиентов, исключая тех, кто с малой вероятностью будет покупать; Аналитики данных и финансовые аналитики могут прогнозировать продажи благодаря анализу атрибутов потенциальных клиентов, о которых есть данные; Бизнес-аналитики могут корректировать цели и стратегии при изменениях тенденций; Компании могут реорганизовывать поддержку (support, enhancements, and desupport) для обеспечения максимального удовлетворения клиентов
И не нужно быть доктором философии (PhD) в математике, чтобы использовать и понимать деревья решений. Чтобы проиллюстрировать это, я проанализирую одну бизнес-задачу:
Производитель предлагает два продукта, A и B. В целом отзывы потребителей были положительны, но владелец предприятия-производителя хочет узнать, что-то можно изменить в поддержке, что может повысить уровень удовлетворения потребителей. У предприятия есть весьма ограниченная информация о своих потребителях, включая только данные о продукте, который они используют, его версии и времени получения его последней модификации.
С использованием этой информации, полученной от выборки по клиентской базе (sample customer population), и Oracle Data Miner это предприятие может создать модель дерева решения, показанную на рис. 1.
Рис. 1: Дерево решений
Каждый прямоугольник в дереве на рис. 1 называется узлом (node) и каждая линия называется веткой (branch) или ребром. Верхний прямоугольник в дереве (или его корень (root)) включает все значения (all cases) этой выборки.
Вы когда-нибудь размышляли о том, кто из ваших потенциальных покупателей c высокой степенью вероятности станут вашими реальными покупателями, или кто обеспечит наиболее доходные сделки? На кого вы должны нацеливаться в своей маркетинговой компании и что будет важным для них, когда они начнут звонить? Какие продукты, версии продуктов, предоставят вашим клиентам то, что им нужно, а какие нет и, тем самым, негативно отразятся на вашей компании? Oracle Data Miner поможет перебросить мост между вопросами бизнеса, такими как эти, и техническими и статистическими задачами, которые имеют отношение к "раскопкам" (mining) данных для ответов.
Oracle Data Miner может проанализировать существующий набор данных из вашего хранилища данных и классифицировать те данные, которые определяют или прямо соотносятся с желаемым результатом или целью. Конкретнее, при классификации данных (data classification) обнаруживаются patterns (паттерны, шаблоны) и отношения с целью группирования подобных записей для последующего более легкого и эффективного анализа. В этой статье рассматривается один конкретный тип классификации, называемый decision trees (деревья решений).
Oracle Data Miner позволяет легко генерировать деревья решений. Чтобы показать это, я сгенерирую дерево решения на рис. 1. Для этого нужно скачать и установить Oracle Data Miner и выполнить следующие шаги по подготовке вашего источника данных для данного примера:
1. Скачать sample data file.
2. Раскрыть (Unzip) содержание (contents), открыть подсказку и перейти (cd) к директории, содержащей скрипт create_user.sql.
3. Подключиться (Log in) к SQL*Plus под именем SYSDBA, и выполнить скрипт create_user.sql.
Этот скрипт создает пользователя SURVEYS с паролем SURVEYS, и предоставляет ему все необходимые полномочия (permissions). Он соединяется с SURVEYS, создает таблицу CUSTOMER_SATISFACTION и вносит в нее 4920 записей. Структура этой таблицы показана в Listing 1.
Code Listing 1: Описание таблицы CUSTOMER_SATISFACTION SQL> desc CUSTOMER_SATISFACTION
CUSTOMER_SATISFACTION_ID NOT NULL NUMBER(10) PRODUCT VARCHAR2(100) VERSION NUMBER(2) LAST_UPGRADE_YEAR VARCHAR2(4) FEEDBACK VARCHAR2(10)
Данные хранятся в этой таблице следующим образом:
CUSTOMER_SATISFACTION_ID - это первичный ключ и, следовательно, уникальный идентификатор. PRODUCT - может быть A или B. VERSION - это 1, 2 или 3. LAST_UPGRADE_YEAR - это год последней модификации в диапазоне 1999-2006. FEEDBACK - это либо POSITIVE (положительно), либо NEGATIVE (отрицательно).
Чтобы запустить Oracle Data Miner, найдите bin-директорию, в которую вы распаковали этот скачанный продукт, и дважды нажмите по odminerw.exe. Предоставьте информацию о соединениях в схеме SURVEYS (SURVEYS/SURVEYS), когда появится соответствующая подсказка, и нажмите OK, чтобы сохранить детали соединений. Нажмите OK еще раз, чтобы соединиться и показать интерфейс Oracle Data Miner (см. рис. 2).
Рис. 2: Интерфейс Oracle Data Miner с выбранной таблицей CUSTOMER_SATISFACTION
Отметим, таблица CUSTOMER_SATISFACTION с данными выборки показана справа. Вы можете позднее посмотреть эту таблицу, нажав SURVEYS -> Data Sources -> Tables-> CUSTOMER_SATISFACTION.
Одна из первых книг по бизнесу и статистике, которые я прочитал, называлась "Как врать, используя статистику" (How to Lie With Statistics), Даррелла Хаффа (Darrell Huff). Нет, это не учебник по тому, что заявлено в названии. Наоборот, в этой книжечке рассматривались распространенные ошибки, приводящие к неверным выводам, при применении статистического анализа - и не из-за ошибочных вычислений, а вследствие неправильных определений проблем, неаккуратных или неполных данных. Поиск смысла там, где его нет, и пропуск смысла там, где есть хоть какой-то, поиск неверного смысла в неверных статистических данных, все это обсуждается (в книге). Следующий полностью вымышленный пример показывает такой тип анализа:
Люди с ростом более 2.25 метра намного менее вероятно пострадают в автоаварии, чем менее высокие . . . и заголовки новостей по всей стране кричат, "Исследование подтверждает, что действительно высокие люди намного сильнее и более стойки, чем невысокие."
А не могло ли дело обстоять так, высокие люди скорей чаще всего пользуются большими автомашинами? Либо вместо процентов при формировании статистики использовались "сырые" (raw) числа? Как много людей в группе очень высоких, особенно в сравнении с группой невысоких?
Oracle Data Miner легко выполняет анализ данных в части математики и программирования, но определение проблемы, отбор данных и корректное применение результатов целиком остается на пользователе. Но если проблема определена правильно, вы можете положиться на результаты.
Чтобы увидеть, как построение этого дерева решений будет применено к индивидуальных записям, откройте результаты построения еще раз, переходя к Mining Activities -> Classification, выбирая CUSTOMER_SAT_1, нажимая Result link в Build activity, и нажимая Show Leaves Only в верху окна Result Viewer. С каждым листом ассоциируется правило расщепления, которое появляется внизу данного окна, если щелкнуть по соответствующему узлу.
Например, последний лист (Node ID = 20 на Рис. 4) предсказывает отрицательный ответ со 100% уверенностью. Нажмите этот узел и следующее правило расщепления появится внизу: PRODUCT is in A AND LAST_UPGRADE_YEAR is in { 1999 2001 2002 }
Для любой записи, соответствующей этому правилу, будет предсказан отрицательный ответ со 100% уверенностью.
Данные о клиентах, не попавших в выборку, хранятся в таблице CUSTOMER_SATISFACTION_NEW. Все колонки содержат значения, кроме FEEDBACK. Чтобы обнаружить, какие ответы, положительные или отрицательные, будут получены, применим правила построения CUSTOMER_SAT_1, следующим образом: Откройте главное окно Oracle Data Miner и выберите Activity -> Apply из главного меню. Первая страница для приветствий. Нажмите Next. На шаге 1 из 5: Создать действие (Build Activity), выберите CUSTOMER_SAT_1. Нажмите Next. В шаге 2 из 5: Примените данные (Apply Data), нажмите Select link вправо от таблицы и перейдите к SURVEYS -> CUSTOMER_SATISFACTION_NEW. Нажмите Next.
В шаге 3 из 5: Дополнительные атрибуты (Supplemental Attributes), выберите только колонку CUSTOMER_SATISFACTION_ID. Нажмите Next. На шаге 4 из 5: Примените Опцию (Apply Option), Оставьте значения по умолчанию (default settings). Нажмите Next. На шаге 5 из 5: Дайте имя действию (Activity Name), назовите его CUSTOMER_SAT_APPLY_1. Нажмите Next. Нажмите Finish.
Когда это действие завершится, нажмите Result link в окне действий (activity window), чтобы увидеть предсказанное значение; вероятность, связанную с этим предсказанием; и стоимость (cost), которая похожа на ранжирование вероятностей, за исключением того, что меньшая стоимость означает лучшее предсказание.
Oracle Data Miner позволяет также увидеть, какие правила были использованы для каждой записи. Нажмите одну из записей, а затем Rule button справа от результатов. Просмотрщик правил Rule Viewer появится, как показано на рис. 5.
Рисунок 5: Просмотрщик правил Rule Viewer
Рон Хардман
Оригинал: , Oracle Magazine March/April 2007
Перевод: Oracle Magazine - Русское издание (Июль-Август 2007)
[От редакции OM/RE: Корпорация Oracle последовательно развивает свои продукты класса Data Mining (принятый русский перевод этого термина - "глубинный анализ данных" - см. http://www.rdtex.ru/docs/glossary), наращивая их функциональность и делая их более "дружественными" и легкими в использовании. Чтобы эффективно эти продукты, необходимо понимание методов Data Mining. Помимо материалов корпорации Oracle на эту тему, уже есть немало материалов и на русском языке, в частности в Интернете, которые легко найти через поисковые системы.
Одним из наиболее понятных методов Data Mining являются деревья решений. Поддержка этого метода недавно была реализована в продукте Oracle Data Miner и она рассматривается в данной статье.]
Согласно новой архитектуре Oracle Data Mining функции data mining переносятся в базу данных. В комплекте Oracle Data Mining Suite Release 3.7 данные выбираются из базы данных, где происходит все манипулирование с данными, раскапывание и зачет (mining, and scoring). Пользователи взаимодействуют с этим ПО через графический интерфейс Windows.
Новые продукты data mining от корпорации Oracle (см. ниже) будут использовать более тесную интеграцию с базой данных для минимального перемещения данных и максимального доступа пользователей. Используя более тесную интеграцию с базой данных, новая архитектура data mining облегчит агрегирование данных из различных источников. Данные, как традиционного офлайнового бизнеса, так и е-бизнеса могут быть более легко консолидированы, управляемы, "раскопаны" для большего понимания и получения полного представления об этом новом клиенте.
Пользователи смогут использовать функциональность data mining через браузер тонкого клиента и API на основе Java.
Продукт Oracle Personalization разработан на основе концепции базы данных в оперативной памяти для обработки с нужной скоростью больших объемов данных, связанных сWeb. Реализации алгоритмов Naive Bayes и Associations algorithms для параллельных компьютерных архитектур обеспечивает проникновение в суть процессов Интернет-пользователям как в режиме реального времени, так и неопративном режиме. Средства data mining в Oracle Personalization реализованы на стороне сервера и используют возможности параллельных многопроцессорных (SMP) систем, так что можно использовать общую мощность множества компьютеров и выполнять анализ в "n" раз быстрее и "раскапывать" в "n" раз больше данных Web-сайтов. Механизмы рекомендаций обслуживают Web-сайты предприятия в режиме реального времени.
Давайте рассмотрим, что такое Data Mining, и чем он дополняет и отличается от средств выдачи запросов и формирования отчетов, OLAP и других аналитических средств.
"Попросту говоря, data mining обычно используется для обнаружения
(скрытых) закономерностей в ваших данных для того, чтобы помочь
вам принимать более лучшие деловые решения."
Роберт Смолл, Two Crows Corporation
Data mining помогает найти скрытые ранее закономерности и отношения в ваших данных для того, чтобы можно было принять более обоснованные решения. А теперь рассмотрим некоторые обшеизвестные определения.
Средства формирования запросов и отчетов помогают выбрать информацию из базы или хранилища данных. Они вполне хороши при ответе на вопросы типа: "Кто покупал заемные ценные бумаги за последние 3 года?"
Средства OLAP идут дальше этого, обеспечивая получение итогов, сравнений и предсказаний путем экстраполяции. OLAP хорош при проведении детализации (drill-down) для получения более подробных данных, таких как: "Каково распределение по доходу покупателей заемных ценных бумаг (mutual funds)?"
Средства формирования запросов и отчетов, а также OLAP, хороши тогда, когда пользователю нужна детализация и понимание того, что произошло в прошлом. Data Mining идет дальше, анализируя прошлое для того, чтобы предсказать будущее.
Data mining "углубляется" в данные, чтобы открыть полезные закономерности и нюансы, которые "погребены" в данных из-за огромного размера этих данных и сложности проблем. Data mining хорош при обнаружении тонких нюансов (detailed insights) и совершении индивидуальных предсказаний типа: "Кто, возможно, купит заемные ценные бумаги в следующие 6 месяцев и почему?" Средства формирования SQL-запросов и отчетов полезны при детализации данных . Если вы знаете, что ищете в своей огромной корпоративной базе данных, располагаете хорошим инструментом, хорошим аналитиком и у вас полно времени, вы постепенно найдете ответ. Средства OLAP и статистического анализа превосходны для извлечения информации с целью анализа и получения отчетов, но они могут отказать, когда объем данных становится чрезмерным для этих средств. Кроме того, когда вы имеете дело с более чем, к примеру, 25 входными переменными, техника традиционного статистического регрессионного анализа отказывает.
Чарльз Бергер, подразделение корпорации Oracle по развитию Data Mining
Источник: "Oracle’s Data Mining Solutions", Oracle OpenWorld White Paper, Конференция OOW2000, San Francisco, доклад 134,
http://openworld.oracle.com,
перевод на русский язык "Oracle Magazine/Русское Издание" №1, 2001г.
Data mining предлагает иной, "вверх дном" (bottom-up) подход. Data mining "просеивает" данные ("sifts" through the data), одну запись и одну переменную за один раз, раскрывая ранее скрытую информацию, которую, вы, наверное, раньше никогда не раскрывали, просто вследствие огромного количества данных. Разработаны масштабируемые инструменты data mining для решения этих сложных и больших, насыщенных данными и требующих большой вычислительной мощи проблем.
Давайте рассмотрим пример, чтобы понять как работает data mining.
Data mining просеивает данные, запись за записью и переменная за переменной. Разработан ряд методов, алгоритмов для data mining (или обучения машины - machine-learning) для поиска закономерностей (patterns) в данных, такие как нейронные сети (neural networks), деревья решений (decision trees) и алгоритмы кластеризации (clustering algorithms).
В этом случае мы используем алгоритм "дерево решений" для ответа на вопрос: "Кто, возможно, купит автомашину Buick?" При каждом расщеплении дерева клиенты делятся на две группы. В данном примере первое расщепление происходит на основе возраста и второе - на основе пола. Отметим, что по мере того как data mining "вкапывается" все глубже и глубже в данные, он создает все больше "отфильтрованных" (refined) сегментов однородных групп клиентов с похожим поведением.
Каждый конечный узел предоставляет "правило" ("rule"), которое описывает группу клиентов. Чем глубже вы спускаетесь по дереву, добавляя характеристики "правилу", тем выше уровень "уверенности" ("confidence") в точности предсказания. Например, правило нижнего левого узла дерева таково "Родители владеют автомобилем Buick, Мужчина, возраст более 45 лет" ("Parents owned Buick, Male, and Age is over 45") с уровнем уверенности 92%, что клиент с этим профилем купит Buick. Обладая такой информацией, компании могут взаимодействовать с клиентами индивидуализировано.
Корпорация Oracle предлагает своим пользователям набор продуктов класса и сервисов класса Data Mining (Добыча Данных или ИАД (Интеллектуальный Анализ Данных)). Этот набор помогает компаниям понять и предвидеть поведение клиентов (покупателей, заказчиков) и создавать полные интегрированные решения по управлению отношениями с клиентами (CRM).
В настоящее время вы можете использовать комплект Oracle Data Mining Suite (ранее известный как "Oracle Darwin") для построения моделей предсказания (predictive models), обнаруживающих скрытые в ваших данных закономерности и новую ценную информацию, которая может быть использована:в системах раннего обнаружения экстремальных ситуаций;для более полного понимания поведения и запросов клиентов и рыночной ситуации;для определения эффективности различных видов продаж;как помощь в борьбе со злоумышленниками.
Информация, извлеченная из данных таким образом, обеспечивает бизнес-анализ, результатом которого является улучшение отношений с клиентами и, тем самым, увеличение доходов и экономия в основном бизнесе.
В этой статье обсуждаются:преимущества Data Mining;определение Data Mining;обзор возможностей комплекта Oracle Data Mining Suite;функциональность Data Mining в приложении Oracle CRM 11I;новый продукт для персонализации и Data Mining в среде Web;будущее Data Mining от Oracle.
Oracle Data Miner расширяет концепцию Oracle Personalization применительно к типовым применениям data mining и предлагает аналогичный пользовательский интерфейс, а также адаптированные "методологии", разработанные для решения предварительно определенных проблем бизнеса - например, модели формирования ответов и лояльности ( loyalty and response modeling). Oracle Data Miner предлагает для тонкого клиента с браузером пользовательский интерфейс к большинству стандартных функций Oracle Data Mining Suite Release 3.7.
Oracle Data Miner заменит функциональность Oracle Data Mining Suite, упрощая, автоматизируя и расширяя применение функциональности data mining. Oracle Data Miner будет более тесно интегрирован с СУБД Oracle9i для быстрого преобразования данных, более быстрого построения моделей, автоматизированного "подсчета очков" ("scoring") и
запоминания результатов в базе данных. Мастеры шаг за шагом проведут пользователя через этапы data mining, но позволят пользователям-экспертам настроить значения по умолчанию. С продуктом Oracle Data Miner сотрудники, ведущие маркетинг на основе базы данных могут принять значения по умолчанию, чтобы подготовить данные для анализа и получить специфичную для приложения помощь и советы. Результаты data mining, например, "отчет о неопределенных рисках" ("churn jeopardy report"), могут быть автоматически созданы и показаны с использованием средств корпорации Oracle для формирования запросов и отчетов.
Oracle Data Miner делает обоснованные предположения о том, как обрабатывать данные и предоставляет рекомендации пользователю для принятия или отклонения.
Oracle Data Miner автоматизирует задачи применения моделей data mining к "неклассифициремым"("unclassified") данным и размещения результатов в базе данных для доступа других пользователей и приложений. Стандартные отчеты, такие как отчеты "Наболее рискованные операторы" ("High Risk Churners") и "Наиболее вероятные респонденты" ("Likely Responders") создаются автоматически.
В настоящее время [обзор составлен в 2000 г. - прим. ред.] Oracle Data Miner запланирован к выпуску вскоре после выхода коммерческой версии Oracle9i.
В Антона Шмакова к этой статье кратко рассматриваются история Data Mining в Oracle и состояние дел на конец 2007 г.
Комплект Oracle Data Mining Suite Release 3.7 - это программный продукт data mining, выполняющийся на UNIX-сервере, который предоставляет легкость использования и богатую функциональность для решения сложных проблем. Oracle Data Mining Suite находит скрытые закономерности в данных, строит модели предвидения (predictive models) и помещает свои "предвидения" ("predictions") и "интуиции" ("insights") в базу данных для использования другими приложениями и пользователями Oracle. Иначе говоря, Oracle Data Mining Suite - это "производитель" ("producer") ценной новой информации для других "потребителей" ("consumers") данной организации.
Oracle Data Mining Suite предоставляет легкий в использовании, интуитивно понятный пользовательский интерфейс. Oracle Data Mining Suite предлагает мастер-утилиты (wizards) для упрощения и автоматизации шагов data mining. Например, мастер Key Fields в Oracle Data Mining Suite автоматически находит переменные, которые наиболее нужны (максимально влияют) при решении некоторого конкретного вопроса. Мастер Model Seeker автоматически строит многие модели data mining, показывает интерактивные графы (interactive graphs) и таблицы результатов, а также рекомендует наилучшие модели.
Oracle Data Mining Suite предлагает всю эту функциональность в дружественной пользователю среде, которую бизнес-аналитики могут использовать, причем они могут использовать мощные, возможно, многопроцессорные (SMP) системы и, благодаря этому, смогут "раскапывать" огромные массивы данных и извлекать больше ценной информации.
Oracle Data Mining Suite может получать данные из различных сетевых источников данных. Oracle Data Mining Suite извлекает информацию из баз данных Oracle, используя технологию прямого доступа к данным Oracle (OCI). Корпорация Oracle также предоставляет шлюзы (gateways) к данным, хранимым в других базах данных. Как только вы обеспечите Oracle Data Mining Suite данными, вам часто будет нужно подготовить эти данные для анализа, и Oracle Data Mining Suite предоставляет обширный набор функций преобразования, таких как отбор образцов (sampling), случайный выбор (randomization), генерация новых вычисляемых полей, обработка (handling) отсутствующих значений, слияние (merging), замена значений, расщепление набора данных в последовательность (train) поднаборов, тестирование и наборы данных для сверки (evaluation datasets) и так далее.
На фазе построения моделей Oracle Data Mining Suite предоставляет множество алгоритмов -C&RT, деревья классификации и регрессии (classification and regression trees), также известных как деревья решений, нейронные сети (neural networks), алгоритм нахождения ближайших k соседей (k-nearest-neighbors technique of memory-based reasoning) и кластеризация (clustering). Все эти алгоритмы полнофункциональны (full-featured), протестированы, документированы и хорошо поняты.
Кроме того, они очень мощны, так как все они были реализованы таким образом, чтобы использовать аппаратуру параллельных вычислений для скорости и обработки больших объемов данных - гигабайтов и терабайтов.
Перечислим некоторые основные функции Oracle Data Mining Suite Release 3.7:Мастеры прямого импорта и экспорта для доступа к данным из баз данных Oracle и запоминания результатов и предвидений Oracle Data Mining Suite в этих базах данных.Мастер Model Seeker, который автоматически строит многие различные модели data mining, представляет результаты в интерактивных графах и таблицах, а также рекомендует лучшие модели.Задание вычисляемых полей, которое позволяет пользователям создавать новые выводимые поля, используя более 100 формул - статистических, математических, сравнения и булевской логики.Функция показа интерактивного дерева (interactive Tree), которая позволяет пользователям просматривать и запрашивать деревья решений и правила, генерируемые Oracle Data Mining Suite.Мастер Key Fields, который автоматически просеивает данные, используя серию погружений по C&RT в данные для определения полей, которые наиболее нужны при решении некоторой конкретной проблемы. Результат мастера Key Fields может быть полезным поднабором полей данных для ввода в OLAP.
Oracle Personalization - это новое средство, которое будет доступно с базой данных Oracle9i. Это средство обеспечит персонализацию в масштабе реального времени для каналов продаж е-бизнеса, таких как Web-магазины, среды сдачи приложений в аренду и центры обработки звонков. Oracle Personalization предоставляет интегрированный механизм выдачи рекомендаций (в масштабе реального времени), который будет полностью встроен в СУБД Oracle9i.
Oracle Personalization разработан для решения проблем обработки огромных объемов данных Web и обеспечить персональные (1:1) отношения, которые необходимы е-бизнесу, чтобы выдерживать современный уровень конкуренции. Поскольку Oracle Personalization будет использовать масштабируемость Oracle9I, этот продукт сможет анализировать большие объемы данных о клиентах, в то же время сохраняя индивидуальные отношения с клиентами.
Oracle Personalization использует технологию data mining, чтобы просеить горы данных электронного бизнеса, сгенерированных пользователями при посещении web-сайтов (click), транзакциями, а также демографические данные и данные рейтингов, собранные с Web-сайтов. Oracle Personalization предоставляет механизм рекомендаций в масштабе реального времени и отвечает на такие вопросы, как:Какие N предметов персона A наиболее вероятно купит (или они, предметы, ему нравятся?Люди, которые купят или им нравится, предмет X, возможно, купят или им понравится какие-то другие предметы?Насколько вероятно, что персона A купит или ей понравится предмет X?Какие N предметов персона A наиболее вероятно купит или ему они понравятся при условии, что он покупает или ему нравится какой-то другой предмет?Какие дополнительные N предметы наиболее похожи на предмет X?
Oracle Personalization помогает компаниям установить истинно однозначные (1:1) отношения через Internet, предоставляя для работы с е-клиентами индивидуализированные рекомендации, оценки вероятности того, что этому клиенту подойдут эти рекомендации и улучшенную навигацию по сайту на основе интересов и профилей клиентов.
Oracle Personalization позволяет пользователям создавать "фермы механизмов рекомендаций" ("recommendation engine farms"), которые предоставляют индивидуализированные рекомендации Web-сайтам на основе анализа поведения Web- клиентов. Модели предсказания Oracle Personalization могут модифицироваться периодически, т.е. ежедневно, еженедельно, ежемесячно и использоваться механизмами рекомендаций.
Данные собираются из различных источников: служб обслуживания клиентов, ввода заказов, продаж, а также из web-сайтов и т.д. Данных много, но как использовать их должным образом? Как получить полное представление о клиентах? Как узнать, что покупатель, который только что купил товар в вашем магазине, это тот же самый человек, который оставил жалобу на вашем web-сайте или просматривал ваш сайт в поисках других товаров и услуг? Как можно получить полное (360 градусов) представление о клиенте, если все данные о нем находятся во многих и столь различных источниках данных?
Ответ - в ваших данных! Вы должны консолидировать все эти данные в один источник с унифицированным представлением о пользователе, в рамках которого агрегируются все данные. Большая возможность заключается в исследовании, "раскопке" этих данных с целью лучшего понимания своих клиентов и предвидения их потребностей. Исследуя эти данные, вы можете найти подробные профили своих лучших клиентов, а затем найти других клиентов, которые соответствуют этим профилям. Вы сможете предвидеть их запросы и предложить им товары и услуги, которые их удовлетворят, удержать этих людей в качестве своих клиентов и увеличить доходы, благодаря продаже им дополнительных товаров и услуг.
Проблема заключается в том, как использовать, обработать должным образом эти данные? Как определить наиболее релевантные, имеющие наибольшее значение для данного вопроса, данные? Какие факторы определяют удовлетворенность клиентов? Часто настоящая ценность данных скрыта в деталях, относящихся только к отдельным клиентам. Но со всей информацией такого рода есть риск утонуть в данных, если вы не сможете с ними справиться.
В условиях современной конкурентной экономики критическое значение для предприятий приобретает управление их наиболее ценными активами - клиентами и информацией о них. Именно здесь Data Mining может помочь. Data Mining поможет проанализировать огромные массивы и найти скрытую, но ценную информацию, которая может помочь вам лучше понять своих клиентов и предвидеть их поведение. А конкретнее, именно комплект Oracle Data Mining Suite поможет вам это сделать.
Вооружившись этой ценной информацией, можно выстроить более близкие отношения с клиентами, понять их, что позволит:лучше удерживать клиентов и избежать "пены", ненужных действий;составлять профили клиентов и понимать их поведение;поддерживать и повышать уровень прибыли;сократить затраты клиентов при покупках;выходить на клиентов с нужными им предложениями.
Комплект Oracle Data Mining Suite поможет выйти за пределы, доступные традиционным генераторам отчетов, которые сообщают только что произошло. А этот комплект проанализирует прошлое и использует его, как основу для предсказания будущего. Анализируя профили ваших лучших клиентов, Oracle Data Mining Suite поможет идентифицировать других людей, кто пока не являются вашими наиболее ценными клиентами, но соответствуют профилям тех, кто ими уже стал. Знание "стратегической ценности" клиентов - тех, кто могут стать ценными в будущем и тех, кто вряд ли станет такими, - является ключевым условием для активного управления бизнеса.
В приложение Oracle CRM 11i добавлены средства data mining для проведения сфокусированных целевых маркетинговых кампаний, направленных на списки клиентов, которые с большой вероятностью ответят на предложения. Oracle Data Mining Suite может быть применен, используя разумно заданные значения по умолчанию, для ответа на некоторый ограниченный набор предварительно специфицированных бизнес-вопросов, включая:Какие клиенты, возможно, ответят предложение, сделанное по электронной почте или по прямой адресной рассылке?Какие клиенты, возможно, останутся лояльными?Какие клиенты будут "доходными"?
Пользователи CRM могут разрабатывать целевые кампании, выбирая кнопку "Audience" и отвечая на несколько простых вопросов. Для этих пользователей вся подготовка данных, анализ (data mining) и "зачет" ("scoring") данных производятся автоматически.
Отныне приложение CRM 11i Marketing Online позволяет бизнес-аналитикам и профессиональным сотрудникам маркетинга воспользоваться мощью data mining без необходимости изучения сложных методов аналитики и выполнения интенсивной подготовки данных.
Менеджеры, изучающие рынок, могут просто выбрать верхнюю десятку потребителей, которых и определить, как наиболее вероятных респондентов, отвечающих некоторому типу поведения.