实战系列之向量索引覆盖字段优化

来源:这里教程网 时间:2026-03-03 22:54:55 作者:

商品搜索系统测试

-- 创建商品表
CREATE TABLE products (
    product_id NUMBER PRIMARY KEY,
    product_name VARCHAR2(200),
    category_id NUMBER,
    price NUMBER(10,2),
    description VARCHAR2(4000),
    image_features VECTOR(512),
    text_features VECTOR(768)
);
-- 插入100万商品数据
INSERT INTO products
SELECT 
    LEVEL as product_id,
    '商品_' || LEVEL as product_name,
    MOD(LEVEL, 100) as category_id,
    ROUND(DBMS_RANDOM.VALUE(10, 1000), 2) as price,
    DBMS_RANDOM.STRING('X', 300) as description,
    VECTOR(512, RANDOM) as image_features,
    VECTOR(768, RANDOM) as text_features
FROM dual CONNECT BY LEVEL <= 1000000;
COMMIT;

索引配置对比测试

-- 方案A:基础向量索引
CREATE VECTOR INDEX idx_products_base 
ON products(text_features)
ORGANIZATION INMEMORY NEIGHBOR GRAPH
DISTANCE COSINE;
-- 方案B:包含覆盖字段的向量索引
CREATE VECTOR INDEX idx_products_covering 
ON products(text_features)
INCLUDE (product_id, product_name, price, category_id)
ORGANIZATION INMEMORY NEIGHBOR GRAPH
DISTANCE COSINE;

性能测试查询

-- 测试查询:相似商品搜索并返回商品信息
DECLARE
    v_query_vector VECTOR(768) := VECTOR(768, RANDOM);
    v_start_time NUMBER;
    v_end_time NUMBER;
    v_result_count NUMBER := 0;
BEGIN
    -- 测试基础索引
    v_start_time := DBMS_UTILITY.get_time;
    
    SELECT COUNT(*)
    INTO v_result_count
    FROM (
        SELECT p.product_id, p.product_name, p.price,
               VECTOR_DISTANCE(p.text_features, v_query_vector, COSINE) as similarity
        FROM products p
        WHERE VECTOR_DISTANCE(p.text_features, v_query_vector, COSINE) < 0.2
        ORDER BY similarity
        FETCH FIRST 100 ROWS ONLY
    );
    
    v_end_time := DBMS_UTILITY.get_time;
    DBMS_OUTPUT.PUT_LINE('基础索引查询时间: ' || (v_end_time - v_start_time)/100 || ' 秒');
    
    -- 测试覆盖索引
    v_start_time := DBMS_UTILITY.get_time;
    
    SELECT COUNT(*)
    INTO v_result_count
    FROM (
        SELECT /*+ INDEX(p idx_products_covering) */
               p.product_id, p.product_name, p.price,
               VECTOR_DISTANCE(p.text_features, v_query_vector, COSINE) as similarity
        FROM products p
        WHERE VECTOR_DISTANCE(p.text_features, v_query_vector, COSINE) < 0.2
        ORDER BY similarity
        FETCH FIRST 100 ROWS ONLY
    );
    
    v_end_time := DBMS_UTILITY.get_time;
    DBMS_OUTPUT.PUT_LINE('覆盖索引查询时间: ' || (v_end_time - v_start_time)/100 || ' 秒');
END;
/

I/O性能对比数据

相关推荐

热文推荐