在条件中加入与显式

时间:2011-09-27 21:11:10

标签: database oracle query-optimization

在Oracle数据库中,是否有一些正当理由要优先考虑通用查询,即由连接表表示的过滤条件,而不是具有大量元素(几百个)的IN条件的过滤器。我的意思是,如果你能写出像

这样的东西

SELECT .... FROM t1 在哪里t1。 IN(......)有100-200项

或者如果最好用

更改它

SELECT .... FROM t1 在t1上加入t2。 = T2。

其中t2表包含过滤器所需的值

非常感谢


感谢您的回答

我试着解释一下情况和我的疑问 我有一个用户界面,用户可以在控件中选择许多项目(例如,一个或多个人的专业人员列表)。 我可以直接使用这个列表在IN条件下添加它,即 SELECT .... FROM t1 WHERE t1。 IN(p1 ... p200) 但是这个解决方案可能会引发一些问题: - 如果所选项很多,那么字符串可以超过sql字符串的限制(我记得在Oracle中存在4000字节的限制) - 具有许多值的IN条件可能效率低下

所以替代解决方案可以 1.使用所选项创建临时表 2.使用temparary表和主表之间的连接

通常临时表的填写速度很快,我的问题是第二个解决方案是否比第一个更有效

3 个答案:

答案 0 :(得分:1)

这两个查询在功能上并不相同,所以这个问题有点奇怪 - 我无法想象这会经常出现(如果有的话)。

也就是说,如果你的表中包含了需要过滤的行,那么JOIN将是一种更自然/标准的处理方式。

第一个示例中的想法是查询t2以获取所有值,然后将它们添加到集合并生成IN子句吗?如果是这样,我会说这将是一个非常糟糕的做法。

答案 1 :(得分:1)

从我看来,有两个不同的问题。

a)使用静态列表/表。

如果(100-200)项目列表是静态值列表,例如,我们说国家或货币列表,我认为最好将其添加到静态表/参数表并更改查询以使用该表。如果您需要稍后跟踪新的代码/国家/地区等,稍后您需要做的就是在查找表中插入新代码。

此外,如果有其他查询使用相同的条件(通常有),则此查找表将促进重复使用。

select * from t1 where id in (select id from t2);
and 
select * from t1,t2
 where t1.id = t2.id 

既相同又优于

select * from t1 where 
  id in ('USD','EUR'..... ); -- 100 to 200 items to track.

b)Join vs IN的选择:

这真的无关紧要。 oracle执行的最终查询将是查询的转换版本,在两种情况下都可以评估相同的查询。

您应该看到两个查询中的哪一个更容易阅读并正确传达意图。

有用的链接:http://explainextended.com/2009/09/30/in-vs-join-vs-exists-oracle/

答案 2 :(得分:0)