AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-563

Coding Gorilla's questions

Martin Hope
Coding Gorilla
Asked: 2018-04-27 11:18:45 +0800 CST

删除查询在 Azure SQL 数据库中使用 100% CPU

  • 1

我有一个相对较小的数据库,可能有几十万行,我们有一个存储过程,旨在清除“经销商”(应用程序聚合根)及其所有相关数据。该数据库位于 v12 Azure SQL 实例上,当它访问一个特定的表时,它会消耗该实例 100% 的 DTU/CPU,并且需要很长时间才能完成。

我认为问题在于该表有大量外键,可能大约 30 个。查看执行计划,您可以看到它正在执行大量Nested Loop索引扫描以查找相关行。在尝试从该特定表中删除行之前,所有这些行都已被删除,因此这些循环实际上毫无意义。

我的问题是,禁用这些依赖表上的外键约束,删除,然后重新启用约束会更有效吗?这样做会不会产生一些负面影响,除了在技术上可能会在禁用约束时插入一些坏数据这一事实。还是有更好的方法来完成我想要完成的事情?

更新 这是一个 v12 Azure SQL 数据库,它不是 VM 中完整的 SQL Server 2012。我没有批量删除任何删除,有问题的语句是更大的 SPROC 的一部分。我通过撕开存储过程并分别运行它的零碎部分来识别这个特定的表删除。当它到达这张桌子时,实际上需要 15 分钟才能完成。它将影响数百行的顺序,具体取决于我们正在清除的特定“经销商”的状态。

在这种情况下我们不能进行软删除,因为通常我们会清除这个经销商以便可以替换它(软删除会导致重复并且需要大量代码来解决)。我调查了其他类型的阻塞和等待状态,没有发现其他似乎对此产生负面影响的东西。正如我提到的,这个数据库相对较小,主要用于非常简单的 CRUD 操作。

这是执行计划,非常庞大。 从化学品执行计划中删除

执行计划的 XML 版本可以在这里找到:https ://gist.github.com/CodingGorilla/6cf7a87df9257d5f93e0d545af9839c2

azure-sql-database azure
  • 2 个回答
  • 2857 Views
Martin Hope
Coding Gorilla
Asked: 2011-01-20 09:30:55 +0800 CST

在 Oracle 中删除非常大的记录集的最佳方法

  • 19

我管理一个应用程序,它有一个非常大的(近 1TB 的数据,一个表中有超过 5 亿行)Oracle 数据库后端。数据库并没有真正做任何事情(没有 SProcs,没有触发器或任何东西),它只是一个数据存储。

每个月我们都需要从两个主表中清除记录。清除的标准各不相同,是行龄和几个状态字段的组合。我们通常最终每月清除 10 到 5000 万行(我们每周通过导入增加大约 3-5 百万行)。

目前我们必须分批删除大约 50,000 行(即删除 50000、提交、删除 50000、提交、重复)。尝试一次全部删除整个批次会使数据库在大约一个小时内无响应(取决于行数)。像这样批量删除行在系统上非常粗糙,我们通常必须在一周内“在时间允许的情况下”执行此操作;允许脚本连续运行会导致用户无法接受的性能下降。

我相信这种批量删除也会降低索引性能,并有其他影响最终导致数据库性能下降。一张表就有34个索引,索引数据量其实比数据本身还大。

这是我们的一位 IT 人员用来执行此清除的脚本:

BEGIN
LOOP

delete FROM tbl_raw 
  where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000;

  exit when SQL%rowcount < 49999;

  commit;

END LOOP;

commit;

END;

这个数据库必须达到 99.99999%,而且我们每年只有 2 天的维护窗口。

我正在寻找一种更好的方法来删除这些记录,但我还没有找到任何方法。有什么建议么?

oracle oracle-11g
  • 6 个回答
  • 80788 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve