【发布时间】:2019-04-18 20:34:26
【问题描述】:
我需要过滤掉超过一定长度的数据,但包含数据的列是索引列。如果我将函数应用于列,我将失去索引的好处。
由于我不是数据库管理员,因此无法创建新索引或更改列。 我不希望事后删除数据。
我知道一些过滤列的方法,但都会使用某种函数。
select
table.name
from
table
where
length(table.name)>12
;
table.name 字段不可为空。
【问题讨论】:
-
你有什么问题?
-
“我不是 DBA,因此无法创建新索引”。这是一个糟糕的借口 - 如果只有 DBA 可以创建新索引,并且如果您确实可以提出需要新索引的好案例,那么您将指示 DBA 创建您需要的索引。如果您的很多查询都根据列中字符串的长度进行过滤,那么该列上的基于函数的索引可能会很有帮助,而实际创建它的人并不重要。另一方面,如果只支持一个查询,并且查询不是关键,那么就不要创建索引,让查询尽可能长。
-
我知道在长度上创建索引将允许我使用不同的索引。我要问的是是否有办法解决这个问题。我试图通过具体问题来避免这样的答案。感谢您的意见。
-
如果该列中的值大于 12 个字符,您希望它不提取该列还是只希望该列中的前 12 个字符?
-
查询真的和你发的一样简单,还是还SELECT其他的?如果它像您发布的一样简单,则将使用索引,如果该列声明为
NOT NULL。另一方面,如果该列实际上可以为空,则不会使用索引,因为 Oracle 不够聪明,无法对自己说:“如果长度(NAME)> 12 那么 NAME 不能为 NULL,所以我被允许使用索引。”
标签: sql oracle performance query-optimization