数据库管理-第153期 Oracle Vector DB & AI-05(20240221)

来源:这里教程网 时间:2026-03-03 19:39:15 作者:

数据库管理-第153期 Oracle Vector DB & AI-05(20240221)

作者:胖头鱼的鱼缸(尹海文) Oracle ACE Associate: Database(Oracle与MySQL) 网思科技 DBA总监 10年数据库行业经验,现主要从事数据库服务工作 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVP、认证技术专家,ITPUB认证专家,OCM讲师 圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著 名社恐(社交恐怖分子) 公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。 除授权转载并标明出处外,均为“非法”抄袭。

继续继续,本期将开始引入部分实操内容。

1 Oracle Vector的其他特性

  • SQL Join 支持相似性搜索JOIN关系型数据。
  • 复杂、融合SQL – 支持所有类型的工作负载和数据模型: Graph, Text, JSON, Spatial, Relational, etc. – 支持所有 SQL,包括复杂的运算和功能: Window analytic functions, stored procedures, aggregation
  • 与向量搜索组合成复杂的、融合的SQL

    在企业应用中,相似性搜索Joins关系型数据非常常见。需要企业级基于成本的优化器来决定选择Join和向量索引使用等。就现有的专用向量数据库而言,不可能做到以上功能。

    示例1:

    返回其中包含与此查询文本相似的文本,其中该书的类型为“小说”,作者来自“危地马拉(Guatemala)”的前5本书

    image.png

    Select pageID from Authors, Books, Pages where Authors.authorID = Books.authorID and Books.bookID = Pages.bookID and Books.bookGenre = 'Fiction' and Author.authorCountry = 'Guatemala'order by vector_distance(pageVec, :queryVec) fetch approx first 5 rows only;

    示例2

    显示过去5年中根据与所提供查询图像的相似性按年份分组的前3张照片。这些照片应该是在距离旧金山20英里的范围内拍摄的,至少有100人观看过。

    image.png

    2 简单使用Oracle Vector

    环境

    项目 内容
    OS OracleLinux 9.3
    DB Oracle DB 23c
    HOSTNAME oradb23c
    CDB orcl
    PDB orclpdb1

    由于Oracle DB 21c开始,Oracle取消了Non-CDB,因此后续操作都在PDB中执行。

    创建包含Vector数据类型的表

    vector数据类型作为Oracle DB 23c默认自带的数据类型,不需要类似于其他数据库那样的额外操作。

    create table flower_vec (id number primary key,flower_image blob,flower_vector vector);

    image.png

    插入向量数据

    这里我从百度随便找了一张花的图片,复制到/home/oracle/flower下,文件名为flower_example.png。 image.png 首先先创建一个基础表用来生成图片的二进制数据:

    create table flower (flower_image blob);

    导入图片二进制信息:

    create directory flower_dir as '/home/oracle/flower';declare
      l_bfile bfile;
      l_blob blob;begin
      insert into flower(flower_image) values (empty_blob()) return flower_image into l_blob;
      l_bfile := bfilename ('FLOWER_DIR','flower_example.png');
      dbms_lob.open(l_bfile, dbms_lob.file_readonly);
      dbms_lob.loadfromfile(l_blob,l_bfile,dbms_lob.getlength(l_bfile));
      dbms_lob.close(l_bfile);  commit;end;
    /

    image.png 生成向量数据并导入: 这里使用Python来生成向量数据并插入,关于SQL EMBEDDING放在正式版出来以后再测试:

    from towhee import pipe, ops
    p = (
        pipe.input('path')
            .map('path', 'img', ops.image_decode())
            .map('img', 'vec', ops.image_embedding.timm(model_name='resnet50'))
            .output('vec')
    )
    vector_data = p('flower_example.png').get()
    -->最终生成2048维度的向量,这里感谢我同事郑安宁同学提供的脚本

    由于2048维度的向量超过了sqlplus支撑长度(Oracle Vector是支持至少4096维度的),因此只截取了前10个向量:

    insert into flower_vec select 1,flower_image,to_vector('[0.050895579159259796,0.002409987384453416,0,0.01872553676366806,0.01558636873960495,0,0.0197914931923151,0,0.00522683234885335]') from flower;

    image.png image.png

    总结

    本期介绍了Oracle Vector的其他特性意见简单的实战使用。下一期将依据Oracle Livelabs中的介绍进行进一步探索。 老规矩,知道写了些啥。

  • 相关推荐