【发布时间】: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.column是NULL时进行比较 - 这是问题的一部分。如果是,也许这就是问题的解决方案。
有什么优雅的解决方案不会牺牲性能?
【问题讨论】:
-
很难看出你在做什么。我认为这取决于键的密度 - 如果稀疏,那么键上的索引应该是有效的。
-
你能举一个真实布局的例子吗?在这种情况下,什么是元列或
S = {Ki, Cj1, Cj2 ... Cjh}对我来说并不明显。 -
Randy,除了键之外,还有其他列要过滤。应该如何编写高效的查询来过滤任意数量的可选非键列?
-
用你的话说什么是“钥匙”?它是一个复合的
PRIMARY KEY,还是一组独立的UNIQUE字段?密钥的时间范围部分如何?最好只提供一些数据样本。
标签: sql oracle optimization stored-procedures