Oracle的OR vs OR,哪个更快?

Đin*_*hâu 20 sql oracle performance

我正在开发一个处理Oracle数据库中许多数据的应用程序.
在某些情况下,我必须根据给定的条件列表获得许多对象,并且我使用SELECT ...FROM.. WHERE... IN...,但IN表达式只接受一个大小最多为1,000个项目的列表.

所以我使用OR表达式,但正如我观察到的那样 - 也许这个查询(使用OR)比IN(使用相同的条件列表)慢.这样对吗?如果是这样,如何提高查询速度?

OMG*_*ies 27

IN最好是OR- OR是一个出了名的糟糕的表演者,并且可能导致在复杂查询中需要使用括号的其他问题.

比任何一个IN或更好的选项OR是加入包含您想要(或不想要)的值的表.此表可用于比较,临时或已存在于模式中.


WW.*_*WW. 7

在这种情况下,我会这样做:

  1. 创建一列全局临时表
  2. 使用外部源列表填充此表(并快速 - 另一整个讨论)
  3. 通过将临时表连接到另一个表来执行查询(考虑动态采样,因为临时表不具有良好的统计信息)

这意味着您可以将排序保留到数据库并编写简单查询.


jva*_*jva 5

无论如何,Oracle 在内部将 IN 列表转换为 OR 列表,因此实际上应该没有性能差异。唯一的区别是 Oracle 必须转换 IN,但如果您自己提供 OR,则需要解析更长的字符串。

这是您测试的方法。

CREATE TABLE my_test (id NUMBER);

SELECT 1 
FROM my_test
WHERE id IN (1,2,3,4,5,6,7,8,9,10,
             21,22,23,24,25,26,27,28,29,30,
             31,32,33,34,35,36,37,38,39,40,
             41,42,43,44,45,46,47,48,49,50,
             51,52,53,54,55,56,57,58,59,60,
             61,62,63,64,65,66,67,68,69,70,
             71,72,73,74,75,76,77,78,79,80,
             81,82,83,84,85,86,87,88,89,90,
             91,92,93,94,95,96,97,98,99,100
             );

SELECT sql_text, hash_value
FROM v$sql 
WHERE sql_text LIKE '%my_test%';

SELECT operation, options, filter_predicates
FROM v$sql_plan
WHERE hash_value = '1181594990'; -- hash_value from previous query
Run Code Online (Sandbox Code Playgroud)

选择语句
表访问已满(“ID”=1 或“ID”=2 或“ID”=3 或“ID”=4 或“ID”=5 或“ID”=6 或“ID”=7 或“ID”= 8 OR “ID”=9 OR “ID”=10 OR “ID”=21 OR “ID”=22 OR “ID”=23 OR “ID”=24 OR “ID”=25 OR “ID”=26 OR "ID"=27 OR "ID"=28 OR "ID"=29 OR "ID"=30 OR "ID"=31 OR "ID"=32 OR "ID"=33 OR "ID"=34 OR "ID "=35 OR "ID"=36 OR "ID"=37 OR "ID"=38 OR "ID"=39 OR "ID"=40 OR "ID"=41 OR "ID"=42 OR "ID"= 43 OR “ID”=44 OR “ID”=45 OR “ID”=46 OR “ID”=47 OR “ID”=48 OR “ID”=49 OR “ID"=50 OR "ID"=51 OR "ID"=52 OR "ID"=53 OR "ID"=54 OR "ID"=55 OR "ID"=56 OR "ID"=57 OR "ID" =58 OR “ID”=59 OR “ID”=60 OR “ID”=61 OR “ID”=62 OR “ID”=63 OR “ID”=64 OR “ID”=65 OR “ID”=66 OR "ID"=67 OR "ID"=68 OR "ID"=69 OR "ID"=70 OR "ID"=71 OR "ID"=72 OR "ID"=73 OR "ID"=74 OR " ID"=75 OR "ID"=76 OR "ID"=77 OR "ID"=78 OR "ID"=79 OR "ID"=80 OR "ID"=81 OR "ID"=82 OR "ID" =83 OR "ID"=84 OR "ID"=85 OR "ID"=86 OR "ID"=87 OR "ID"=88 OR "ID"=89 OR "ID"=90 OR "ID"=91 OR "ID"=92 OR "ID"=93 OR "ID"=94 OR "ID"=95 OR "ID"=96 OR "ID"=97 OR "ID" =98 或“ID”=99 或“ID”=100)

  • 您创建的表是堆表 - 没有主键/索引 (2认同)