【问题标题】:SQL INDEX when using LIKE operator (DB2)使用 LIKE 运算符时的 SQL INDEX (DB2)
【发布时间】:2012-10-01 21:34:33
【问题描述】:

我知道在 Oracle 中有一个叫做 DOMAIN INDEX 的东西。但在 DB2 中如何?

我的大表中有语句:

SELECT * from TABLE where (upper(COLUMN1) like '%HGW%'))

由于 UPPER 和 LIKE,COLUMN1 上的常规正常 INDEX 不会有帮助。 创建一些强大的索引的语法是什么,它将影响这个 UPPER 和 LIKE 语句以获得这个查询的快速结果? 我会很感激的例子和帮助。 不幸的是,我无法删除第一个 % 或第二个 %。

【问题讨论】:

标签: sql indexing db2


【解决方案1】:

首先,每当您在列上运行 upperlower 之类的函数时,该列上的索引将不会被使用,RDBMS 将诉诸全表扫描。要使索引正常工作,该列应单独保留。甚至:

SELECT col1 from table where col2+1 = 3

不起作用,因为您正在列上运行一个函数(添加),所以col2 上的索引(如果有)将不会被使用。因此,您必须将其更改为:

SELECT col1 from table where col2 = 3-1

第二件事,当模式以通配符开头时,例如*.,索引也不会被使用,因为您可以很容易地猜到,RDBMS 将无法知道哪个字符列值以开头。所以有两个步骤:

首先,更改排序规则,使fooFoofOo 匹配。这样upper 就会得到处理。

其次,您必须注意通配符部分。如果在HG 之前确实允许有很多字符,那么最好的选择是使用全文索引(不知道DB2 是否有)。这个索引是专门为这些目的而构建的,全文搜索,所以你可以利用它。当然,它会消耗更多的资源,因为索引结构非常复杂,但你必须忍受它。

【讨论】:

  • 您可以定义一个用于upper 查询的索引:只需在 WHERE 子句中使用的 表达式 上定义一个索引。
  • create index idx_upper_bar on foo (upper(bar)) 该索引将用于此 where 子句:where upper(bar) = 'BLA'
  • 您好,感谢您的帮助。所以你认为对于鞋面会有影响吗?在 TABLE (upper(COLUMN1)) 上创建索引 idx_upper_bar 这是您的想法吗?但是在您的查询 where upper(bar) = 'BLA' 没有 like 运算符?
  • 这个索引在我的查询中有用吗 SELECT * from TABLE where (upper(COLUMN1) like '%HGW%'))
  • 您的表仍然不会使用索引,因为您的字符串左侧有一个通配符。 (用花哨的话说,它不是sargable)。您向数据库询问的内容就像要求某人查找电话簿中所有姓名中包含“hgw”的人。您可以利用索引(在此示例中按姓氏排序),因为它可以是名称的任何部分。他们仍然必须一次一个地逐个查找这个字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多