【问题标题】:Complex Oracle SQL search query optimisation复杂的 Oracle SQL 搜索查询优化
【发布时间】:2011-01-12 14:36:04
【问题描述】:

通常需要根据一些指定的值在数据库中进行搜索。对于这个问题,考虑有一个表,其中包含许多键 K = {K1, K2 ... Km} 和许多元列 C = {C1, C2 ... Cn}。元列不包含在任何键中。在搜索条件定义为S = {Ki, Cj1, Cj2 ... Cjh} 的情况下,执行查询的优雅和有效方法是什么?

说明:

  • 元列是任何不属于键的列;
  • S 是一种搜索条件,它始终只包含一个键和可供过滤的可选元列;

现实生活中的例子(故事处理系统):

  • 键:时间范围,story_id
  • 元列:标题、记者、编辑……

要求能够使用为元列提供的任意数量的可选过滤器来搜索任何键。

可能的解决方案:

  • 一种解决方案是使用动态 SQL。考虑到这些reasons,这不是首选。
  • 使用存储过程,每个键一个过程。因为只指定了元列的子集,所以可以使用类型为 table.column = NVL(paratemers.column, table.column) 的元列表达式。我不确定 Oracle 是否会优化查询的这一部分以避免在 parameters.columnNULL 时进行比较 - 这是问题的一部分。如果是,也许这就是问题的解决方案。

有什么优雅的解决方案不会牺牲性能?

【问题讨论】:

  • 很难看出你在做什么。我认为这取决于键的密度 - 如果稀疏,那么键上的索引应该是有效的。
  • 你能举一个真实布局的例子吗?在这种情况下,什么是元列或S = {Ki, Cj1, Cj2 ... Cjh} 对我来说并不明显。
  • Randy,除了键之外,还有其他列要过滤。应该如何编写高效的查询来过滤任意数量的可选非键列?
  • 用你的话说什么是“钥匙”?它是一个复合的PRIMARY KEY,还是一组独立的UNIQUE 字段?密钥的时间范围部分如何?最好只提供一些数据样本。

标签: sql oracle optimization stored-procedures


【解决方案1】:

使用绑定变量的动态 SQL 是可行的方法。您发布的“原因”链接正确地针对具有连接值的动态 SQL - 尽管它的标题确实表明它指的是所有动态 SQL。事实上,它继续展示了如何使用绑定变量执行动态 SQL:

"SELECT * FROM SomeTable Where Field1 = @FirstValue AND SecondField = @SecondField"

现在,当某些条件(或出于某种原因调用它们的“元列”)是可选的时,您可以根据已指定的值构建动态 SQL,并在运行时绑定这些值。

【讨论】:

  • 我刚刚阅读了链接的文章。 “动态 SQL 需要死”是一个完全误导性的标题!如果正确使用绑定变量,那么本文中的所有问题都不是问题。它只是写成一个巨大的咆哮!
猜你喜欢
  • 2011-03-04
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多