实时搜索: in和exists的效率谁高

in和exists的效率谁高

364条评论 2879人喜欢 6169次阅读 388人点赞
两个表链接字段都是索引,而且都建立了分区,A(180,000,000),B:(90,000,000),其中以B表为基准去分组统计。

基本情况就这样,大家给点意见 , 例如在算法、效率和查询结果上的区别 ...

但据说in效率也不如exist,,, 以上语句可以改成exist的吗, 或者其他效率更好的方法?: 个人看法,在大规模数据库中,关键是明白每个关键字在表中使用的时候,具体的实现逻辑,也就是对表的操作逻辑。就你上次举例的语句,如果数据有5百万以上,非聚合索引列,那么,实际消耗最大的还是遍历表,至于对每个记录的对比,in 还是exist 还是多个or,其实差别及其细微,而且和外部环境/列属性都有关系,不能一概而论。
如果你是简单了解,那么记得,exist不要随便用(一般管理子查询),in=多个or,就可以了。
如果是研究,那么。。我没资格教你,也就是互相探讨。研究的话,还是认真看一些英文原版的资料吧,这里探讨。。终觉浅(个人看法)

为什么NOT IN比NOT EXISTS效率差: 这个还是要看 在not in 和 not exists 关联的是不是索引吧。我认为使用not in 之后,索引应该失效,不会使用索引去查询语句,not exists 会比 not in 快一些吧,效率高点

SQL中IN和EXISTS用法的区别: SQL中IN和EXISTS用法的区别
NOT IN

SELECT DISTINCT MD001 FROM BOMMD WHERE MD001 NOT IN (SELECT MC001 FROM BOMMC)
NOT EXISTS,exists的用法跟in不一样,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度
select DISTINCT MD001 from BOMMD WHERE NOT EXISTS (SELECT MC001 FROM BOMMC where BOMMC.MC001 = BOMMD.MD001)
exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反。
exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。

in和exists

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
in 与 =的区别
select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的结果是相同的。

请教minus/not in/not exists的原理和效率: 试试如下的速度如何?

Select a.*
From gal_voucher_item a, gal_voucher_item_detail b
where a.item_iid = b.item_iid(+)
and b.item_iid is null;

在sql语句多表连接中,in、exists、join哪个效率更高一点?: EXISTS、IN与JOIN,都可以用来实现形如“查询A表中在(或不在)B表中的记录”的查询逻辑。

在查询的两个表大小相当的情况下,3种查询方式的执行时间通常是:
EXISTS <= IN <= JOIN
NOT EXISTS <= NOT IN <= LEFT JOIN
只有当表中字段允许NULL时,NOT IN的方式最慢:
NOT EXISTS <= LEFT JOIN <= NOT IN

但是如果两个表中一个较小,一个较大,则子查询表大的用exists,子查询表小的用in,因为in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。而无论那个表大,用not exists都比not in要快。这是因为如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。

IN的好处是逻辑直观简单(通常是独立子查询);缺点是只能判断单字段,并且当NOT IN时效率较低,而且NULL会导致不想要的结果。
EXISTS的好处是效率高,可以判断单字段和组合字段,并不受NULL的影响;缺点是逻辑稍微复杂(通常是相关子查询)。
JOIN用在这种场合,往往是吃力不讨好。JOIN的用途是联接两个表,而不是判断一个表的记录是否在另一个表。

ORACLE 中 2个大表(超过1亿),是in效率高还是exists效率高?: 这个要看解析,有时候in好,有时候exists好,有时候with tmp as好,不过最稳定的还是join,所以尽量用join。不过这么大的表,维护主要看分区做的怎么样,in这些逻辑符不是最关键的。

sql中in和exist语句的区别?能否举个例子?: IN
确定给定的值是否与子查询或列表中的值相匹配。

EXISTS
指定一个子查询,检测行的存在。

比较使用 EXISTS 和 IN 的查询

这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。

USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO

-- Or, using the IN clause:

USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO

下面是任一查询的结果集:

pub_name
----------------------------------------
Algodata Infosystems
New Moon Books

(2 row(s) affected)

SqlServer中in和exists的区别效率问题: in和existsin是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)1:select*fromAw

  • .江青是谁

    北京同仁医院眼科有刘毅老师吗?: 我不是北京人不知道有这个人 ...

    857条评论 4624人喜欢 1577次阅读 596人点赞
  • 16款轩逸安全气囊几个

    我在用Word写毕业论文,可是有很多数学公式要怎么插入呀?Surface支持这个功能么?: 数学公式可以用公式编辑器插入,这个较容易。word2003版的话,点击插入对象,然后找找一个叫mathtype的就可以了。 ...

    228条评论 3963人喜欢 3830次阅读 851人点赞
  • 师铭泽是谁

    WORD文件里的表格为什么不让修改,一点鼠标,光标马上跑文件首行了?: 试试这个办法:文件——另存为——输个新的文件名(或更改路径)——保存类型(文件名下一栏)选择尽可能低Word版本例如:Works 6.0/7.0 保存后,关闭Word,重新打开刚保存的文件。看看可以解密了。 ...

    777条评论 5329人喜欢 1255次阅读 801人点赞
  • dnf箱子在哪里

    怎样在Word用公式编辑器输入矢量符号????: 在矩阵矢量中,我们一般是采用加粗的形式来表示。在MathType中,也可以很快地编辑出这样加粗的矩阵矢量,而不用每次都进行加粗的操作。1.按照自己的使用习惯打开MathType公式编辑器,进入到编辑界面。打开方式可以...

    960条评论 3802人喜欢 2495次阅读 511人点赞
  • ipad pro怎样

    word中随意用笔画图修改: 要除去修订和批注,您需要接受或拒绝修订,以及删除批注。方法如下:  1、在“审阅”选项卡上的“跟踪”组中,单击“显示标记”旁边的箭头。2、确保下列每个复选框旁边都显示复选标记:  ·批注  ·墨迹注释  ·插入和删除...

    649条评论 3413人喜欢 4108次阅读 440人点赞
  • pr怎么调整视频大小

    一幅十字绣成品花开富贵是GMC的大概能卖多少钱: 没规格 套件牌子也没听说过 如果是六尺牡丹 价格在5000-7000左右 如果是花开富贵 老版本的(蜜蜂 鸟)那个版本的 2000左右 ...

    336条评论 4068人喜欢 3676次阅读 345人点赞
  • 2013有哪些好听的歌

    办公文员常用的excel和word都有哪些公式??: 时间函数 DAY MONTH等文本函数 LEN SUBSTITUTE MIN LEFT RIGHT等统计函数 SUM SUMIF COUNT COUNTIF SUMPRODUCT等查找和引用函数 INDEX+MAT...

    596条评论 3639人喜欢 3338次阅读 662人点赞
  • 1 a 多少

    怎么解决公式在WORD中占用行距的问题: 使用线性公式就可以。步骤:1 输入公式2 在公式上选择线性功能3 这样就可以实现不占用行距的目的 ...

    775条评论 1063人喜欢 3261次阅读 720人点赞