商品搜索系统测试
-- 创建商品表
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性能对比数据
