Разработка Приложенийс помощью pureXMLНиколай Куликов, IBM EE/[email protected]

Содержание

Слайд 2

Agenda
Немного основ
Интеграция в различные среды/языки разработки
Java
.Net
Ruby, PHP, Python
Рекомендации по использованию pureXML
Планы на

Agenda Немного основ Интеграция в различные среды/языки разработки Java .Net Ruby, PHP,
будущее Viper II

Слайд 3

XML-Enabled Databases: две опции

XML
DOC

Извлечение определенных элементов/
атрибутов

Сторонние таблицы

CLOB/Varchar

XML DOC

XML DOC

XML DOC

XML
DOC

varchar
CLOB

Фиксированное

XML-Enabled Databases: две опции XML DOC Извлечение определенных элементов/ атрибутов Сторонние таблицы
отображение

Shredder

(regular tables for faster lookup)

Обычные таблицы

“Decompositon”

Shredding

Слайд 4

XML в DB2 SQL и XML одинаковы в DB2

Множество интерфейсов для запросов
SQL/XML и

XML в DB2 SQL и XML одинаковы в DB2 Множество интерфейсов для
XQuery
Оба языка имеют полный доступ ко всем хранимым данным
Выбор представления данных которое больше подходит для приложения

XML возможности встроены в DB2
Глубока интеграция XML подразумевает высокую производительность!
Оптимизированное хранение данных
Новое хранилище и индексы для XML

Сервер

Клиент

SQL/XML

XQuery

DB2 Engine

XML
Interface

Relational
Interface

Relational

XML

DB2 Storage:

DB2 Client /
Customer Client
Application

Слайд 5

Таблицы строк и путей

Strings & Paths table per database
Database wide dictionary…
…for all

Таблицы строк и путей Strings & Paths table per database Database wide
documents in all XML columns

SYSIBM.SYSXMLSTRINGS SYSIBM.SYSXMLPATHS

Слайд 6

“Компрессия"

“Компрессия"

Слайд 7

DDL for Index on XML column

Declaration & use of namespace prefix supported

DDL for Index on XML column Declaration & use of namespace prefix
(not shown above)

AS SQL VARCHAR (integer)

CREATE

index-name ON table-name

(xml-column-name) GENERATE KEY USING XMLPATTERN xmlpattern-constant

UNIQUE

INDEX

DOUBLE

DATE

TIMESTAMP

VARCHAR (HASHED)

xmlpattern-constant:

xmlpattern = XPath without predicates, only child axis (/) and descendent-or-self axis (//)

create index idx1 on T(xmlcol) generate key using xmlpattern '/a/b/@c' as sql date

Слайд 8

Требования разработчиков

Быстрая разработка приложений БД
Работа в рамках одной среды Eclipse/Visual Studio/Zend Core/Ruby
Эффективное

Требования разработчиков Быстрая разработка приложений БД Работа в рамках одной среды Eclipse/Visual
использования API надстроек над ним
Разработка и отладка клиентской и серверной логики в рамках среды Eclipse/.NET/Zend Core/Ruby
Управление новыми требованиями к данным
Интеграция с гетерогенными системами

Слайд 9

Интеграция в среды Eclipse

Интеграция в среды Eclipse

Слайд 10

Интеграция в среды .Net

Интеграция в среды .Net

Слайд 11

Новые возможности Add-ins для MS VS 2005

Возможность генерации DB2 Web Services без

Новые возможности Add-ins для MS VS 2005 Возможность генерации DB2 Web Services
кодирования
Возможность создания и отладки SQL и CLR процедур
Регистрация и работа со схемами в DB2
Поддержка других серверов БД DB2 Informix IDS, DB2/iSeries, DB2 z/Series.

Слайд 12

DB2 data provider for .NET Version 2.0

Поддержка базовых классов System.Data.Common
Эквивалентность типов данных

DB2 data provider for .NET Version 2.0 Поддержка базовых классов System.Data.Common Эквивалентность
DB2 и .NET
Поддержка 64-bit
Scrollable and updateable result sets
Data Paging
Класс DB2Command теперь имеет ExecutePageReader
Bulk Data Copy
Update batch size
Позволяет приложению определять сколько операторов за раз будет отправлятся на сервер DB2 для обработки

Слайд 13

Поддержка репозитория XML схем (XSR)

Новый узел в.Net server explorer
Полная интеграция с редактором

Поддержка репозитория XML схем (XSR) Новый узел в.Net server explorer Полная интеграция
XML схем в .NET
Регистрация XML в XSR
Удаление XML из XSR
Модификация или аннотация XML схемы IBM DB2 XML

Слайд 15

Concurrent Data Readers

//Open connection to the database
DB2Connection conn = new DB2Connection

Concurrent Data Readers //Open connection to the database DB2Connection conn = new
("database=sample;");
conn.Open();
//Create 2 commands from the same connection
DB2Command cmd1 = conn.CreateCommand();
DB2Command cmd2 = conn.CreateCommand();
cmd1.CommandText = "SELECT SALES_PERSON, SALES FROM SALES";
cmd2.CommandText = "SELECT DEPTNUMB, DEPTNAME FROM ORG"
//Execute the first query
DB2DataReader dr1 = cmd1.ExecuteReader();
//Execute the second query while the first one is still open
DB2DataReader dr2 = cmd2.ExecuteReader();
//Get results from both data readers
while (dr1.Read())
{
Console.WriteLine(" Sales Person {0}, Sales {1}" dr1.GetString(0), dr1.GetInt16(1));
}
while (dr2.Read())
{
Console.WriteLine(" Department Number {0}, Department Name {1}" dr2.GetInt16(0), dr2.GetString(1));
}
//Close both data readers
dr1.Close();
dr2.Close();
conn.Close();

Слайд 16

JDBC и XML обзор

JDBC и XML сегодня
Расширения DB2 для JDBC XML
JDBC и

JDBC и XML обзор JDBC и XML сегодня Расширения DB2 для JDBC
XML Завтра (JDBC v4)
Java's XML APIs
DOM, SAX, StAX, and Transform (XSLT)

Слайд 17

JDBC and XML today

JDBC сегодня имеет минимальные возможности по поддержке pureXML
Извлечение/обновление XML

JDBC and XML today JDBC сегодня имеет минимальные возможности по поддержке pureXML
значений
XML как параметры
SQL поддерживаются через JDBC
XQuery встроен в SQL
Параметры XQuery сначала проходят через SQL
Java 1.4 и выше полностью Unicode
Нет проблем с перекодировкой

Слайд 18

JDBC краткий обзор

Connection – соединение с БД
connection = DriverManager.getConnection(url, user, pass);
Statement –

JDBC краткий обзор Connection – соединение с БД connection = DriverManager.getConnection(url, user,
Оператор для выполнения
PreparedStatement stmt = connection.prepareStatement(sql);
ResultSet – результат выполнения
ResultSet resultSet = stmt.executeQuery();
Stream – значение XML
InputStream inputStream = resultSet.getBinaryStream(1);
или DB2XML или SQLXML
DB2Xml db2xml = (DB2Xml) resultSet.getObject(1);

Слайд 19

Расширения DB2's XML

Функциональность совместима с будущим JDBC SQLXML
XML LOB возвращается с ResultSet.getObject()
Преобразование

Расширения DB2's XML Функциональность совместима с будущим JDBC SQLXML XML LOB возвращается
кодовых страниц
Несколько методов для удобства как и в ResultSet

Слайд 20

Выботка из XML столбца

String sql = "SELECT PID, DESCRIPTION from XMLPRODUCT where

Выботка из XML столбца String sql = "SELECT PID, DESCRIPTION from XMLPRODUCT
PID = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, "100-105-09");
ResultSet resultSet = stmt.executeQuery();
String xml = resultSet.getString("DESCRIPTION"); // or
InputStream inputStream = resultSet.getBinaryStream("DESCRIPTION"); // or
Reader reader = resultSet.getCharacterStream("DESCRIPTION"); // or
DB2Xml db2xml = (DB2Xml) resultSet.getObject("DESCRIPTION");

Слайд 21

Вставка из файла XML

String sql = "INSERT INTO xmlproduct VALUES(?, ?)";
PreparedStatement

Вставка из файла XML String sql = "INSERT INTO xmlproduct VALUES(?, ?)";
stmt = connection.prepareStatement(sql);
stmt.setString(1, "100-105-09");
File binFile = new File("productBinIn.xml");
InputStream inBin = new FileInputStream(xmlFile);
stmt.setBinaryStream(2, inBin, (int) binFile.getLength());
stmt.execute();

Слайд 22

JDBC и XML завтра (JDBC v4) (JSR 221)

SQLXML объект добавлен к спецификации

JDBC и XML завтра (JDBC v4) (JSR 221) SQLXML объект добавлен к
JDBC
getSQLXML() возвращает SQLXML объект
getObject() возвращает SQLXML объект
Объекты SQLXML являются также объектами DB2XML
Представляет XML значение
Похоже на BLOB/CLOB
Доступ из ResultSet
SQLXML getSQLXML(int columnIndex)
SQLXML getSQLXML(String columnName)
void updateSQLXML(int columnIndex, SQLXML xmlObject)
void updateSQLXML(String columnName, SQLXML xmlObject)

Слайд 23

Source and Result Examples

DOM get a Document
DOMSource domSource = sqlxml.getSource(DOMSource.class);
Document document

Source and Result Examples DOM get a Document DOMSource domSource = sqlxml.getSource(DOMSource.class);
= (Document) domSource.getNode();
DOM set a Document
DOMResult domResult = sqlxml.setResult(DOMResult.class);
domResult.setNode(myNode);
Run an XSLT on an XML result
File xsltFile = new File("my.xslt");
File myFile = new File("result.xml");
Transformer xslt = TransformerFactory.newInstance(). newTransformer(new StreamSource(xsltFile));
Source source = sqlxml.getSource(null);
Result result = new StreamResult(myFile);
xslt.transform(source, result);

Слайд 24

Производительность

Производительность

Слайд 25

Размер страницы для XML

32k Pages

Большие документы разбиваются на регионы
Макс док: 2GB, может

Размер страницы для XML 32k Pages Большие документы разбиваются на регионы Макс
находится на множестве страниц

Меньше регионов лучше производительность.
Выбирайте размер страницы в зависимости от размера документа !

….

Слайд 26

Отдельные табличные пространства для XML

Используйте DMS табличные пространства для лучше производительности !
Используйте

Отдельные табличные пространства для XML Используйте DMS табличные пространства для лучше производительности
большие размеры страниц!

Расположение XML данных и индексов в отдельных табличных пространствах позволяет делать более тонкую настройку…
…но только если это действительно нужно! Иначе пусть будет проще !

CREATE TABLE mytable(c1 integer, c2 char(8),…,c9 double, c10 XML) IN mytspace1 INDEX IN mytspace2 LONG IN mytspace3

Слайд 27

New Snapshot Monitor Counters for XML

Проверяйте XDA счетчики для оценки XML активности

New Snapshot Monitor Counters for XML Проверяйте XDA счетчики для оценки XML
!

Buffer pool data logical reads = 253
Buffer pool data physical reads = 70
Buffer pool temporary data logical reads = 145
Buffer pool temporary data physical reads = 0
Buffer pool data writes = 0
Buffer pool index logical reads = 17275
Buffer pool index physical reads = 0
Buffer pool temporary index logical reads = 0
Buffer pool temporary index physical reads = 0
Buffer pool index writes = 0
Buffer pool xda logical reads = 2837
Buffer pool xda physical reads = 174
Buffer pool temporary xda logical reads = 0
Buffer pool temporary xda physical reads = 0
Buffer pool xda writes = 0

Data Counters
(relational)
Relational and XML Index Counters
XML Data Counters

Активности с XML Regions включается в index counters.

New !

Слайд 28

Проверка на основе XML схем
create table dept(deptID char(8), deptdoc xml);
Validation is optional,

Проверка на основе XML схем create table dept(deptID char(8), deptdoc xml); Validation
and per document (per row):
insert into dept values (?, ?)
insert into dept values (?, xmlvalidate(?))

No Validation

With Validation
Валидация увеличивает процессорное время CPU для вставок, и уменьшает пропускную способность.

Слайд 29

Примеры XML индексов

create unique index idx1 on customer(info)
generate key using
xmlpattern

Примеры XML индексов create unique index idx1 on customer(info) generate key using
'/customerinfo/@Cid'
as sql double;
create index idx2 on customer(info)
generate key using
xmlpattern '/customerinfo/name'
as sql varchar(40);


Matt Foreman

1596 Baseline
Toronto
Ontario
M3Z-5H9

905-555-4789
416-555-3376

Peter Smith
416-555-3426


create index idx3 on customer(info)
generate key using
xmlpattern '//name'
as sql varchar(40);

create table customer( info XML);

Слайд 30

XML Indexing Examples

create unique index idx1 on customer(info)
generate key using
xmlpattern

XML Indexing Examples create unique index idx1 on customer(info) generate key using
'/customerinfo/@Cid'
as sql double;
create index idx2 on customer(info)
generate key using
xmlpattern '/customerinfo/name'
as sql varchar(40);


Matt Foreman

1596 Baseline
Toronto
Ontario
M3Z-5H9

905-555-4789
416-555-3376

Peter Smith
416-555-3426


create index idx3 on customer(info)
generate key using
xmlpattern '//name'
as sql varchar(40);

create table customer( info XML);

create index idx4 on customer(info)
generate key using
xmlpattern '//text()'
as sql varchar(40);

Не индексируйте все!
Слишком дорого для
insert, update, delete !

Слайд 31

Optimizer Tips

Гибридный оптимизатор основан на стоимости
Вы должны запускать ‘runstats’ на ваших XML

Optimizer Tips Гибридный оптимизатор основан на стоимости Вы должны запускать ‘runstats’ на
данных
XML Статистика включает наиболее часто встречаемые пары path/value
Проверяйте планы на основе db2exfmt, Visual Explain

Слайд 32

Рекомендации по XML Запросам

Если возможно полностью указывайте точный XPath, а не шаблон.
/customerinfo/phone

Рекомендации по XML Запросам Если возможно полностью указывайте точный XPath, а не
вместо //phone
/customerinfo/addr/state вместо /customerinfo/*/state


Matt Foreman

1596 Baseline
Toronto
Ontario
M3Z-5H9

905-555-4789
416-555-3376


Matt Foreman

1596 Baseline
Toronto
Ontario
M3Z-5H9

905-555-4789
416-555-3376

Peter Smith
416-555-3426


Слайд 33

SQL/XML c XMLEXISTS

Для каждой строки:
XMLEXISTS возвращает FALSE если встроенный XQuery возвращает Пустую

SQL/XML c XMLEXISTS Для каждой строки: XMLEXISTS возвращает FALSE если встроенный XQuery
последовательность,
иначе XMLEXISTS возвращает TRUE, и строка возвращается
select c.info from customer c
where xmlexists(‘$i/customerinfo[name = “Matt Foreman”]’ passing c.info as “i”)
Строка возвращается имя Matt Foreman:
XQuery вернет пустую строку если […] удовлетворено

create table customer( info XML);

Без индекса!

Индекс!

select c.info from customer c
where xmlexists(‘$i/customerinfo/name = “Matt Foreman”’ passing c.info as “i”)
Все строки выбираются :
Встроенный XQuery всегда вернет или Boolean вне зависимости путая последовательность или нет

Слайд 34

SQL/XML with XMLQUERY

select xmlquery(‘$i/customerinfo[phone = “905-555-4789”]/name’ passing c.info as “i”)
from customer

SQL/XML with XMLQUERY select xmlquery(‘$i/customerinfo[phone = “905-555-4789”]/name’ passing c.info as “i”) from
c;

select xmlquery(‘$i/customerinfo/name’ passing c.info as “i”)
from customer c
where xmlexists(‘$i/customerinfo[phone = “905-555-4789”]’ passing c.info as “i”)

customer table:

1 record(s) selected

3 record(s) selected

Индекс!

Без индекса!

Слайд 35

Viper II
Ограничения целостности на XML
Передача параметров в SQLQuery
–XQuery нет возможности передачи параметров

Viper II Ограничения целостности на XML Передача параметров в SQLQuery –XQuery нет
в SQL
XQUERY
for $docid in (1,2,3),
$j in db2-fn:sqlquery('select xmlcol from t1 where docid = parameter(1)',
$docid)/bib/book
where count($j/author) > 1
return $j;

Слайд 36

Viper II
Репликация XML
Поддержка триггеров для XML
Before Trigger сможет работать перед валидацией на

Viper II Репликация XML Поддержка триггеров для XML Before Trigger сможет работать
вставку
Обновление части документа
update T set doc = XMLQuery ('
transform
copy $r := $doc
do
delete {$r/score},
replaceValue of {$r/salary} with $r/salary * 1.1,
insert {Ph.D.} into $r//emp,
rename ($r/status[1]) to "state"
return $r'
passing doc as "doc",
cast (? as double) as "raise",
id as "i");

Слайд 37

Questions?

[email protected]

Matthias Nicola, IBM SVL

Questions? Nikolay_Kulikov@ru.ibm.com Matthias Nicola, IBM SVL

Слайд 38

New XML Statistics

Gathered by runstats when run on XML column and XML

New XML Statistics Gathered by runstats when run on XML column and
index
Cannot be modified via update
For each of the most frequent paths in an XML column we collect
- The total number of times the path is seen
- Top-k Pathid node counts
- In how many documents it is seen
- Top-k Pathid doc counts
Same is collected for most frequent paths that lead to values
including the value itself
- Top-k Pathid-Value node counts
- Top-k Pathid-Value doc counts
Catch all stats for paths that are not frequent
New registry variables for fine tuning, db2cat for inspection
Имя файла: Разработка-Приложенийс-помощью-pureXMLНиколай-Куликов,-IBM-EE/[email protected]
Количество просмотров: 177
Количество скачиваний: 0