复杂的Oracle SQL搜索查询优化

时间:2011-01-12 14:36:04

标签: sql oracle optimization stored-procedures

通常需要根据某些指定值在数据库中进行搜索。对于此问题,请考虑有一个表格,其中包含多个键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时进行比较 - 这是问题的一部分。如果是,也许这就是问题的解决方案。

有没有不牺牲性能的优雅解决方案?

1 个答案:

答案 0 :(得分:1)

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

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

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