我想知道为什么对于某些查询,索引不可能加快查询处理速度?

我已经尝试解释和显示这个查询的执行计划。

解释计划

SELECT *
FROM LINEITEM
WHERE l_quantity = 6
   OR l_shipMode = 'MAIL';

SELECT * FROM table(dbms_xplan.display);

输出是。

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 98068815

------------------------------------------------------------------------------
| Id  | Operation     | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   287K|    34M|  8802   (1)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| LINEITEM |   287K|    34M|  8802   (1)| 00:00:01 |
------------------------------------------------------------------------------

然后我创建了一个索引 l_quantityl_shipMode:

CREATE INDEX lineItemIdx ON LINEITEM(l_quantity, l_shipMode);

然后我再解释并展示执行计划。

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 98068815

------------------------------------------------------------------------------
| Id  | Operation     | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   287K|    34M|  8802   (1)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| LINEITEM |   287K|    34M|  8802   (1)| 00:00:01 |
------------------------------------------------------------------------------

没有区别。现在的查询不应该使用索引吗?

解决方案:

唉,大多数数据库的优化工作做得非常差劲。or 表达式(Oracle是个例外)。

你可以使用 union all:

SELECT li.*
FROM LINEITEM li
WHERE l_quantity = 6
UNION ALL
SELECT li.*
FROM LINEITEM li
WHERE l_shipMode = 'MAIL' AND l_quantity <> 6;

为此,你需要 两种 指数。 LINEITEM(l_quantity)LINEITEM(l_shipMode, l_quantity).

给TA打赏
共{{data.count}}人
人已打赏
未分类

键盘处理 swiftui

2022-9-9 3:18:17

未分类

在DynamoDB中设计表

2022-9-9 3:18:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索