Przeglądając zasoby Internetu trafiłem na zrzut bazy danych Wikipedii dostępny pod adresem http://download.wikimedia.org. Ponieważ archiwum jest w formacie XML doskonale nada się do przetestowania możliwości PureXML
No to zaczynamy.
Najpierw utworzymy bazę danych
CREATE DATABASE wiki AUTOMATIC STORAGE YES ON 'D:\db2' DBPATH ON 'D:\db2' ALIAS wikipedi USING CODESET UTF-8 TERRITORY PL COLLATE USING SYSTEM PAGESIZE 4096;
i trzy tabele. Dwie na dane XML
create table wiki (id int, doc xml) create table wiki1 (id int, doc xml)
a drugą na dane w postaci relacyjnej
create table wikipedia (wiki_id int, wiki_title varchar(1000), wiki_text clob(2M))
Po pobraniu pliku (ponad 500Mb) i rozpakowaniu mamy plik o wielkości prawie 2Gb.
Ponieważ próby zaimportowania całego pliku od razu kończyły się komunikatem o braku miejsca podzieliłem plik na kilka mniejszych części (uzupełniając ręcznie brakujące tagi) i zaimportowałem każdy po kolei.
IMPORT FROM d:\wiki\db2import\wiki.csv OF DEL XML FROM d:\wiki\db2import\ MESSAGES d:\wiki\db2import\out.txt INSERT INTO wiki1
W ten sposób w tabeli wiki1 mamy całą wikipedię w kilku rekordach. Następny krok to wypełnić tabele wiki i wikipedia
insert into wiki (tresc)
SELECT X.* FROM wiki1,
XMLTABLE (XMLNAMESPACES(DEFAULT 'http://www.mediawiki.org/xml/export-0.3/'),
'$d/mediawiki/page' passing cast(doc As XML) as "d"
COLUMNS
dok XML PATH 'document{.}') AS X
insert into wikipedia (wiki_id,wiki_title,wiki_text) SELECT X.* FROM wiki1, XMLTABLE (XMLNAMESPACES(DEFAULT 'http://www.mediawiki.org/xml/export-0.3/'), '$d/mediawiki/page' passing cast(doc As XML) as "d" COLUMNS ID INTEGER PATH 'id', title VARCHAR(1000) PATH 'title', tekst varchar(2M) PATH 'revision/text' ) AS X
Po wypełnieniu każda posiada ponad 700 000 wierszy.
Pora napisać jakieś proste zapytanie. Np:
select * from wikipedia where wiki_title = 'DB2'
Wykonuje się długo? Trzeba założyć indeks.
CREATE INDEX ADMIN.WIKI_TITLE ON ADMIN.WIKIPEDIA (WIKI_TITLE ASC) PCTFREE 10 MINPCTUSED 10 ALLOW REVERSE SCANS PAGE SPLIT SYMMETRIC COLLECT SAMPLED DETAILED STATISTICS ;
A co z wyszukiwaniem po polu wiki_text? Ponieważ jest to pole typu CLOB nie można na nim założyć indeksu. Tu z pomocą przyjdzie nam FULL TEXT SEARCH.
db2ts START FOR TEXT;
CIE00001 Operacja zakończona pomyślnie.
db2ts ENABLE DATABASE FOR TEXT CONNECT TO WIKI;
SQL20427N Podczas wykonywania procedury lub komendy administracyjnej wyszukiwan
ia tekstowego wystąpił błąd. Komunikat o błędzie to: “CIE00442N Właściciel insta
ncji nie ma uprawnień do wykonania komendy indeksu tekstowego dla bazy danych “W
IKI”.”. SQLSTATE=38H14
Spróbujmy zrobić to samo na tabeli z danymi w formacie XML.
Select *
from WIKI
Where xmlexists('declare default element namespace "http://www.mediawiki.org/xml/export-0.3/"; $c/page[title="DB2"]' passing tresc as "c")
Zapytanie wykonuje się długo? Spróbujmy założyć indeks.
CREATE INDEX wiki_index on wiki(tresc) GENERATE KEY USING XMLPATTERN '/page/title' as SQL VARCHAR(1000)
DB21034E Komenda nie była poprawną komendą procesora wiersza komend i została
przetworzona jako instrukcja SQL. Podczas przetwarzania SQL komenda zwróciła:
SQL0614N Nie można utworzyć lub zmienić indeksu lub rozszerzenia indeksu
“WIKI_INDEX”, ponieważ łączna długość podanych kolumn jest za duża.
SQLSTATE=54008SQL0614N Nie można utworzyć lub zmienić indeksu lub rozszerzenia indeksu “WIKI_INDEX “, ponieważ łączna długość podanych kolumn jest za duża.
Objaśnienie:
Nie można utworzyć lub zmodyfikować indeksu, ponieważ suma długości
kolumn wewnętrznych klucza przekroczyłaby ograniczenie długości klucza
indeksu. Nie można także utworzyć indeksu przy użyciu kolumn typu LONG
VARCHAR, LONG VARGRAPHIC lub LOB. Jeśli indeks został zdefiniowany w
tabeli o typie strukturalnym, został utworzony także dodatkowy nagłówek
indeksu, który zmniejsza maksymalną długość o 4 bajty. Indeks można
zmodyfikować przy użyciu instrukcji ALTER TABLE lub ALTER NICKNAME,
umożliwiającej zmianę typu danych w jednej lub kilku kolumnach.Nie można utworzyć rozszerzenia indeksu, ponieważ suma długości kolumn
zwracanych przez funkcję GENERATE KEY przekroczyłaby ograniczenie
długości klucza indeksu.Ograniczenie długości klucza indeksowania jest określone na podstawie
wielkości strony obszaru tabel używanego przez indeks:Maks. dł. klucza Wielkość strony
————– ———
1 kB 4 kB
2 kB 8 kB
4 kB 16 kB
8 kB 32 kBNie można wykonać instrukcji. Określony indeks lub rozszerzenie indeksu
nie zostało utworzone albo nie można było zmienić tabeli lub pseudonimu.Działanie użytkownika:
Aby zmodyfikować definicję indeksu lub zmienić kolumnę, usuń jedną lub
kilka kolumn wchodzących w skład indeksu, tak aby długość indeksu nie
przekroczyła dopuszczalnej wartości. W definicji rozszerzenia indeksu
określ inną funkcję GENERATE KEY lub przedefiniuj ją, tak aby zwracała
wiersz o mniejszej długości.kod_sql: -614
stan_sql: 54008
I na razie bez powodzenia.