Joe*_*ert 2 sql oracle indexing
在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%'
Run Code Online (Sandbox Code Playgroud)
为此,我需要在object_id1和object_id2的前三个字符上使用b树索引索引.是否有可能在列的一部分上有索引,在这种情况下是前3个字符?怎么样?
您可以创建基于函数的索引
CREATE INDEX idx_rel_obj_id
ON( substr( object_id1, 1, 3 ),
substr( object_id2, 1, 3 ) );
Run Code Online (Sandbox Code Playgroud)
但是,您的查询需要使用相同的函数调用
SELECT *
FROM rel
WHERE substr( rel.object_id1, 1, 3 ) = '001'
AND substr( rel.object_id2, 1, 3 ) = '002'
Run Code Online (Sandbox Code Playgroud)
通常,您将创建标记为确定性的用户定义函数(即get_object_type),并在索引定义和查询中使用这些用户定义的函数,以确保某人不会无意中按顺序使用不同的构造获取字段的前三个字符,这将阻止使用基于函数的索引.
所有这一切,在表中有一列,其中前三个字符代表一些其他数据元素违反了基本规范化.将前三个字符存储在单独的列中而不是尝试在运行时解析复合列几乎总是更好.