Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 避免将函数应用于索引列_Sql_Oracle_Performance_Query Optimization - Fatal编程技术网

Sql 避免将函数应用于索引列

Sql 避免将函数应用于索引列,sql,oracle,performance,query-optimization,Sql,Oracle,Performance,Query Optimization,我需要过滤掉超过一定长度的数据,但包含该数据的列是索引列。如果我对列应用函数,我将失去索引的好处 我无法创建新索引或更改列,因为我不是数据库管理员。 我宁愿不在事后删除数据 我知道一些过滤列的方法,但都会使用某种函数 select table.name from table where length(table.name)>12 ; 字段表.name不可为空。如果列不为空,则Oracle可以使用完整索引扫描回答查询。它需要读取索引中的每一行,以便只查找长度大于12的行。如果索引小于表,

我需要过滤掉超过一定长度的数据,但包含该数据的列是索引列。如果我对列应用函数,我将失去索引的好处

我无法创建新索引或更改列,因为我不是数据库管理员。 我宁愿不在事后删除数据

我知道一些过滤列的方法,但都会使用某种函数

select
table.name
from 
table
where
length(table.name)>12
;

字段
表.name
不可为空。

如果列不为空,则Oracle可以使用完整索引扫描回答查询。它需要读取索引中的每一行,以便只查找长度大于12的行。如果索引小于表,则比完全扫描快

您只需要选择索引列,这样Oracle就不需要访问表,而是可以完全从索引中获得结果。如果要选择该索引中没有的其他列,Oracle还需要读取首先在索引中找到该行的表行


如果不添加更合适的索引或以其他方式更改数据库架构,则无法解决此问题。

如果列不为空,则Oracle可以使用完整索引扫描来回答查询。它需要读取索引中的每一行,以便只查找长度大于12的行。如果索引小于表,则比完全扫描快

您只需要选择索引列,这样Oracle就不需要访问表,而是可以完全从索引中获得结果。如果要选择该索引中没有的其他列,Oracle还需要读取首先在索引中找到该行的表行

如果不添加更合适的索引或以其他方式更改数据库模式,就无法解决此问题

如果我对列应用函数,我将失去索引的好处

啊,但是指数有什么好处呢

考虑以下两个值:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
它们都超过12个字符吗?对它们可能在索引中相邻吗?当然不是。因此,Oracle使用索引查找这些值的唯一方法是对索引执行完全快速扫描,并计算每个条目的长度。现在甲骨文可以做到这一点,但它值得吗

您发布的查询仅选择了
名称
。在注释中,您所说的
name
不可为空。在这种情况下,Oracle使用索引会很有效,因为不需要读取表记录:索引有足够的信息来满足查询

不过

你在评论中还说:

查询并不是那么简单

如果实际查询在投影中包含其他列,则数据库必须访问该表才能获取这些值。此时,索引读取的经验法则开始生效:如果查询的结果集大于表中所有行的1-2%,则执行完整表扫描比使用索引更有效。因此,表中记录的数量变得相关,尤其是
length(name)>12的记录的比例。如果99%的记录都有短名称,那么完全快速扫描索引可能更有效。但如果只有90%的用户使用该索引,则可能会对性能造成致命影响

同样,如果您的实际查询在WHERE子句中应用了其他条件,那么进行完整表扫描(因为数据库需要读取记录以评估这些过滤器)以使用不同的索引(如果有合适的索引)可能会更有效

因此,虽然索引对于您在问题中发布的玩具查询很有用,但它可能对您的实际查询没有帮助,而且确实可能导致次优访问路径

根据查询的复杂性,是否会出现具体情况

对。答案总是,视情况而定。这就是为什么数据库调优专家可以收取他们所做的fat咨询费。如果您没有提供完整的查询,我们所能做的就是祝您好运

如果我对列应用函数,我将失去索引的好处

啊,但是指数有什么好处呢

考虑以下两个值:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
它们都超过12个字符吗?对它们可能在索引中相邻吗?当然不是。因此,Oracle使用索引查找这些值的唯一方法是对索引执行完全快速扫描,并计算每个条目的长度。现在甲骨文可以做到这一点,但它值得吗

您发布的查询仅选择了
名称
。在注释中,您所说的
name
不可为空。在这种情况下,Oracle使用索引会很有效,因为不需要读取表记录:索引有足够的信息来满足查询

不过

你在评论中还说:

查询并不是那么简单

如果实际查询在投影中包含其他列,则数据库必须访问该表才能获取这些值。此时,索引读取的经验法则开始生效:如果查询的结果集大于表中所有行的1-2%,则执行完整表扫描比使用索引更有效。因此,表中记录的数量变得相关,尤其是
length(name)>12的记录的比例。如果99%的记录都有短名称,那么完全快速扫描索引可能更有效。但如果只有90%的用户使用该索引,则可能会对性能造成致命影响

同样,如果您的实际查询在WHERE子句中应用了其他条件,那么进行完整表扫描(因为数据库需要读取记录以评估这些过滤器)以使用不同的索引(如果有合适的索引)可能会更有效

因此,虽然指数是