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