【问题标题】:How to increase performance with cross join and LIKE and NOT LIKE operator?如何使用交叉连接和 LIKE 和 NOT LIKE 运算符提高性能?
【发布时间】:2021-06-19 22:43:00
【问题描述】:

我使用下面的查询来使用连接条件,它需要更多的时间来运行并且查询的成本也越来越高。 我没有任何线索可以替换任何操作员。 任何人都可以建议最佳查询以使其表现良好

select column1 as start_1, column2 as end_2
from table1 a cross join table2 b
where a.key = b.id
and (b.id_number LIKE '%123%')
and (a.tye IN (203, 201))
and (b.process_typ not LIKE '%G%');

【问题讨论】:

  • 能贴一下表定义、索引定义和查询计划吗?使用包含前导通配符和尾随通配符的谓词可能不太可能做很多事情。根据数据的实际情况,您也许可以使用 Oracle Text 对字符串进行标记,但仅根据列名这看起来不太可能。
  • 这不是交叉连接,而是内部连接,因为 WHERE 子句。您无法优化此查询,因为您的 LIKE 逻辑两边都有通配符(不可搜索)。
  • 此外,否定谓词(例如 NOT LIKE; NOT IN; !=)往往会阻止优化器使用索引。不幸的是,有很多事情对这个查询起作用。

标签: sql oracle query-optimization


【解决方案1】:

虽然不会影响性能,但还是使用JOIN/ON编写查询:

select column1 as start_1, column2 as end_2
from table1 a join
     table2 b
     on a.key = b.id
where b.id_number LIKE '%123%' and
      a.tye IN (203, 201) and
      b.process_typ not LIKE '%G%';

您希望在表上建立索引。不幸的是,LIKE 在搜索模式开头带有通配符会阻止使用索引。但你可以使用:

  • table1(tye, key)
  • table2(id)

假设id 是表的主键,您可能已经有了第二个索引。

如果您需要字符串搜索,可能会发现 Oracle 的全文搜索功能很有用。或者,可能存在可以帮助查询的计算列。例如,如果“123”或“G”实际上意味着什么,那么也许您应该将此信息作为标志而不是解析字符串。

【讨论】:

  • 能否将LIKE '%G%' 重写为INSTR( process_typ, 'G' ) > 0 并为此创建基于函数的索引?不过,这对于谓词来说是非常具体的。
  • @eaolson 。 . .是的。但是,我可能会使用(case when process_type like '%G%' then 1 else 0 end)。但是,二进制标志通常不能构成一个好的索引。
猜你喜欢
  • 2015-06-18
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多