避免嵌套查询

2024-02-27

避免嵌套查询是多么重要。

我总是学会像躲避瘟疫一样避开它们。但它们对我来说是最自然的事情。当我设计查询时,我首先编写的是嵌套查询。然后我将其转换为联接,这有时需要花费很多时间才能正确。并且很少会带来很大的性能提升(有时确实如此)

那么他们真的那么糟糕吗?有没有办法在没有临时表和文件排序的情况下使用嵌套查询


这确实取决于,我曾经遇到过通过使用子查询改进一些查询的情况。

我所知道的因素是:

  • 子查询是否使用外部查询中的字段进行比较(相关的 http://dev.mysql.com/doc/refman/5.1/en/correlated-subqueries.html or not)
  • 外查询和子查询之间的关系是否被索引覆盖
  • 如果连接上没有可用的索引,并且子查询不相关并返回一个小结果,那么使用它可能会更快
  • 我还遇到过这样的情况:将使用 order by 的查询转换为不使用 order by 的查询,然后将其转换为简单的子查询和排序,以提高 mysql 的性能

不管怎样,测试不同的变体总是好的(请使用 SQL_NO_CACHE),并且将相关查询转换为联接是一个很好的实践。

我什至认为这是一种非常有用的做法。

如果相关查询是您首先想到的,那么您可能主要考虑的不是集合操作,而是过程操作,并且在处理关系数据库时,完全采用集合是非常有用的对数据模型及其转换的看法。

EDIT: 过程性与关系性
从集合运算与过程的角度思考可以归结为某些集合代数表达式中的等效性,例如并集上的选择相当于选择的并集。两者没有区别。
但是,当您比较这两个过程时,例如使用 make a union 将选择标准应用于联合的每个元素,然后应用选择,这两个过程是明显不同的过程,它们可能具有非常不同的属性(例如 CPU 的利用率,我/O,记忆)。

关系数据库背后的想法是,您不必尝试描述如何获得结果(过程),而只描述您想要的结果,并且数据库管理系统将决定满足您的请求的最佳路径(过程)。这就是为什么 SQL 被称为第四代语言(4GL) http://en.wikipedia.org/wiki/4GL.

帮助您做到这一点的技巧之一是提醒自己元组没有固有的顺序(集合元素是无序的)。 另一个是认识到关系代数非常全面,并且允许将请求(要求)直接转换为 SQL(如果模型的语义很好地代表了问题空间,或者换句话说,如果附加到表和关系名称的含义正确) ,或者换句话说,如果您的数据库设计得好)。

因此,你不必考虑如何,只需考虑什么。

就您而言,这只是对相关查询的偏好,因此我可能没有告诉您任何新内容,但您强调了这一点,因此发表了评论。

我认为,如果您完全熟悉将查询从一种形式转换为另一种形式的所有规则(rules http://en.wikipedia.org/wiki/Relational_algebra#Selection_.28.CF.83.29例如分配性)您不喜欢相关子查询(您会认为所有形式都是平等的)。

(注意:上面讨论了理论背景,对于数据库设计很重要;实际上,上述概念有所偏差 - 并非所有等效的查询重写都一定会快速执行,聚集主键确实使表在磁盘上继承了顺序,等等......但是这些偏差只是偏差;并非所有等效查询都执行得那么快,这一事实是实际 DBMS 的缺陷,而不是其背后的概念的缺陷)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免嵌套查询 的相关文章

  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • 如何使用 SQL Server 2008 将行复制到同一个表中

    A 到目前为止我的方式 sqlCommand CommandText INSERT Table1 column1 column2 column3 SELECT column1 column2 column3 FROM Table1 WHER
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • mysql排序和排名语句

    我需要一些 mysql 语句的帮助 我的表 1 有 7 列 表 2 有 8 列 额外的列名为排名 我的语句应该是这样的 从表 1 中选择全部 然后按 用户数 排序 将其插入表 2 中并排名开始 1 2 3 等 table 1 usernam
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我

随机推荐

  • 如何在atom包内设置断点?

    我想弄清楚为什么这个原子包https github com AtomLinter linter elixirc https github com AtomLinter linter elixirc 行为不端 它的作者说我应该在包的某些函数中
  • Asp .Net Core 2 + SignalR (1.0.0-alpha2-27025) + /signalr/negotiate 404 错误

    我将 SignalR 添加到 ASP Net Core 2 应用程序 packages Microsoft AspNetCore All 版本 2 0 0 Microsoft AspNetCore SignalR 版本 1 0 0 alph
  • ES6 导出对象的所有值

    假设我有一个模块 my module js 有一个对象 该对象应该是它的返回值 let values a 1 b 2 c 3 export values results in SyntaxError Unexpected token 所以我
  • FParsec 只解析括号之间的 expr

    我正在编写一个解析器 用于学习 pourpuses 我希望它能够解析类似的结构 let myVar be 40 plus 2 and let myVar be 40 plus 2 没有问题 但我的解析器不 理解 前者 它看到的是40并认为
  • Apache Netbeans 版本 11.1 使用 OpenJDK 11 构建错误

    我有一个使用 JDK 8 和 NB 8 2 创建的项目 我想使用 OpenJDK 11 将该项目迁移到 NB 11 1 环境是 Windows 10 上的 NB 11 1 全新安装 使用 OpenJDK 11 0 2 我将所有源代码和库 j
  • updatepanel 回发后调用 javascript

    我将以下 javascript 代码内联放置 但在 updatepanel 完成回发后它不会触发 function EndRequestHandler sender args alert this should work Sys WebFo
  • Jquery 选项卡,在 Firefox 中重新加载 jQuery HTML 后,未格式化的列表会闪烁

    我正在使用最新的 jQuery 选项卡 并且我的所有选项卡 以及它们上面的其他内容 都位于包含 Div 中 其中一个选项卡中有一个表单 当表单提交时 通过 AJAX 对其进行处理 然后返回的 HTML 替换整个包含的 Div 返回的 HTM
  • 反射应该使用到什么程度?

    我们在项目中遇到了一个非常棘手的场景 我们在项目中使用了很多反射 我们有 由属性和反射驱动的验证框架 使用属性和反射将 DataRow 转换为实体对象的扩展方法 反之亦然 我们对 DataTable 和 EntityCollections
  • 统计PHP页面中所有HTML标签

    我花了时间在正则表达式上解决这个问题但没有结果 我尝试使用 PHP 5 3 解决这个问题 诸如 在页面中重复的次数以及有关页面中所有标签的信息等信息 不幸的是 您的问题目前的形式几乎无法理解 请尝试更新并更具体 如果你想计算页面中所有 HT
  • Intl.DateTimeFormat 选项哈希:使用“2 位数字”获取前导零

    Intl DateTimeFormat en US weekday long year numeric month long day 2 digit hour 2 digit minute 2 digit second 2 digit fo
  • 如何使用 d3.js 将填充部分添加到 SVG 圆圈

    我正在使用 d3 js 生成一些 SVG 圆圈 我能够生成它们 但我不知道如何将它们分成 4 个相等的部分并为每个部分填充颜色 我正在使用 d3 js 版本 4 这是我的小提琴中的 javascript 片段 var nodes type
  • 无法通过curl或Postman访问docker url

    我可以使用以下路径在浏览器中访问我的网站 my dash docker localhost 8000 我正在尝试编写一个API端点 但无法通过Postman或curl访问该网站 curl my dash docker localhost 8
  • 将数据存储到 DOM - 元素值与数据属性

    要将值存储在 DOM 元素中 我们可以通过data属性 abc data item 1 检索做 abc data item 但今天我了解到我们也可以这样做 abc 0 item 1 检索做 abc 0 item 它们之间有什么区别 哪一个更
  • Python 多线程在 IO 任务中没有任何好处?

    我正在尝试用 python 读取数千小时的 wav 文件并获取它们的持续时间 这本质上需要打开 wav 文件 获取帧数并考虑采样率 下面是代码 def wav duration file name wv wave open file nam
  • uitableviewcell 上的 tableview 中出现重复行

    我发现一些帖子与我的问题相似但不完全相同 在我的应用程序中 用户可以在多个 uitableviews 之间导航以深入了解所需的结果 当用户向前 然后向后 然后向前等时 可以注意到行正在被重绘 重写 并且文本变得越来越粗 我发现在一些帖子中这
  • 如何将函数参数传递给 boost::thread_groups::create_thread()

    我是新来的增强线程我试图了解如何将函数参数传递给boost thread groups create thread 功能 在阅读了一些教程和 boost 文档后 我了解到可以简单地将参数传递给这个函数 但我无法让这个方法起作用 我读到的另一
  • 使用 BigQuery 的 QUALIFY 运算符有什么优势?

    我刚刚发现了 BigQuery 的 QUALIFY 运算符 并且一直在以下位置阅读相关内容 https cloud google com bigquery docs reference standard sql query syntax q
  • 如何使用react-google-recaptcha重置Google recaptcha

    看起来谷歌验证码的工作方式是这样的 如果使用特定令牌进行了验证尝试 则无法再次使用它 文档指出 您将需要调用 grecaptcha reset 来要求最终用户再次使用 reCAPTCHA 进行验证 我正在尝试使用react google r
  • Objects.hash() 与 Objects.hashCode(),需要澄清

    从 Java 7 开始 我们有 o hashCode Objects hashCode o Objects hash o 前两个与空检查大致相同 但最后一个是什么 当提供单个对象引用时 返回值不会 不等于该对象引用的哈希码 这是为什么 我的
  • 避免嵌套查询

    避免嵌套查询是多么重要 我总是学会像躲避瘟疫一样避开它们 但它们对我来说是最自然的事情 当我设计查询时 我首先编写的是嵌套查询 然后我将其转换为联接 这有时需要花费很多时间才能正确 并且很少会带来很大的性能提升 有时确实如此 那么他们真的那