Oracle DB 21c,查询JSON数据时未提取索引

ykejflvf  于 2023-03-29  发布在  Oracle
关注(0)|答案(1)|浏览(195)

我有一个表“orders”,它包含几千行。该表有一个CLOB列,其中包含一个JSON有效负载。表中的每一行都是一个订单,JSON包含订单详细信息(orderid,site_name,order total等)。
我在表上创建一个索引,如下所示:

CREATE INDEX orders_sitename_idx ON
     orders ( JSON_VALUE(
        json_document, '$.site_name' RETURNING VARCHAR2 ERROR ON ERROR) );

索引创建好了,但是当我运行下面的查询时,我看到索引没有被使用(解释计划显示了全表扫描)。

SELECT
    d.site_name,
    d.orderid
FROM
    orders ct,
    JSON_TABLE ( ct.json_document, '$'
            COLUMNS 
                site_name VARCHAR2 PATH '$.site_name',
                orderid NUMBER PATH '$.order.orderid'            
        ) d
    where site_name = 'My Site';

有没有关于为什么索引没有被使用的指针?
我试过使用查询和索引(实际上是为了确保数据类型没有问题),但没有乐趣。

chhkpiq4

chhkpiq41#

如果表很小或表的统计信息过时,SQL优化器可能会认为进行表扫描比使用索引更有效。请尝试更新表的统计信息,看看是否有不同。
此示例使用DBMS_STATS包收集sh.customers表的统计信息,并行度设置为2。

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS (  
    ownname => 'sh'
,   tabname => 'customers'
,   degree  => 2  
);
END;
/

https://docs.oracle.com/en/database/oracle/oracle-database/21/tgsql/gathering-optimizer-statistics.html#GUID-5AC92747-F6AA-4149-80B6-FD6E966CDC8D

相关问题