Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在vs或Oracle中,哪个更快?_Sql_Performance_Oracle - Fatal编程技术网

Sql 在vs或Oracle中,哪个更快?

Sql 在vs或Oracle中,哪个更快?,sql,performance,oracle,Sql,Performance,Oracle,我正在开发一个应用程序,它可以处理Oracle数据库中的许多数据。 在某些情况下,我必须根据给定的条件列表获取许多对象,并使用SELECT…FROM。。哪里IN…,但IN表达式只接受最大为1000项的列表 所以我使用了OR表达式,但正如我所观察到的,使用OR的查询可能比使用相同条件列表的查询慢。是这样吗?如果是这样,如何提高查询速度 IN优于OR-或是一个出了名的糟糕执行者,并且可能会导致在复杂查询中需要使用括号的其他问题 与IN或or相比,更好的选择是连接到一个包含您想要或不想要的值的表。此用

我正在开发一个应用程序,它可以处理Oracle数据库中的许多数据。 在某些情况下,我必须根据给定的条件列表获取许多对象,并使用SELECT…FROM。。哪里IN…,但IN表达式只接受最大为1000项的列表

所以我使用了OR表达式,但正如我所观察到的,使用OR的查询可能比使用相同条件列表的查询慢。是这样吗?如果是这样,如何提高查询速度

IN优于OR-或是一个出了名的糟糕执行者,并且可能会导致在复杂查询中需要使用括号的其他问题


与IN或or相比,更好的选择是连接到一个包含您想要或不想要的值的表。此用于比较的表可以是派生的、临时的,也可以是架构中已经存在的

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

创建一个单列全局临时表 使用外部来源的列表填充此表,并快速完成另一个完整的讨论 通过加入临时表到其他表中进行查询,考虑动态采样,因为临时表将没有良好的统计数据。
这意味着您可以将排序留给数据库,然后编写一个简单的查询。

我会质疑整个方法。SP的客户端必须发送100000个ID。客户端从哪里获得这些ID?无论如何,发送如此大量的ID作为proc的参数将花费巨大。

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

下面是如何测试的

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
SELECT语句 表访问完整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


如果使用主键创建表:

CREATE TABLE my_test (id NUMBER,
CONSTRAINT PK PRIMARY KEY (id));
并通过相同的选择以使用多个IN值运行查询,然后通过哈希值检索执行计划,得到的结果是:

SELECT STATEMENT
INLIST ITERATOR
INDEX                  RANGE SCAN
这似乎意味着,当您有一个IN列表并将其与PK列一起使用时,Oracle会在内部将该列表保留为一个INLIST,因为处理该列表比将其转换为ORs(如未编制索引的表)更有效


我在上面使用的是Oracle 10gR2。

列表是静态的还是从查询中派生出来的?否,要查询的值列表是从外部资源检索的。有没有办法解决这个问题,因为我的列表太大,可能包含100000多个项目。如果您正在创建一个大型查询字符串,其中包含类似于…9997、9998、9999、10001001?这本身就需要花费大量的成本来传输和解析。不要介意sql注入的可能性。不,我只查询一个表。我的列表可能包含太多的项目,因此无法在中使用。我试着把列表分成更小的部分,并对一批子列表进行查询,但后来我不得不在内存中对数据进行排序,速度非常慢。是不是在and或OR中?也就是说,在扩展到或无论如何?这就是为什么不使用NULLfails@gbn:逻辑上,是的。但是IN是优化的,而不是使用OR-它不仅仅是语法上的糖分。你能提供任何证据证明IN不仅仅是语法上的糖分吗?我在我的回答中测试并公布了结果。@jva:一般的政策是在有人回应之后,而不是之前,否决投票。坦率地说,这是为了宣传你的答案。请记住,答案不会过时-更新的版本可能意味着行为无法保证。您创建的表是一个堆表-没有主键/index@OMGPonies在你的回答上加1,因为你没有否决jva作为报复。我知道这里很多人都会这么做。