« Oracle Database 23ai freeで試すVector Search - ONNXモデル準備編 | トップページ | 実行計画は, SQL文のレントゲン写真だ! No.66 / AI Vector Search - VECTOR INDEX HNSW SCAN »

2025年6月 4日 (水) / Author : Hiroshi Sekiguchi.

Oracle Database 23ai freeで試すVector Search - データ準備編

Previously on Mac De Oracle
前回は、 ONNXモデル準備編でした。意外にすんなりできちゃいましたね。
で、今回は、Vector Searchのレントゲンという名の実行計画を取得するデータの準備編です。

ただし、Oracle Database 23ai Freeを利用するため以下のリソース制限があります。
その制限の中で行える量に調整しつつ準備します。

Oracle Database 23ai Free limitations

https://www.oracle.com/database/free/

Resource limit up to
・2 CPUs (for foreground processes)
・2 GB of RAM
・12 GB of user data on disk (included SYSAUX)


VirtualBOXの対象VMストレージサイズは十分なサイズにしてあります。(Oracle Database 23ai Freeの制限以上は確保してあります。Linux上での作業領域含む)

% VBoxManage showvminfo 25951093-0df5-47e8-823c-ac7fdf2902bf | grep Memory
Memory size: 4096MB

 

VM上からみたストレージ空き容量とCPU数

[oracle@localhost work4vector]$ sudo df -aH | grep '/sd.'
[sudo] oracle のパスワード:
/dev/sda3 58G 20G 38G 35% /
/dev/sda1 1.1G 346M 719M 33% /boot

[oracle@localhost work4vector]$ grep cpu.cores /proc/cpuinfo | sort -u
cpu cores : 2

 

Oracle Database 23aiのデータサイズは以下の通り。制限まで十分に余裕はあります

SYS@localhost:1521/freepdb1> r
1* select file_name,tablespace_name,bytes/1024/1024/1024 "GB",autoextensible from dba_data_files

FILE_NAME TABLESPACE_NAME GB AUT
------------------------------------------------------ ------------------------------ ---------- ---
/opt/oracle/oradata/FREE/FREEPDB1/sysaux01.dbf SYSAUX .76171875 YES
/opt/oracle/oradata/FREE/FREEPDB1/users01.dbf USERS .463867188 YES
/opt/oracle/oradata/FREE/FREEPDB1/system01.dbf SYSTEM .419921875 YES
/opt/oracle/oradata/FREE/FREEPDB1/undotbs01.dbf UNDOTBS1 .1953125 YES

 

Vector Search向けサンプルデータはGetting Started with Oracle Database 23ai AI Vector Searchでも紹介されているChicago Data Portalのオープンデータを利用します。結構いいサイズのデータが公開されています。
とは言ってもVector Indexも含めたサイズを考えると、Oracle Database 23ai Freeに全データを取り込むのは現実的なく一部を取り込んで使うことにします。

一部を使うとはいっても結構なサイズです。データ自体欠損していたりするのもあるようなのでそれなりに工夫して使いまっすw
ETL屋さんの腕の見せ所ですねww

スクリーンショット1
20250603-61755

 

スクリーンショット2
20250603-61807

 

Chcago Data Portalから取得したオープンデータのCSV形式ファイルは以下のとおり。

シカゴの犯罪データで2001年から直近のデータまで公開されています。 データセットには座標を含むGEOデータも含まれていますが今回は利用しません。このデータセットだけで1.9GB程度ですが、最終的に取り込むのは1年分より少ない程度にします。
chicago_crimes_2001_20250508.csv

属性やコード値の意味および、マスタデータとなるデータセットは何かという情報は、Chicago Data Portalで該当するデータセットを開くと表示される列ヘッダーのヘルプポップアップダイアログに記載されています。
(前述、スクリーンショット2参照のこと)
以下のマスターデータセットは、chicago_crimes_2001_20250508.csv と結合してコード値の読み替えなどに利用します。

Community Areaとして定義されているエリア名称などが含まれます(最新のもの) Boundaries_-_Community_Areas_20250508.csv

Districtの地区名称などが定義されています(最新のもの) PoliceDistrictDec2012_20250508.csv

シカゴ警察が利用しているイリノイ州の標準犯罪レポートIUCRコードマスター(最新のもの) Chicago_Police_Department_-_Illinois_Uniform_Crime_Reporting__IUCR__Codes_20250512.csv

使うかわからないですが、犯罪発生データに含まれているWARDの情報のマスターデータセットです(最新のものですが、結局使わなかったw) WARDS_2015_20250508.csv

 

上記データは、以下に作成したディレクトリオブジェクトに対応するディレクトリに配置して外部表のソースとなります。

SYS@localhost:1521/freepdb1> create directory chicago_crimes_data_dir as '/home/oracle/work4vector';

ディレクトリが作成されました。

経過: 00:00:00.46
SYS@localhost:1521/freepdb1> r
1* select directory_name, directory_path from dba_directories where directory_name = upper('chicago_crimes_data_dir')

DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ------------------------------
CHICAGO_CRIMES_DATA_DIR /home/oracle/work4vector

経過: 00:00:00.01

SYS@localhost:1521/freepdb1> grant read on directory chicago_crimes_data_dir to scott;
権限付与が成功しました。

経過: 00:00:00.04

SCOTT@localhost:1521/freepdb1> !ls -l
合計 1917360
-rw-r--r--. 1 oracle oracle 3566 5月 9 09:46 Boundaries_-_Community_Areas_20250508.csv
-rw-r--r--. 1 oracle oracle 22307 5月 12 23:33 Chicago_Police_Department_-_Illinois_Uniform_Crime_Reporting__IUCR__Codes_20250512.csv
-rw-r--r--. 1 oracle oracle 202 5月 9 09:47 PoliceDistrictDec2012_20250508.csv
-rw-r--r--. 1 oracle oracle 1558 5月 9 09:48 WARDS_2015_20250508.csv
-rw-r--r--. 1 oracle oracle 1947211979 5月 9 03:40 chicago_crimes_2001_20250508.csv

 

Vector Searchで利用する表は以下、それ以外はこの表のデータを作りだすための元となるデータで外部票として取り込みVector Searchで利用する表データに変換します。
(DROP TABLE IF EXISTS構文は、Oracle Database 23ai 以降で使えます)

 DROP TABLE IF EXISTS search_data PURGE;
CREATE TABLE search_data
(
id NUMBER
, primary_description VARCHAR2(40)
, description VARCHAR2(100)
, location_desc VARCHAR2(100)
, district VARCHAR2(30)
, ward NUMBER
, community VARCHAR2(30)
, c_year NUMBER
, vector_desc VECTOR
)
/

上記表のインプットとなる各外部票は以下の通り。

シカゴの犯罪データのオリジナルです。search_data_org(外部表)

列コメントにある数字と列名は、search_dataの列順と列名に対応しています。(ただし、そのままセットするものもあれば適宜型変換やマスターデータと結合して読み替えたりします。元になる列を示しています。
chicago_crimes_2001_20250508_2.csvというファイルがありますが、chicago_crimes_2001_20250508.csvのうちBad dataとして弾かれたデータが出力される.badファイルを元にデータが通るように整形したものを再度インプットとして利用したものです。

CREATE TABLE search_data_org
(
id VARCHAR2(100) -- 1 id
,case_number VARCHAR2(100)
,case_Date VARCHAR2(100)
,block VARCHAR2(100)
,iucr VARCHAR2(100) -- 2 primary_description
,primary_type VARCHAR2(100)
,description VARCHAR2(100) -- 3 description
,Location_desc VARCHAR2(100) -- 4 location_desc
,arrest VARCHAR2(100)
,domestic VARCHAR2(100)
,beat VARCHAR2(100)
,district VARCHAR2(100) -- 5 district
,ward VARCHAR2(100) -- 6 ward
,community VARCHAR2(100) -- 7 community
,fbi_code VARCHAR2(100)
,x_coordinate VARCHAR2(100)
,y_coordinate VARCHAR2(100)
,c_year VARCHAR2(100) -- 8 c_year
,updated_on VARCHAR2(100)
,latitude VARCHAR2(100)
,longitude VARCHAR2(100)
,location VARCHAR2(100)
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY chicago_crimes_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
(
id
,case_number
,case_Date
,block
,iucr
,primary_type
,description
,Location_desc
,arrest
,domestic
,beat
,district
,ward
,community
,fbi_code
,x_coordinate
,y_coordinate
,c_year
,updated_on
,latitude
,longitude
,location1
,location2
)
COLUMN TRANSFORMS
(
location FROM CONCAT
(
location1
,location2
)
)
)
LOCATION (
'chicago_crimes_2001_20250508.csv'
,'chicago_crimes_2001_20250508_2.csv'
)
)
REJECT LIMIT UNLIMITED
/

 

以降、マスターデータセットの外部表定義です。

communitiesマスタ(外部表)
AREA_NUMBER列がキーです。search_data_org外部表(シカゴの犯罪データ)のcommunity列と結合することで (列名違いすぎるwww、実案件だったらキレてるな、俺w)、COMMUNITY_NAMEに読み替えることができる、と。。。
とは言え、ちょいと怪しいので外部結合するようにしとくかw

CREATE TABLE communities 
(
AREA_NUMBER NUMBER
, COMMUNITY_NAME VARCHAR2(100)
, AREA_NUM_1 NUMBER
, SHAPE_AREA NUMBER
, SHAPE_LEN NUMBER
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY chicago_crimes_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
SKIP 1
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
(
AREA_NUMBER
, COMMUNITY_NAME
, AREA_NUM_1
, SHAPE_AREA
, SHAPE_LEN
)
)
LOCATION (
'Boundaries_-_Community_Areas_20250508.csv'
)
)REJECT LIMIT UNLIMITED/

 

districtsマスタ(外部表)
DIST_NUMBER列がキーで、search_data_org外部表(シカゴの犯罪データ)のdistrict列と結合することで、DIST_LABELに読み替えることができます。(これも列名が異なっていて非常にわかりにくいwwww なんでこんな状態なのみたいなw)
これも外部結合の方が良さそうな雰囲気はありますね。実際詳しく追ったわけではないですがw

CREATE TABLE districts
(
DIST_LABEL VARCHAR2(100)
, DIST_NUMBER NUMBER
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY chicago_crimes_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
SKIP 1
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
(
DIST_LABEL
, DIST_NUMBER
)
)
LOCATION (
'PoliceDistrictDec2012_20250508.csv'
)
)
REJECT LIMIT UNLIMITED
/

 

illinoi_uniform_crime_reporting_codesマスタ(外部表)
iucr列とsearch_data_org外部表(シカゴの犯罪データ)のiucr列を結合することでprimary_descriptionに読み替えることができます。結合キー列名が同じなのはよろしいのですが、ここまでバラバラなのにここだけ同じなのかww (これもなんとなく怪しいので、外部結合にしようと思います)

CREATE TABLE illinoi_uniform_crime_reporting_codes
(
iucr VARCHAR2(5)
, primary_description VARCHAR2(100)
, secondary_description VARCHAR2(100)
, index_code CHAR(1)
, active BOOLEAN NOT NULL
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY chicago_crimes_data_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
(
iucr
,primary_description
,secondary_description
,index_code
,active
)
)
LOCATION (
'Chicago_Police_Department_-_Illinois_Uniform_Crime_Reporting__IUCR__Codes_20250512.csv'
)
)
REJECT LIMIT UNLIMITED
/

 

最後にsearch_dataにVECTORを埋め込んだデータを登録するためのIASです。VECTOR_EMBEDDING関数でsearch_data_org.descriptionを元にVECTORデータを生成しています。
全データ(830万件)のうち、2024年に発生したデータのID順で、125,000行だけ登録します。(理由は、Oracle Database 23ia Freeのデータ量というより2GBまでしか使えないというメモリサイズの制限が重しになっているためです。後述)

TRUNCATE TABLE search_data;
INSERT INTO search_data
(
id
, primary_description
, description
, location_desc
, district
, ward
, community
, c_year
, vector_desc
)
SELECT
sdo.id AS id
, iucrc.primary_description AS primary_description
, sdo.description AS description
, sdo.Location_desc AS Location_desc
, d.dist_label AS district
, TO_NUMBER(sdo.ward) AS ward
, c.community_name AS community
, TO_NUMBER(sdo.c_year) AS c_year
, VECTOR_EMBEDDING(all_minilm_l6 USING sdo.description AS data) AS vector_desc
FROM
search_data_org sdo
LEFT OUTER JOIN districts d
ON
TO_NUMBER(sdo.district) = d.dist_number
LEFT OUTER JOIN communities c
ON
TO_NUMBER(sdo.community) = c.area_number
LEFT OUTER JOIN illinoi_uniform_crime_reporting_codes iucrc
ON
sdo.iucr = iucrc.iucr
WHERE
TO_NUMBER(sdo.c_year) IN 2024
ORDER BY
id
, c_year
FETCH FIRST 125000 ROWS ONLY
/

 

では最初に、Vector Searchで利用する表だけ作成しておきます。データは前述のIASでガツンと登録しちゃいます。

SCOTT@localhost:1521/freepdb1> l
1 CREATE TABLE search_data
2 (
3 id NUMBER
4 , primary_description VARCHAR2(40)
5 , description VARCHAR2(100)
6 , location_desc VARCHAR2(100)
7 , district VARCHAR2(30)
8 , ward NUMBER
9 , community VARCHAR2(30)
10 , c_year NUMBER
11 , vector_desc VECTOR
12* )
SCOTT@localhost:1521/freepdb1> /

表が作成されました。

経過: 00:00:00.03

 

もろもろエラーデータを補正しつつw なんとか search_data_org 外部表の作成に成功! (エラーになっていたログはバッサリ削除しましたが。。。)

SCOTT@localhost:1521/freepdb1> l
1 CREATE TABLE search_data_org
2 (
3 id VARCHAR2(100) -- 1
4 ,case_number VARCHAR2(100)
5 ,case_Date VARCHAR2(100)
6 ,block VARCHAR2(100)
7 ,iucr VARCHAR2(100) -- 2
8 ,primary_type VARCHAR2(100)
9 ,description VARCHAR2(100) -- 3
10 ,Location_desc VARCHAR2(100) -- 4
11 ,arrest VARCHAR2(100)
12 ,domestic VARCHAR2(100)
13 ,beat VARCHAR2(100)
14 ,district VARCHAR2(100) -- 5 nullあり
15 ,ward VARCHAR2(100) -- 6 nullあり
16 ,community VARCHAR2(100) -- 7 数値データのみ、nullあり
17 ,fbi_code VARCHAR2(100)
18 ,x_coordinate VARCHAR2(100)
19 ,y_coordinate VARCHAR2(100)
20 ,c_year VARCHAR2(100) -- 8 数値データのみ
21 ,updated_on VARCHAR2(100)
22 ,latitude VARCHAR2(100)
23 ,longitude VARCHAR2(100)
24 ,location VARCHAR2(100)
25 )
26 ORGANIZATION EXTERNAL (
27 TYPE ORACLE_LOADER
28 DEFAULT DIRECTORY chicago_crimes_data_dir
29 ACCESS PARAMETERS (
30 RECORDS DELIMITED BY NEWLINE
31 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
32 MISSING FIELD VALUES ARE NULL
33 (
34 id
35 ,case_number
36 ,case_Date
37 ,block
38 ,iucr
39 ,primary_type
40 ,description
41 ,Location_desc
42 ,arrest
43 ,domestic
44 ,beat
45 ,district
46 ,ward
47 ,community
48 ,fbi_code
49 ,x_coordinate
50 ,y_coordinate
51 ,c_year
52 ,updated_on
53 ,latitude
54 ,longitude
55 ,location1
56 ,location2
57 )
58 COLUMN TRANSFORMS
59 (
60 location FROM CONCAT
61 (
62 location1
63 ,location2
64 )
65 )
66 )
67 LOCATION (
68 'chicago_crimes_2001_20250508.csv'
69 ,'chicago_crimes_2001_20250508_2.csv'
70 )
71 )
72* REJECT LIMIT UNLIMITED
SCOTT@localhost:1521/freepdb1> /

表が作成されました。

経過: 00:00:00.02
SCOTT@localhost:1521/freepdb1> select count(1) from search_data_org;

COUNT(1)
----------
8307418

経過: 00:00:36.80
SCOTT@localhost:1521/freepdb1> ! ls -l *.bad
ls: '*.bad' にアクセスできません: No such file or directory

 

communitiesマスタ(外部表)の作成

SCOTT@localhost:1521/freepdb1> l
1 CREATE TABLE communities
2 (
3 AREA_NUMBER NUMBER
4 , COMMUNITY_NAME VARCHAR2(100)
5 , AREA_NUM_1 NUMBER
6 , SHAPE_AREA NUMBER
7 , SHAPE_LEN NUMBER
8 )
9 ORGANIZATION EXTERNAL (
10 TYPE ORACLE_LOADER
11 DEFAULT DIRECTORY chicago_crimes_data_dir
12 ACCESS PARAMETERS (
13 RECORDS DELIMITED BY NEWLINE
14 SKIP 1
15 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
16 MISSING FIELD VALUES ARE NULL
17 (
18 AREA_NUMBER
19 , COMMUNITY_NAME
20 , AREA_NUM_1
21 , SHAPE_AREA
22 , SHAPE_LEN
23 )
24 )
25 LOCATION (
26 'Boundaries_-_Community_Areas_20250508.csv'
27 )
28 )
29* REJECT LIMIT UNLIMITED
SCOTT@localhost:1521/freepdb1> /

表が作成されました。

経過: 00:00:00.03

SCOTT@localhost:1521/freepdb1> select count(1) from communities;

COUNT(1)
----------
77

経過: 00:00:00.03
SCOTT@localhost:1521/freepdb1> ! ls -l *.bad
ls: '*.bad' にアクセスできません: No such file or directory

 

 

districtsマスタ(外部表)の作成

SCOTT@localhost:1521/freepdb1> l
1 CREATE TABLE districts
2 (
3 DIST_LABEL VARCHAR2(100)
4 , DIST_NUMBER NUMBER
5 )
6 ORGANIZATION EXTERNAL (
7 TYPE ORACLE_LOADER
8 DEFAULT DIRECTORY chicago_crimes_data_dir
9 ACCESS PARAMETERS (
10 RECORDS DELIMITED BY NEWLINE
11 SKIP 1
12 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
13 MISSING FIELD VALUES ARE NULL
14 (
15 DIST_LABEL
16 , DIST_NUMBER
17 )
18 )
19 LOCATION (
20 'PoliceDistrictDec2012_20250508.csv'
21 )
22 )
23* REJECT LIMIT UNLIMITED
SCOTT@localhost:1521/freepdb1> /

表が作成されました。

経過: 00:00:00.02

SCOTT@localhost:1521/freepdb1> ! ls -l *.bad
ls: '*.bad' にアクセスできません: No such file or directory

SCOTT@localhost:1521/freepdb1> select count(1) from districts;

COUNT(1)
----------
25

経過: 00:00:00.04

 

illinoi_uniform_crime_reporting_codesマスタ(外部表)の作成

SCOTT@localhost:1521/freepdb1> l
1 CREATE TABLE illinoi_uniform_crime_reporting_codes
2 (
3 iucr VARCHAR2(5)
4 , primary_description VARCHAR2(100)
5 , secondary_description VARCHAR2(100)
6 , index_code CHAR(1)
7 , active BOOLEAN NOT NULL
8 )
9 ORGANIZATION EXTERNAL (
10 TYPE ORACLE_LOADER
11 DEFAULT DIRECTORY chicago_crimes_data_dir
12 ACCESS PARAMETERS (
13 RECORDS DELIMITED BY NEWLINE
14 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
15 MISSING FIELD VALUES ARE NULL
16 (
17 iucr
18 ,primary_description
19 ,secondary_description
20 ,index_code
21 ,active
22 )
23 )
24 LOCATION (
25 'Chicago_Police_Department_-_Illinois_Uniform_Crime_Reporting__IUCR__Codes_20250512.csv'
26 )
27 )
28* REJECT LIMIT UNLIMITED
SCOTT@localhost:1521/freepdb1> /

表が作成されました。

経過: 00:00:00.02

SCOTT@localhost:1521/freepdb1> ! ls -l *.bad
ls: '*.bad' にアクセスできません: No such file or directory

SCOTT@localhost:1521/freepdb1> select count(1) from illinoi_uniform_crime_reporting_codes;

COUNT(1)
----------
410

経過: 00:00:00.02

 

 

では、最後の仕上げ。VECTOR INDEX以外はこれで完成です!!!, 0.25GB程度の消費ですね。表だけで。VECTOR INDEXは別途作成します。

SCOTT@localhost:1521/freepdb1> l
1 INSERT INTO search_data
2 (
3 id
4 , primary_description
5 , description
6 , location_desc
7 , district
8 , ward
9 , community
10 , c_year
11 , vector_desc
12 )
13 SELECT
14 sdo.id AS id
15 , iucrc.primary_description AS primary_description
16 , sdo.description AS description
17 , sdo.Location_desc AS Location_desc
18 , d.dist_label AS district
19 , TO_NUMBER(sdo.ward) AS ward
20 , c.community_name AS community
21 , TO_NUMBER(sdo.c_year) AS c_year
22 , VECTOR_EMBEDDING(all_minilm_l6 USING sdo.description AS data) AS vector_desc
23 FROM
24 search_data_org sdo
25 LEFT OUTER JOIN districts d
26 ON
27 TO_NUMBER(sdo.district) = d.dist_number
28 LEFT OUTER JOIN communities c
29 ON
30 TO_NUMBER(sdo.community) = c.area_number
31 LEFT OUTER JOIN illinoi_uniform_crime_reporting_codes iucrc
32 ON
33 sdo.iucr = iucrc.iucr
34 WHERE
35 TO_NUMBER(sdo.c_year) IN 2024
36 ORDER BY
37 id
38 , c_year
39* 
FETCH FIRST 125000 ROWS ONLY
SCOTT@localhost:1521/freepdb1> /

125000 行が作成されました。

経過: 00:39:28.49
SCOTT@localhost:1521/freepdb1> commit;

コミットが完了しました。

経過: 00:00:00.04
SCOTT@localhost:1521/freepdb1> select segment_name,bytes/1024/1024/1024 "GB"
2 from user_segments where segment_name = 'SEARCH_DATA';

SEGMENT_NAME GB
------------------------------ ----------
SEARCH_DATA .2421875

経過: 00:00:00.29
SCOTT@localhost:1521/freepdb1> exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'SEARCH_DATA',no_invalidate=>false);

PL/SQLプロシージャが正常に完了しました。

経過: 00:00:05.97

 

 

 

ちなみに、前述のIASの実行計画はこんな感じ。

---------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 551K| 55M| | 77540 (1)| 00:00:04 |
| 1 | LOAD TABLE CONVENTIONAL | SEARCH_DATA | | | | | |
| 2 | SORT ORDER BY | | 551K| 55M| 61M| 77540 (1)| 00:00:04 |
|* 3 | HASH JOIN RIGHT OUTER | | 551K| 55M| | 64408 (1)| 00:00:03 |
| 4 | EXTERNAL TABLE ACCESS FULL | DISTRICTS | 25 | 200 | | 2 (0)| 00:00:01 |
|* 5 | HASH JOIN RIGHT OUTER | | 510K| 47M| | 64405 (1)| 00:00:03 |
|* 6 | EXTERNAL TABLE ACCESS FULL | ILLINOI_UNIFORM_CRIME_REPORTING_CODES | 410 | 8610 | | 3 (0)| 00:00:01 |
|* 7 | HASH JOIN RIGHT OUTER | | 510K| 37M| | 64401 (1)| 00:00:03 |
| 8 | EXTERNAL TABLE ACCESS FULL| COMMUNITIES | 77 | 1232 | | 2 (0)| 00:00:01 |
|* 9 | EXTERNAL TABLE ACCESS FULL| SEARCH_DATA_ORG | 510K| 29M| | 64398 (1)| 00:00:03 |
---------------------------------------------------------------------------------------------------------------------------------

 

 

次回、VECTOR SEARCHの実行計画という名のレントゲンネタのために、VECTOR INDEXサイズの見積サイズを確認しておきましょう。(Hierarchical Navigable Small World索引を利用します)
以下のように

参考) Oracle Database Release 23 / Oracle AI Vector Searchユーザーズ・ガイド / ベクトル索引の様々なカテゴリの管理

https://docs.oracle.com/cd/G11854_01/vecse/manage-different-categories-vector-indexes.html

Oracle Database Release 23 / Oracle AI Vector Searchユーザーズ・ガイド / ベクトル索引の使用に関するガイドライン

https://docs.oracle.com/cd/G11854_01/vecse/guidelines-using-vector-indexes.html

Oracle Database Release 23 / Oracle AI Vector Searchユーザーズ・ガイド / ベクトル索引のオプティマイザ計画

https://docs.oracle.com/cd/G11854_01/vecse/optimizer-plans-vector-indexes.html

Oracle Database Release 23 / Oracle AI Vector Searchユーザーズ・ガイド / 6 ベクトル索引およびハイブリッド・ベクトル索引の作成

https://docs.oracle.com/cd/G11854_01/vecse/create-vector-indexes-and-hybrid-vector-indexes.html#VECSE-GUID-8AF956F3-D951-4968-9B79-A6E180E87456

Oracle Database Release 23 / Oracle AI Vector Searchユーザーズ・ガイド / インメモリー近傍グラフ・ベクトル索引

https://docs.oracle.com/cd/G11854_01/vecse/memory-neighbor-graph-vector-index.html

Oracle Database Release 23 / Oracle AI Vector Searchユーザーズ・ガイド / Hierarchical Navigable Small World索引の理解

https://docs.oracle.com/cd/G11854_01/vecse/understand-hierarchical-navigable-small-world-indexes.html

Oracle Database Release 23 / Oracle AI Vector Searchユーザーズ・ガイド / Hierarchical Navigable Small World索引の構文およびパラメータ

https://docs.oracle.com/cd/G11854_01/vecse/hierarchical-navigable-small-world-index-syntax-and-parameters.html

冒頭で約830万行のデータから125,000行に制限したと書きましたが、その理由はベクトル・プールをSGA内に確保する必要があるからなんですよー。
そもそも、Oracle Database 23ai Free はメモリサイズの制限もあるので、その範囲に収まるようデータ量を制限しました。(ストレージより先にメモリサイズの制限にあたりそうだったので。。。w)

Oracle Database Release 23 / Oracle AI Vector Searchユーザーズ・ガイド / ベクトル・プールのサイズ設定

https://docs.oracle.com/cd/G11854_01/vecse/size-vector-pool.html

以下のVECTOR HNSW INDEXを作成予定なのですが、索引サイズを見積りサイズを確認しておきましょう。(Oracle Databaseには昔から便利なコマンドがあります。Explainで索引サイズの見積もりができるんですよね。

CREATE VECTOR INDEX search_data_hnsw_ix ON search_data ( vector_desc )
ORGANIZATION
INMEMORY NEIGHBOR GRAPH
DISTANCE COSINE
WITH TARGET ACCURACY 90
/

SCOTT@localhost:1521/freepdb1> l
1 explain plan for
2 CREATE VECTOR INDEX search_data_hnsw_ix ON search_data ( vector_desc )
3 ORGANIZATION
4 INMEMORY NEIGHBOR GRAPH
5 DISTANCE COSINE
6* WITH TARGET ACCURACY 90
05:41:08 SCOTT@localhost:1521/freepdb1> /

解析されました。

経過: 00:00:00.02
SCOTT@localhost:1521/freepdb1> @?/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------
Plan hash value: 2727344110

----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | CREATE INDEX STATEMENT | | 125K| 188M| 14689 (1)| 00:00:01 |
| 1 | VECTOR INDEX BUILD | SEARCH_DATA_HNSW_IX | | | | |
----------------------------------------------------------------------------------------------

Note
-----
- estimated index size: 293M bytes

12GBまでデータを使えるんだけどインメモリー系機能使おうとすると、メモリサイズの制限キツイよねと、思ったりw

Enjoy SQL and Oracle Database.

次回へ続く。

 


Oracle Database 23ai freeで試すVector Search - ONNXモデル準備編

| |

コメント

コメントを書く