当前位置: 首页 > 面试题库 >

如何优化在具有700M行的Oracle表上运行的更新SQL

锺离飞尘
2023-03-14
问题内容
UPDATE [TABLE] SET [FIELD]=0 WHERE [FIELD] IS NULL

[TABLE]是具有超过7亿行的Oracle数据库表。运行6个小时后,我取消了SQL执行。

是否有任何SQL提示可以提高性能?或任何其他解决方案来加快速度?

编辑: 此查询将运行一次,然后再也不会运行。


问题答案:

首先,它是一次性查询还是循环查询?如果只需要执行一次,则可能要考虑以并行模式运行查询。无论如何,您都将不得不扫描所有行,您可以使用ROWID(自己动手做并行性)范围自己划分工作负载,也可以使用Oracle内置功能

假设您要经常运行它并希望优化此查询,则field列为NULL的行数最终将比总行数少。在这种情况下,索引可以加快处理速度。Oracle不会将所有索引列都为NULL的行编制索引,因此field查询不会使用on的索引(因为您要查找所有field为NULL的行)。

任何一个:

  • 在上创建索引(FIELD, 0),该索引0将用作非NULL伪列,并且所有行都将在表上建立索引。
  • 在上创建基于函数的索引(CASE WHEN field IS NULL THEN 1 END),这只会索引为NULL的行(因此索引将非常紧凑)。在这种情况下,您将不得不重写查询:

UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1

编辑:

由于这是一次性方案,因此您可能需要使用PARALLEL提示:

SQL> EXPLAIN PLAN FOR
  2  UPDATE /*+ PARALLEL(test_table 4)*/ test_table
  3     SET field=0
  4   WHERE field IS NULL;

Explained

SQL> select * from table( dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4026746538
--------------------------------------------------------------------------------
| Id  | Operation             | Name       | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT      |            | 22793 |   289K|    12   (9)| 00:00:
|   1 |  UPDATE               | TEST_TABLE |       |       |            |
|   2 |   PX COORDINATOR      |            |       |       |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000   | 22793 |   289K|    12   (9)| 00:00:
|   4 |     PX BLOCK ITERATOR |            | 22793 |   289K|    12   (9)| 00:00:
|*  5 |      TABLE ACCESS FULL| TEST_TABLE | 22793 |   289K|    12   (9)| 00:00:
--------------------------------------------------------------------------------


 类似资料:
  • 我试图让新的1.7 JDK与Eclipse(这是Oracle的官方版本)一起工作。 我并不是指仅仅将Eclipse指向它以便您可以在项目中使用它,这很好,而是实际上使用1.7JVM使Eclipse运行。 我已经将新的JVM移到了Java首选项列表的顶部,但是Eclipse仍然从1.6开始。如果在Java首选项中禁用1.6,双击Eclipse后会立即出现一个对话框,上面写着“创建Java虚拟机失败”

  • 问题内容: 我有一个在InnoDB引擎上运行的MySQL表,该表具有大约2,250,000行,其表结构如下: 第一列保存一个从0到2.25M的简单增量值,而&分别保存一个点的一组以十进制度表示的纬度和经度坐标。 这是一个只读表。不会添加其他行,并且唯一需要针对它运行的查询如下: …冒号后面的值是PHP PDO占位符。本质上,此查询的目标是获取表中当前位于Google Maps窗口视口中的所有坐标点

  • 问题内容: 我们在应用程序中有一些持久性数据,这些数据是从服务器查询然后存储在数据库中的,因此我们可以跟踪其他信息。因为我们不想查询何时在内存中使用对象,所以我们这样做是为了阻止其他想要获取相同数据的线程。 我不确定如何处理不存在的行。如果该行不存在,并且另一个线程尝试在同一行上执行另一个操作,那么该线程是否会被阻塞,直到另一个事务完成,或者它还会得到一个空结果集?如果它只得到一个空结果集,是否有

  • 我是spark新手,有一个简单的spark应用程序,使用spark SQL/hiveContext: 从hive表中选择数据(10亿行) 做一些过滤,聚合,包括row_number窗口函数来选择第一行,分组,计数()和最大()等。 将结果写入HBase(数亿行) 我提交的作业运行它在纱线集群(100个执行者),它很慢,当我在火花UI中查看DAG可视化时,似乎只有蜂巢表扫描任务并行运行,其余的步骤#

  • 本文向大家介绍如何进行大表优化?相关面试题,主要包含被问及如何进行大表优化?时的应答技巧和注意事项,需要的朋友参考一下 当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下: 1. 限定数据的范围 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内; 2. 读/写分离 经典的数据库拆分方案,主库负责写,从库

  • 我不熟悉JTable。 我想在button press事件中在运行时更新jtable数据。 这是我的密码。 但按下“更新”按钮后不会更新。 有人能解决我的问题吗? 提前谢谢。。