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

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

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

  • 为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案?

    我想要实现的目标类似于棋盘游戏 有一个100 100的网格 放在一个Item它驻留在一个Flickable 游戏板 的各个矩形都是 svg 图像 目前大约有 20 种 可能会增加到数百种 作为基准测试 我只是尝试用元素填充 世界 Compo
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • SQLite中的ROWID是自动设置的吗?

    所以 我在 Ionic 上有这个应用程序 它使用SQLite ngCordova 插件 https github com litehelpers Cordova sqlite storage用于内部存储 在其上 我使用以下命令创建一个表 d
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • 什么是时序数据库?

    What is 时间序列数据库例如InfluxDB 我应该何时 何地使用它 请给我它的业务场景示例 检查wiki https en wikipedia org wiki Time series database 时间序列数据库 TSDB 是
  • 通知设置的数据库设计

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

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 在 C# 中读取/写入大型 XML 文件

    我正在开发一个带有 XML 数据库的应用程序 我有很大的 XML 文件 我必须在其中读取和写入数据 问题是我不想将整个 XML 文件加载到内存中 也不想因为性能问题而循环遍历整个文件 因为如果我将整个文件加载到内存中 这将影响应用程序性能
  • 在 sqlplus 中执行 plsql 时将错误消息重定向到日志文件

    在 sqlplus 中执行 PL SQL 程序时 需要一种将 PL SQL 程序错误消息重定向到日志文件的方法 假设 PL SQL 程序名为send 2012 sql它有以下异常块 EXCEPTION WHEN NO DATA FOUND
  • JDBC 和多线程

    我正在尝试使用多线程方法运行一些查询 但是我认为我做错了什么 因为我的程序需要大约五分钟来运行一个简单的选择语句 例如 SELECT FROM TABLE WHERE ID 123 我的实现如下 我使用一个连接对象 在我的运行方法中 pub
  • Pandas apply 与 np.vectorize 从现有列创建新列的性能

    我正在使用 Pandas 数据框 并希望创建一个新列作为现有列的函数 我还没有看到关于之间速度差异的很好的讨论df apply and np vectorize 所以我想我会在这里问 熊猫apply 功能很慢 根据我的测量 在一些实验中如下
  • Oracle 中仅在一列上不同

    我想在下表中使用不同的值 但仅在 PlayerID 列上使用 这就是我现在所拥有的 MATCHID PLAYERID TEAMID MATCHDATE STARTDATE 20 5 2 14 JAN 12 01 JUN 11 20 5 4
  • Java 的 System.arraycopy() 对于小数组有效吗?

    是Java的System arraycopy 对于小数组来说是高效的 或者它是本机方法这一事实是否使其可能比简单的循环和函数调用效率低得多 本机方法是否会因跨越某种 Java 系统桥梁而产生额外的性能开销 稍微扩展一下 Sid 所写的内容
  • GWT 在开发模式下运行缓慢

    我在开发模式下使用最新的 GWT 2 0 版本的 Eclipse Galileo 但它运行速度非常慢 我需要等待大约一分钟才能打开一个页面 但编译后 当我使用 Tomcat 5 5 运行它时 我的应用程序运行得很好 我的代码不太重 我猜有一
  • 为 WPF DataGrid 行一一着色

    我正在制作一个 WPF 程序 它能够为 a 中的行着色DataGrid一个接一个地使用红色for循环 我遇到了一些奇怪的事情 如果DataGrid数据库表中有 40 多行数据 它不会对所有行进行着色 这是我正在使用的代码 private v
  • cmd 和 workbench mysql 查询性能差异

    我有两个问题 正如我的标题 哪一个对于对大量数据运行大型查询更有效 我查看了 MySQL 文档 其中解释了工作台的性能https www mysql com products workbench performance https www
  • 超集:未找到命令

    我已经使用安装了超集pip install superset命令 然后我尝试超级集数据库升级但它说superset command not found 有人能帮我一下吗 仅供参考 现在 PyPI 包是apache superset so p

随机推荐

  • 拉取请求的 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 查询而冻结 我想以某种方式优化这个查询 该查询由不同表的许多联接组成 我的问题是 使用左连接对性能更好 还是将所