避免嵌套查询

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(使用前将#替换为@)

避免嵌套查询 的相关文章

  • SQL Server 2008中与其他列的排序树

    我有一个使用它实现树的表层次结构ID column 样本数据 People Girls 1 Zoey 1 1 Kate 1 2 Monica 1 3 Boys 2 Mark 2 1 David 2 2 这是使用的顺序层次结构ID列作为排序列
  • count(distinct) over (partition by... 在 Oracle SQL 中不起作用

    我想数一下distinct day number过去 30 天 但是 distinct 函数不能与over 如果我删除distinct 它会给我总数day number but day number可以有很多重复的 所以这就是为什么我想添加
  • mysql错误1442的真正原因是什么?

    好吧 我在互联网上寻找了很多地方来寻找原因mysql error 1442其中说 无法更新存储函数 触发器中的表 unlucky table 因为 它已被调用此存储的语句使用 功能 触发器 有人说这是 mysql 中的一个错误或者它不提供的
  • 查看与存储过程连接的结果

    我在 SQL Server 中有一个由应用程序使用的现有视图 我需要加入从存储过程返回的表 存储过程会执行很多操作 例如在返回结果之前插入多个 temp 表 我尝试将存储过程转换为表值函数 但是插入 TVF 内的临时表会导致编译错误 我还有
  • 无法找到请求的.Net Framework 数据提供程序。 (Sql客户端)

    我正在尝试使用来自 SQL Server 2005 的 DB First 迁移来设置一个简单的 ASP NET MVC 4 Web 应用程序 我已经在数据库中创建了表 并使用实体框架在代码中创建了对象 我可以使用这些对象访问数据 当我尝试使
  • 如何确定给定的表是否是内存优化的?

    早上好 我的第一个问题是如何确定在 MS SQL Server 中创建的表是否是内存优化的 我有一些表 但我不记得我创建的其中一些表是否经过内存优化 非常感谢您的回答 为了重复这里的另一个答案 这是一种获取状态的方法all数据库中的表 se
  • SQL Server 与 Oracle DBMS_METADATA.GET_DDL 并行吗?

    我正在寻找命令行或脚本化解决方案来从 SQL Server 2005 中为所有数据库对象提取 DDL 表 存储过程 视图 索引 索引 约束等 GUI 工具不感兴趣 优先选择内置工具 因为它最能与 Oracle 的 DBMS METADATA
  • 使用实用程序批量复制将所有表从 SQL Server 数据库导出到文件中

    我想将数据库中的所有表 bcp 到文件中 SELECT EXEC xp cmdshell bcp bcp QUOTENAME DB NAME database name QUOTENAME SCHEMA NAME SCHEMA ID sch
  • 实体框架死锁问题

    我在使用 NET 4 的新实体框架时遇到了一个奇怪的问题 我有一个 SQL Server 2005 EXPRESS 数据库 我的服务使用实体框架将数据写入两个表 假设表是 TableA 和 TableB TableB 具有 TableA 的
  • PHP 和 MySql 检查表是否为空

    我有点菜鸟 而且我很难过 我需要一些代码来搜索数据库表以查找与 id 变量匹配的行 我需要抓取该表 描述 中的一个字段 如果它为空 我需要显示一条消息 如果不是另一条消息 这是我的代码 我知道我需要添加 mysqli 转义字符串 只需从内存
  • SQL Server中根据条件进行计数

    有谁知道如何在 SQL Server 中根据条件进行计数 Example 如何对表中名称为 system 的记录以及 CaseID 记录总数进行列计数 顾客表 UserID CaseID Name 1 100 alan 1 101 alan
  • 针对 SQL Server 的 SQL 查询的执行日期时间

    我曾经发现过这个很好的查询here https dba stackexchange com a 135080 43889 我想将查询的执行时间添加到以下查询中 USE master go SELECT sdest DatabaseName
  • 对于 XML 路径:如何将属性和值保留在同一节点中

    我在使用时遇到一些问题FOR XML PATH 我的情况是 我运行了如下脚本 属性CCY和价值AMOUNT合并到同一个节点 脚本1 SELECT USD AS Amount Ccy 123000 AS Amount Foo AS Foo F
  • 如何在 laravel 中查询 json 列?

    我用的是 Laravel 5 6 我有一块田地 字段的数据类型为json 字段 desc 字段 的值如下所示 code 1 club CHE country ENGLAND code 2 club BAY country GERMANY c
  • 在 Bluemix 中激活 PHP 扩展

    这纯粹是 Bluemix 问题 我的代码在本地主机上顺利运行 但是当我将其迁移到 Bluemix 时 我的数据库连接失败了 检查日志 我发现问题 调用未定义的函数 mysqli init HTTP 响应 500 我发现扩展已被禁用以使其更小
  • Laravel Eloquent with()-> 返回 null

    我正在尝试使用 Eloquent 来获取具有以下功能的特定产品 brand id映射到a的列brands表 该brand数组返回空 这里有什么明显需要改变的地方吗 product Product with images gt with br
  • Oracle DB & SQL Developer:“错误报告:执行已完成,但有警告” - 如何*查看*该警告?

    我正在设置一个本地 Oracle 11g 数据库 我们已经运行的另一个数据库的克隆 我正在 SQL Developer 中运行一堆生成的 PL SQL 命令 我得到输出 Error starting at line x in command
  • 使用递归 CTE 遍历父/子树?

    我被 cte 困住了 我想要一个查询 其中第一个父级为空 上一个父级的子级将成为下一个父级的父级 依此类推 WITH RESULT PARENT CHILD TNAME LEVEL AS anchor SELECT E PARENT GEN
  • SQL 选择另一列中具有最大值的列

    我有一个看起来像这样的表 Name Group Value A 1 0 B 1 2 C 1 5 D 2 6 E 2 0 F 3 3 我想选择每组中具有最大值的名称 例如 有 3 个组 因此结果将是 Name C because it has
  • 每组最大 n 个 SQL 查询的高性能方法

    我正在尝试构建一个基础设施 以便根据需要快速运行回归 从包含我们网络服务器上所有历史活动的数据库中提取 apache 请求 为了通过确保我们仍然回归来自较小客户的请求来提高覆盖范围 我想通过为每个客户检索最多 n 个 为了这个问题 假设 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 前两个与空检查大致相同 但最后一个是什么 当提供单个对象引用时 返回值不会 不等于该对象引用的哈希码 这是为什么 我的
  • 避免嵌套查询

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