哪个更好/更快:连接许多表或选择一张大表

2024-03-27

我们正在使用 Oracle 11,这是我们用 Java 编写的应用程序。每天一次,通常是下午,我们的数据库由于许多大的 SQL 查询而冻结。我想以某种方式优化这个查询。该查询由不同表的许多联接组成。我的问题是:使用左连接对性能更好,还是将所有信息放在一张表中并使用一个选择更好?假设我要为这个表建立一个好的索引。

仅供参考:平均而言,一次查询可获取 100 MB 的数据。而且这个查询有时会互相锁定

Update

连接8个表的表,它们是具有3-5列的普通表,其中一列是一些ID。 SQL 查询如下:

SELECT t1.c1,t2.c5, t6.c2, ... FROM t1
LEFT JOIN t2 ON t1.c1 = t2.c1
LEFT JOIN t3 ON t3.c1 = t2.c2
LEFT JOIN t4 ON t4.c1 = t2.c1
LEFT JOIN t5 ON t5.c5 = t1.c1
LEFT JOIN t6 ON t6.c1 = t2.c1
LEFT JOIN t7 ON t7.c3 = t3.c1
LEFT JOIN t8 ON t8.c1 = t2.c1
WHERE something

我的问题是,创建一个包含所有连接表的新表并使用如下查询是否更好:

SELECT c1,c5, c2, ... FROM SOME_NEW_TABLE

Update 2

Here is report http://paste.ubuntu.com/6483413/,如果有人能概括性地解释一下,那就太好了。


我认为这个问题可以大致回答。在调整此类查询的性能时,您需要考虑许多事项:

解析时间

建立该语句的执行计划需要多长时间?如果查询第一次运行缓慢,而之后每次运行都很快,则解析时间就是一个问题。我假设查询中没有变化的常量。如果没有,请使用绑定变量或作为最后的手段使用动态绑定变量,但自动引入绑定变量可能是一个坏主意,请参阅“alter session setcursor_sharing=similar”。

特别是对于旧版本和许多连接(Oracle 8 在解析具有超过 6 个相似标识连接的语句时确实很糟糕......)解析时间可能会很昂贵。 Oracle 11 通常会在考虑多个执行计划后停止,从而缩短解析时间。在 Oracle 11 上,解析时间仍然可能是一个问题,特别是对于 union/union all。

此外,在此查询中您使用 ANSI 样式连接。请注意,当使用更优雅的 ANSI 样式与复杂语句连接时,Oracle 11 存在一些性能缺陷。因此对于自动生成的语句我推荐Oracle风格(c(+)=d),对于需要维护的语句你需要研究它是否真的是一个问题。

当解析时间是一个问题时,我建议使用 /*+ordered*/ 这样的提示作为起点。这样可以确保您的连接顺序使得临时生成的数据量尽可能少,并且存在正确的索引。

执行时间处理时间

在执行过程中,Oracle执行执行计划。与其他数据库平台相比,Oracle 在这方面确实非常高效。但如果执行计划很糟糕,那么执行就需要时间。在您的问题中,您讨论是否要预先加入所有内容。

一般来说,最好总是从完全标准化的模型开始。在完全标准化的模型中,数据仅存储一次。因此,当有效规划查询时,处理的数据量最少。这假设 Oracle 服务器有足够的内存来缓存全部或大部分数据,因为连接策略有时需要内存中的大量工作空间以及已经从磁盘获取的数据。

当性能不足时,我会首先引入提示,但保留标准化模型。始终尝试使中间步骤期间适合输出的数据量尽可能小。当它确实不起作用时,您可能会使用派生表,但我发现这通常是开发技能薄弱的标志。

在这一切中,我假设启动执行计划的表之一具有较大的数据量,而另一个表较小,可能小一点或小很多。如果没有,您正在运行“Wiebertje”查询(我没有它的另一个名称,它是荷兰糖果的形状)。那么请阅读第 9 页及后续内容2006年会议演讲 http://www.invantive.com/nl/doc/effective-performance-tuning-oracle-applications.pdf

获取时间

在周期结束时,Oracle 在某个时刻开始发回数据。特别是体积可能会大大增加传输全部内容所需的时间。应用程序获取所有内容但仅显示前 50 行的情况并不少见。请引入窗口或“获取显示的水印+常量”以减少获取时间。您可能需要在语句或会话中引入诸如 /*+first_rows */ 之类的提示以供交互使用。

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

哪个更好/更快:连接许多表或选择一张大表 的相关文章

  • 通过存储过程将记录传输到目标表后,从源表中删除记录

    这是我在 user75ponic 的帮助下生成的存储过程 CREATE OR REPLACE PROCEDURE ARCHIVE DATA AS BEGIN MERGE INTO Schema2 table trg USING SELECT
  • 当所有子记录满足条件时仅选择父记录

    我有两个表 A 和 B 当所有子项 表 B 中 满足条件时 我只需要父项 A 的行 如果 B 中的一行不符合条件 那么我不需要父 A 的行 我想我需要在这里使用存在 但不展示如何使用 以下是数据表 Table A Primary Key L
  • Oracle 日期索引很慢。没有它查询速度快 300 倍

    我有一个 Oracle 查询 如下所示 运行时间为 10 分钟或更长时间 select r range text as duration range nvl count c call duration 0 as calls nvl SUM
  • 如何将 MNIST 图像下载为 PNG

    我想将 MNIST 图像作为 PNG 文件下载到我的计算机上 我找到了这个页面 http yann lecun com exdb mnist http yann lecun com exdb mnist 我按下后 train images
  • Linq:Entity Framework Core 中的 Join 与 Include/ThenInlude

    我正在开发一个使用 SQL Server 和 EF Core v3 的项目 我有 4 个彼此相关的表 这是我的表格方案 我针对这些表编写了 2 个 Linq 查询 其中一个使用像这样的连接 var result from emailTemp
  • 为 Microsoft SQL Server 创建统计信息时,列顺序重要吗?

    数据库引擎优化顾问建议为我们的几个查询创建一些统计信息 事实证明 其中一些是相同的 只是 CREATE STATISTICS 命令中的列顺序不同 例如 CREATE STATISTICS StatName1 ON dbo table1 co
  • 将我的数据库类与项目中的其他类一起使用

    我有一个自己编写的自定义数据库类 还有一个用户类和一个站点类 MySQL 类有这样的方法 connect query clean fetch 用户等级 register login logout resetPass 站点类别 updateT
  • 在列名中使用保留字

    这是一些简单的代码 但我只是不知道为什么我不能使用这个词作为表的实体 CREATE TABLE IF NOT EXISTS users key INT PRIMARY KEY NOT NULL AUTO INCREMENT username
  • 提升 ggplot2 性能

    The ggplot2软件包无疑是我使用过的最好的绘图系统 只是对于较大的数据集 约 50k 点 来说性能并不是很好 我正在考虑通过 Shiny 提供网络分析 使用ggplot2作为绘图后端 但我对其性能并不满意 尤其是与基础图形相比 我的
  • 如何使用循环将值添加到 VARRAY

    我有一个 VARRAY 我想通过使用循环向该 VARRAY 添加元素 这是我到目前为止所尝试过的 DECLARE TYPE code array IS VARRAY 26 OF VARCHAR2 6 codes code array BEG
  • CommandBehavior.SequentialAccess 是否有任何性能提升?

    我意识到我总是按照索引返回的顺序读取字段 使用常量 所以据我所知 我的代码已经与 CommandBehavior SequentialAccess 兼容 如果我打开它会有什么好处吗 DataReader 已经是只向前 只读 这才是真正的性能
  • 帮助加入 Rails 3

    我有以下型号 class Event lt ActiveRecord Base has many action items end class ActionItem lt ActiveRecord Base belongs to event
  • 如何在“Where”子句之前写“Order By”子句

    我想写一个ORDER BY我之前的子句WHERE条件 因为我需要将结果截断为 10 但我需要首先按字母顺序对它们进行排序 我知道你不能把ORDER BY before WHERE那我该怎么办呢 我需要做类似以下的事情 SELECT FROM
  • 小数点分隔符 oracle

    我需要用点替换逗号 然后我需要我的值是一个数字 所以我写了这个 select replace 12345 6789 from dual it works fine 但后来我想转换to number该值 我收到错误 invalid numbe
  • 如何对 numpy 数组进行采样并有效地对每个样本执行计算?

    假设我有一个一维数组 我想要的是使用移动窗口进行采样 并在窗口内将每个元素除以第一个元素 例如 如果我有 2 5 8 9 6 窗口大小为 3 结果将是 1 2 5 4 1 1 6 1 8 1 1 125 0 75 我现在所做的基本上是一个f
  • 在 SQL Server 中以编程方式创建数据库

    如何以编程方式创建数据库以及执行此操作所需的最少信息是什么 Please没有 SQL Server 管理对象 API 建议 您可以使用SQL Server 管理对象 API http msdn microsoft com en us lib
  • oracle中的数字格式

    Hai 我的数字格式有问题 我正在使用 oracle 我在数据库中有一个数字字段 但是当我检索它时 我需要将其视为浮点数 例如 在检索时 现在我得到的结果为 200 DR 借方的 DR 手动给出 现在我需要得到 200 00 DR 的结果
  • 如何将 SELECT...INTO 与 JOIN 一起使用?

    我有以下示例代码 DECLARE myRow table rowtype myVar table2 column type BEGIN SELECT table col1 table col3 table col4 table2 colum
  • Python 3 urllib 与请求性能

    我正在使用 python 3 5 并且正在检查 urllib 模块与 requests 模块的性能 我用 python 编写了两个客户端 第一个使用 urllib 模块 第二个使用 request 模块 它们都生成二进制数据 我将其发送到基
  • Codeigniter - 仅当数据库中不存在电子邮件时才更新电子邮件

    我为我的用户提供了一个更新页面 他们可以在其中编辑他们的姓名 电子邮件和其他信息 到目前为止 他们可以编辑一切 包括他们的电子邮件 他们可以毫无问题地输入数据库中已存在的电子邮件 我尝试添加此表单验证规则 this gt form vali

随机推荐

  • 拉取请求的 Bitbucket 构建状态显示失败的构建,而不是最新的构建状态

    我将 Bitbucket 与 Cloudbees 集成 具有以下工作流程 每次用户创建 Pull 请求时 都将其作为目标develop分支 cloudbees 中的多分支管道将聚集拉取请求 例如 PR 34 并将触发第一个构建 1 如果通过
  • 颜色条上的日志标签

    我有一个对数 imshow 图 当创建颜色条时 它的轴标签和刻度是对数的 但由于值的范围较短 0 50 颜色条看起来像这样 我希望它显示为沿轴间隔的 0 5 10 20 50 对数间距 Use the LogFormatter https
  • 在 Bash 中打开默认文本编辑器?

    我在编写 shell 脚本时遇到了一个问题 有没有办法使用用户指定的文本编辑器打开文件 用户选择的编辑器应该位于 EDITOR 但您仍必须选择合理的默认值 EDITOR vi file txt
  • 向该对象的每一面添加不同的颜色

    我为我的应用程序重新创建了一个包模型 并将其作为 obj 导出到 ThreeJs 中 我为模型几何中发现的每个面分配了不同的颜色 如下所示 var geometry new THREE Geometry fromBufferGeometry
  • 为什么以下两个重复查找算法的时间复杂度不同?

    我正在读这个question https stackoverflow com questions 3951547 java array finding duplicates 所选答案包含以下两种算法 我不明白为什么第一个的时间复杂度是O l
  • C++ - 从类外部更改私有成员

    这段代码会导致未定义的行为吗 或者我可以遇到这个问题吗 复制没有函数的完整类 只是带有公共修饰符的变量并修改私有成员抛出此指针 例子 include
  • Laravel 5.6 API 资源集合 - 未获取条件关系

    我正在体验我的第一个 Laravel 项目 我实现了一个资源收集 API 通过护照获取数据 除了关系之外 数据似乎可以从模型中正确检索 情况是这样的 item php 模型
  • Visual Studio w/Docker 已退出,代码为 4294967295 (0xffffffff)

    在我们新公司的笔记本电脑上 我们在 Visual Studio 的 docker 桌面中运行容器时遇到了问题 我们尝试了很多事情但都不成功 任何帮助 想法都会很棒 因为我们已经没有想法了 Net Core 版本 6 Asp net Core
  • MediaRecorder 忽略 VideoFrame.timestamp

    我想生成一个视频 我在用MediaRecorder记录由MediaStreamTrackGenerator 生成每一帧需要一些时间 比如说 1 秒 我想在以下位置生成视频10 fps 因此 当我创建框架时 我使用timestamp and
  • 如何优化双重解引用?

    非常具体的优化任务 我有3个数组 const char 输入磁带 const int inputOffset 以四个为一组 char 输出磁带输出 我必须根据以下 5 个操作从输入组装输出磁带 int selectorOffset inpu
  • 使用 Eloquent 查找或创建

    我最近开始与Laravel http laravel com and Eloquent http laravel com docs eloquent 并且想知道是否缺少模型的查找或创建选项 你总是可以写 例如 user User find
  • 如何使用包含空格的键从Redis获取值?

    使用 telnet 我输入这样的命令行命令 get field with spaces get field with spaces get field with spaces 这三个都返回相同的错误 ERR wrong number of
  • 在 jstree 中包裹叶子文本

    我正在使用 jstree 插件根据 xml 文件填充我的树 某些节点文本大于容器 div 有什么方法可以对 jstree 节点文本进行文本换行吗 document ready function tree jstree xml data aj
  • 如何使用 Vue 而不是 Jinja 进行渲染

  • 使用 Ninject IOC 替换工厂

    我在解析器中有一个工厂方法 本质上 当我加载令牌时 我会查找该令牌的处理程序 或者直接转到默认处理程序 我已经将其实现为switch并作为Dictionary
  • 使用Source Tree,rebase有冲突,冲突解决后rebase不起作用

    我在用着源树 http www sourcetreeapp com 作为我在 Windows 上的 git 工具 我有一个main分支和一个feature分支 当我有冲突时 我无法让 SourceTree 执行变基 main好像 c1 gt
  • 从 NetLogo 中的有界正态分布中选择值

    我正在尝试让 Ne tLogo 按照 stackoverflow 中上一个问题中的建议从有界随机正态分布中绘制值 NetLogo 如何确保变量保持在定义的范围内 https stackoverflow com questions 20230
  • Swift根据数据改变tableviewcell边框颜色

    我已经编写了一个代码 用于根据 inStock 或 outStock 更改单元格边框颜色 如果是 inStock 它将是红色边框 否则它将是绿色 但我它对我不起作用 我将它放在 willDisplayCell 中 这里是我的代码 func
  • MySQL 到 PostgreSQL 表创建转换 - 字符集和排序规则

    我想从 MySQL 迁移到 PostgreSQL 我的创建表查询是这样的 CREATE TABLE IF NOT EXISTS conftype CType char 1 NOT NULL RegEx varchar 300 default
  • 哪个更好/更快:连接许多表或选择一张大表

    我们正在使用 Oracle 11 这是我们用 Java 编写的应用程序 每天一次 通常是下午 我们的数据库由于许多大的 SQL 查询而冻结 我想以某种方式优化这个查询 该查询由不同表的许多联接组成 我的问题是 使用左连接对性能更好 还是将所