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
    • 最新
    • 标签
主页 / dba / 问题 / 482
Accepted
BradC
BradC
Asked: 2011-01-11 12:48:48 +0800 CST2011-01-11 12:48:48 +0800 CST 2011-01-11 12:48:48 +0800 CST

我怎么知道为什么在某个表上插入很慢?

  • 772

我知道 SQL 表上的 INSERT 可能由于多种原因而变慢:

  • 表上存在 INSERT TRIGGER
  • 许多必须检查的强制约束(通常是外键)
  • 当在表中间插入一行时,聚集索引中的页面拆分
  • 更新所有相关的非聚集索引
  • 阻止桌子上的其他活动
  • IO写响应时间差
  • ...我错过了什么?

在我的具体情况下,我如何判断哪个负责?如何衡量页面拆分与非聚集索引更新与其他所有内容的影响?

我有一个存储过程,一次插入大约 10,000 行(来自临时表),每 10k 行大约需要 90 秒。这是不可接受的慢,因为它会导致其他 spid 超时。

我查看了执行计划,看到了 INSERT CLUSTERED INDEX 任务和 FK 查找中的所有 INDEX SEEKS,但它仍然不能确定为什么需要这么长时间。没有触发器,但该表确实有一些 FKey(似乎已正确索引)。

这是一个 SQL 2000 数据库。

sql-server insert
  • 5 5 个回答
  • 68893 Views

5 个回答

  • Voted
  1. Best Answer
    mrdenny
    2011-01-11T12:56:35+08:002011-01-11T12:56:35+08:00

    有些东西你可以看看...

    将批量大小从 10000 减小到更小的值,例如 2000 或 1000(你没有说你的行大小有多大)。

    尝试打开 IO Stats 以查看 FK 查找占用了多少 IO。

    插入时发生的等待是什么(master.dbo.sysprocesses)?

    让我们从这里开始,看看我们要去哪里。

    • 11
  2. SQLRockstar
    2011-01-11T14:02:57+08:002011-01-11T14:02:57+08:00

    布拉德,

    您应该检查查询的等待统计信息。使用 SQL2000,您可以使用 DBCC SQLPERF("waitstats") 语法来获取这些详细信息。

    • 7
  3. yrushka
    2011-01-29T01:13:06+08:002011-01-29T01:13:06+08:00

    在分析查询的性能时,我可以说出我在寻找什么。也许它有帮助。

    • 分析查询执行计划并检查索引扫描、表扫描、sql 数据类型的 convert_implicit 函数的使用、并行性。
    • 使用 SET STATISTICS IO ON 和 SET STATISTICS TIME ON 运行查询以查看每个插入的执行时间和读/写 io。
    • 从 sysprocesses 中检查您的会话 spid 的等待时间。
    • 运行探查器并选择标准模板。选择以下:性能统计(如果重复,那么你的计划被编译了很多次 - 不好),RPC:已完成,SQL:batchcompleted 和 SQL:batchstarting。向它们添加列行数以准确查看批处理中的行数。过滤结果以仅查看您的查询。
    • 最后从 windows perfmon 收集页面预期寿命 计数器,如果它低于 300(5 分钟),则 SQL 内存不足。还要收集磁盘计数器:磁盘队列长度、磁盘时间(您的数据文件驱动器)、磁盘时间(您的日志文件驱动器),以查看磁盘是否有压力。
    • 6
  4. Andrew Bickerton
    2011-01-28T15:43:22+08:002011-01-28T15:43:22+08:00

    尝试使用:

    SET STATISTICS IO ON
    

    和

    SET STATISTICS PROFILE ON
    

    统计 IO

    有助于告诉您哪些表正在执行最多的表扫描、逻辑读取和物理读取(我使用这三个来关注查询计划的哪个部分最需要调整)

    统计资料

    将主要以表格格式返回查询计划,然后您可以查看 IO 和 CPU 列,了解查询中花费最多的内容(是临时表上的表扫描还是插入到您的集群键等...)

    • 5
  5. MShNajar
    2022-09-19T05:03:28+08:002022-09-19T05:03:28+08:00

    建议:

    1. 在活动监视器中查看查询中可能的锁定
    2. 查看您查询的执行计划和 IO 统计信息
    3. 索引和约束(特别是对于非聚集索引或 FK 等许多索引)可能会影响插入性能。
    4. 保留但重建所需的索引。
    5. 一次插入一行确实是一种不好的做法,会对性能产生负面影响,特别是在 SQL Server 等 ACID DB 上。批量插入!
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

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

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +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