我有一个表“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';
有没有关于为什么索引没有被使用的指针?
我试过使用查询和索引(实际上是为了确保数据类型没有问题),但没有乐趣。
1条答案
按热度按时间chhkpiq41#
如果表很小或表的统计信息过时,SQL优化器可能会认为进行表扫描比使用索引更有效。请尝试更新表的统计信息,看看是否有不同。
此示例使用DBMS_STATS包收集sh.customers表的统计信息,并行度设置为2。
https://docs.oracle.com/en/database/oracle/oracle-database/21/tgsql/gathering-optimizer-statistics.html#GUID-5AC92747-F6AA-4149-80B6-FD6E966CDC8D