gpt4 book ai didi

sql - oracle中列的一部分的索引?

转载 作者:行者123 更新时间:2023-12-02 07:44:31 25 4
gpt4 key购买 nike

在 oracle 中:我有一个表 rel,其中包含这些列(object_id1、object_id2),这些列与系统中的对象对相关联。 object_ids 是 varchars,前 3 个字符标识对象的类型。例如。用户以 001 开头,书籍以 002 开头,但还有更多类型。现在我想通过此查询获取此表中所有相关的用户-图书对:

SELECT * FROM rel WHERE rel.object_id1 LIKE '001%' AND rel.object_id2 LIKE '002%'

为此,我需要在 object_id1 的前三个字符和 object_id2 上使用 b 树索引索引。是否可以在列的一部分上建立索引,在本例中是前 3 个字符?怎么办?

最佳答案

你可以创建一个基于函数的索引

CREATE INDEX idx_rel_obj_id
ON( substr( object_id1, 1, 3 ),
substr( object_id2, 1, 3 ) );

但是您的查询需要使用相同的函数调用

SELECT *
FROM rel
WHERE substr( rel.object_id1, 1, 3 ) = '001'
AND substr( rel.object_id2, 1, 3 ) = '002'

通常,您会创建标记为确定性的用户定义函数(即 get_object_type),并在索引定义和查询中使用这些用户定义函数,以确保有人不会无意中使用不同的构造以获取字段的前三个字符,这将阻止使用基于函数的索引。

综上所述,在表中有一列的前三个字符代表其他一些数据元素违反了基本规范化。几乎总是最好将前三个字符存储在单独的列中,而不是尝试在运行时解析复合列。

关于sql - oracle中列的一部分的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7971487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com