sql嵌套查询效率_sql嵌套查询返回多个字段

sql嵌套查询效率_sql嵌套查询返回多个字段文章目录问题解决问题为了查询一个字段,使用了五层嵌套循环,但是花费了约1分钟但是5个表的数据每个最多只有10条,怎么会这么慢呢?解决比如查询语句SELECT*FROMstudet分析器会先看语句的第一个词,如果它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。内存中有student表接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析SELECT*FROMstudetWHEREstu_id=1


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

文章目录

问题

为了查询一个字段,使用了五层嵌套循环,但是花费了约1分钟
但是5个表的数据每个最多只有10条,怎么会这么慢呢?

解决

比如查询语句

SELECT * FROM studet

分析器会先看语句的第一个词,如果它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。 内存中有student表

接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析

SELECT * FROM studet WHERE stu_id=1

如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。

WHERE关键字后面的是条件表达式。条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。

这是执行一条sql语句发生的状况,那么如果进入嵌套查询

SELECT * FROM STUDENT WHERE stu_id IN (SELECT * FROM SC WHERE sc_id IN (SELECT * FROM SS))

分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针p1找到第一条记录,
在这里插入图片描述

接着找到WHERE关键字计算它的条件表达式,
如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。
如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把虚表返回给用户。
在这里插入图片描述

太可怕了,前面的sql查询一小步,仅仅移动一个指针指向后面的下一条数据,就是后面所有查询条件的一大步
在这里插入图片描述

(外面的那个SELECT)到WHERE关键字的时候,又进入了另一个SQL语句中,
分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入WHERE里分析里面的SQL语句,再把SC表装入内存,另一个指针(例如p2)指向SC表中的第一条记录,分析WHERE后面的条件表达式,依次进行分析,最后分析出一个虚表2。

那么可以继续推演,进入了SS表,把SS表放入内存中,继续where条件的判断,层层套娃

如果虚表为空表,虚表2 也就为false,不返回到SELECT,
而内存中student表的p1指向下一条记录,继续让SC表受尽折磨
p1每移动一次,后面所有的查询都会再次重复进行

如果虚表2不为空也就是有记录,那么虚表2 为true,返回到SELECT并把p1指向的记录添加到主SQL语句的虚表1当中。

(这也是为什么嵌套的SQL语句SELECT 后面为一般为的原因,因为它EXISTS返回的只是真或假,字段的名没有意义,用就行,当然用别的也不会错。 )

这里虽然嵌套的SQL语句分析完了,但主SQL语句只执行了一遍,也就是说p1指向Student的第一条记录,p1还要再指向Student表的下一条记录并分析,这样又进入了嵌套中的SQL语句,同上面说的一样分析。当p1也到了Student表的结尾,整个SQL语句结束。返回虚表1这一列。

其对于内存的消耗,与计算量的消耗非常高,复杂度是MxN次查询,
因为每一条数据都要和后面where的一次子查询的查询结果进行比对,1:N
每次查询分析到from的时候都会把表装进一次内存,创建一次临时表,MxN次的存入内存,内存消耗巨大

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169411.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 几种常见的距离计算公式

    几种常见的距离计算公式在学习分类、聚类、预测、推荐算法的过程中常常会遇到比较两个或多个对象的相似性,而相似性的度量可以通过计算距离来实现。我们常用的距离计算公式是欧几里得距离公式,但是有时候这种计算方式会存在一些缺陷,那么就需要另外的计算方法去加以补充,本文将介绍几种在机器学习中常用的计算距离。在做很多研究问题时常常需要估算不同样本之间的相似性度量(SimilarityMeasurement),这时通常采用的方法就…

    2022年6月19日
  • 防止攻击服务器_iis部署网站无法通过ip访问

    防止攻击服务器_iis部署网站无法通过ip访问摘要:介绍了IIS服务器常见的攻击及几种常见防御方式,阐述了IIS服务器的攻击原理,针对IIS服务器的缺陷阐述了IIS的常用防御方式,同时结合实例具体实现方式。关键词:IIS;服务器攻击;服务器防御中图分类号:TP393            文献标识码:A0         引言  随着Internet的不断发展与普及,英特网上出现了越来越多的WEB服务器。人们通过WEB服

    2022年8月30日
  • 什么是数据安全软件?「建议收藏」

    什么是数据安全软件?「建议收藏」数据安全软件有各种形式和大小。工具存在并且旨在保护所有类型的数据,从单个消息到整个数据库。每家公司,无论规模大小,都应将数据安全作为核心业务实践,并尽其所能确保存储在其业务每个缝隙中的数据受到保护;任何对敏感信息的盗窃都可能损害企业和客户。

    2022年5月21日
  • 数据库六大范式(数据库一范式二范式怎么区分)

    1.第一范式(1NF):在关系(表)中,列(属性/字段)不可再分1.每一列属性都是不可再分的属性值,确保每一列的原子性2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据2.第二范式(2NF)消除了非主属性对于主属性的部分函数依赖属性完全依赖于主键。第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的

    2022年4月15日
  • 签名设计一笔签步骤「建议收藏」

    签名设计一笔签步骤「建议收藏」首语:签名设计一笔签步骤,很多人都不会写艺术签名,其实,作为一个普通人,不会写是正常的,因为会设计的都是下过功夫的,今天就来给大家分享【签名设计一笔签步骤】,希望大家能够喜欢!签名设计一笔签步骤其实每个名字的签名步骤都是不一样的,特别是不一样的字都是有自己独特的写法的,所以,很难给大家都讲解了的,不过没关系,我找几个典型的来给大家设计做下示范,大家慢慢学习就行了。目录:1、设计签名工具的选择2、签名设计应该掌握的技巧方法3、视频演示4、具体的操作步骤5、注意事项正文:1、设计签名工具的

    2022年9月6日
  • android于src和background差额

    android于src和background差额

    2022年1月15日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号