Previously on Mac De Oracle
前回は、実行計画は, SQL文のレントゲン写真だ! No.66 / AI Vector Search - VECTOR INDEX HNSW SCANでした。
今日はそれに絡んで気づいたVECTOR INDEXの謎を追いかけてみることにします。
前回の最後の宿題というか謎の一つ目、覚えてますか? そう、VECTOR INDEXを作成後、まあよくある、USER_INDEXESを検索して作成されたVECTOR INDEXの名称を確認して、EXPLAIN PLAN FORで見積もった索引サイズとどの程度乖離しているのだろうと、手癖でUSER_SEGMENTSをアクセスしてみると、なな、なーーーーーんと、ない、無い!、なーーーい!。 (INMEMORYとはいっても元ネタがあってINMEMORY化されるわけで仕組み的に理解しにくいのと、これまでのディクショナリービューの使い方と異なっていてものすごく追いにくい)
なんで? という謎。
SCOTT@localhost:1521/freepdb1> select index_name,index_type,table_name from user_indexes where table_name='SEARCH_DATA';
INDEX_NAME INDEX_TYPE TABLE_NAME ------------------------------ --------------------------- ------------------------------ SYS_IL0000078074C00009$$ LOB SEARCH_DATA SEARCH_DATA_HNSW_IX VECTOR SEARCH_DATA
経過: 00:00:00.05 SCOTT@localhost:1521/freepdb1> select segment_name from user_segments where segment_name = 'SEARCH_DATA_HNSW_IX';
レコードが選択されませんでした。
|
その後、アッ!
いつもと違うビューがあったことを思い出し、覗いてみると、
作成したVECTOR INDEX (HNSW)の名称とともに、IDX_AUXILIARY_TABLES列(JSONデータ型)に、なにやらそれらしい値があるじゃありませんか!!!
そーなんだーーーーっ。VECTOR INDEXの名称は、VECTOR INDEXの補助表の集まりをまとめる為だけの存在?!!!
というところまででした。
SCOTT@localhost:1521/freepdb1> r 1* SELECT * FROM vecsys.vector$index
IDX_OBJN IDX_OBJD IDX_OWNER# IDX_NAME IDX_BASE_TABLE_OBJN IDX_BASE_TABLE_OWNER# IDX_PARAMS IDX_AUXILIARY_TABLES ---------- ---------- ---------- ------------------------------ ------------------- --------------------- ------------------------------ ------------------------------ 78797 153 SEARCH_DATA_HNSW_IX 78074 153 {"type":"HNSW","num_neighbors" {"rowid_vid_map_objn":78798,"s :32,"efConstruction":200,"dist hared_journal_transaction_comm ance":"COSINE","accuracy":90," its_objn":78800,"shared_journa vector_type":"FLOAT32","vector l_change_log_objn":78803,"rowi _dimension":384,"degree_of_par d_vid_map_name":"VECTOR$SEARCH allelism":1,"pdb_id":3,"indexe _DATA_HNSW_IX$78074_78797_0$HN d_col":"VECTOR_DESC"} SW_ROWID_VID_MAP","shared_jour nal_transaction_commits_name": "VECTOR$SEARCH_DATA_HNSW_IX$78 074_78797_0$HNSW_SHARED_JOURNA L_TRANSACTION_COMMITS","shared _journal_change_log_name":"VEC TOR$SEARCH_DATA_HNSW_IX$78074_ 78797_0$HNSW_SHARED_JOURNAL_CH ANGE_LOG"} SCOTT@localhost:1521/freepdb1> r 1 SELECT 2 JSON_SERIALIZE(idx_params RETURNING VARCHAR2 PRETTY) AS "INDEX PARAM" 3 ,JSON_SERIALIZE(idx_auxiliary_tables RETURNING VARCHAR2 PRETTY) AS "INDEX AUX" 4* FROM vecsys.vector$index
INDEX PARAM INDEX AUX -------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------- { { "type" : "HNSW", rowid_vid_map_objn" : 78798, "num_neighbors" : 32, "shared_journal_transaction_commits_objn" : 78800, "efConstruction" : 200, "shared_journal_change_log_objn" : 78803, "distance" : "COSINE", "rowid_vid_map_name" : "VECTOR$SEARCH_DATA_HNSW_IX$78074_78797_0$HNSW_ROWID_VID_MAP", "accuracy" : 90, "shared_journal_transaction_commits_name" : "VECTOR$SEARCH_DATA_HNSW_IX$78074_78797_0$HNSW_SHARED_JOURNAL_TRANSACTION_COMMITS", "vector_type" : "FLOAT32", "shared_journal_change_log_name" : "VECTOR$SEARCH_DATA_HNSW_IX$78074_78797_0$HNSW_SHARED_JOURNAL_CHANGE_LOG" "vector_dimension" : 384, } "degree_of_parallelism" : 1, "pdb_id" : 3, "indexed_col" : "VECTOR_DESC" }
|
一旦ここまでの情報を整理すると
VECTOR INDEX(この例ではHNSW)の実態は、複数の補助表から構成されており、それらをまとめているのが 作成時に指定したVECTOR INDEXの名称。
オブジェクトとしては存在しているが、それ自体は、セグメントを持たない!!!(IN MEMORY展開される索引だからとはいっても。。なにかしらあるのでは。。?)
現時点の23aiには、使い勝手の良いディクショナリービューは提供されていない。。。。まじか!
その代わりに、vecsys.vector$indexディクショナリー表(ビューではない)から詳細を追うことができる。(vecsysスキーマ)
さらに、補助表を見つけるためには、該当ディクショナリー表のIDX_AUXILIARY_TABLES列に格納されているJSONの*_objnや、補助表のオブジェクトID、*_nameから探れ!、と。
ようするに、このJSONに対象となるVECTOR INDEXとその実態の依存関係が入っている!!!!!
(ちなみに、表しかないが、おそらく、関連索引もありそうだ、というかあるだろうな。補助表の索引は補助表をキーにしてUSER_INDEXESから探すしかないだろうけども。)
ここまで見てきたところで、
めんどくせーーーーーーーーーーーーーっ! なぜ、依存関係をJSONに突っ込んだの?。。。。という顔をしているところwwwww
そしてもう一つの謎、EXPLAIN PLAN FOR CREATE VECTOR INDEX ...foo bar ..として見積もられたVECTOR INDEXの見積もりサイズって、こいつら補助表含めた合計値?
なのか? 。。。だよなw 精度的に微妙な気がしなくも無い
全部かき集めて、合計して、見積もりサイズとの差分を見てみよう!
B*Treeの索引見積もりって、結構いい感じのサイズを弾き出してくれるわけだが。。。果たして。。。こいつは、どうなんだ? SEARCH_DATA_HNSW_IXって実態持ってないし。。。

では、もっと探ってみなければw
最近のコメント