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 / 问题 / 303351
Accepted
Arian
Arian
Asked: 2021-12-02 08:18:07 +0800 CST2021-12-02 08:18:07 +0800 CST 2021-12-02 08:18:07 +0800 CST

缓慢运行始终快速运行的查询

  • 772

我有两张表,99% 的操作都是简单的选择。我们很少有插入/删除和更新。

这些表上有一个内部连接,查询的执行计划是index seek。99% 的查询运行速度非常快(大约 1 秒)。但有时查询需要 30 秒才能运行。

这件事发生的时间没有任何规律。有一次发生在“12 月 1 日凌晨 3:17:20”。一次在“12 月 8 日晚上 10:13:43”。有一次发生在“12 月 11 日下午 16:50:43”。

我怎样才能找到这个问题来自哪里的线索?

SQL Server 是否有记录所有事件的工具?

我的查询只有简单的 where 子句:where id = @id。

sql-server sql-server-2014
  • 3 3 个回答
  • 184 Views

3 个回答

  • Voted
  1. Best Answer
    Joe Obbish
    2021-12-02T11:09:44+08:002021-12-02T11:09:44+08:00

    SQL Server 2014 没有为您提供很多选项来调查过去运行的查询的性能不佳。您可以尝试检查错误日志以查看在您的慢查询执行附近是否发生了任何灾难性事件。例如,可能有一个耗时超过 15 秒的长 I/O。您还可以检查系统健康扩展事件。例如,可能在您的慢查询执行附近发生了长时间的锁定等待(>30 秒)。

    听起来您真正需要的是增加应用程序日志记录(您已经知道错误发生的精确秒数,因此请考虑在查询运行时间超过预期时记录性能信息),购买 SentryOne 等 SQL Server 监控工具,或升级到 SQL Server 2017 并查看查询存储等待统计信息。您应该知道,即使使用其中许多工具,调查一年前发生的性能问题也会很困难。

    • 7
  2. Thomas Franz
    2021-12-04T06:21:00+08:002021-12-04T06:21:00+08:00

    如果它真的只是一个简单的SELECT ... FROM tbl where tbl.id = @id(没有连接等)我会假设,这是一个阻塞问题。这通常是由于应用程序编写不当造成的:

    • 用户尝试保存例如订单
    • 应用程序启动begin transaction
    • 应用程序将行插入订单表
    • 应用程序发现必须由用户确认的内容(例如不合理的交货日期)
    • 应用程序打开一个对话框询问用户,如果这真的正确
    • 用户确认并且应用程序执行COMMIT或他拒绝并且应用程序执行ROLLBACK

    通常用户快速点击按钮,一切都很好。但有时他去吃午饭或接电话或其他什么,有时甚至应用程序前端/浏览器崩溃,所以你现在对这一行有很长的锁定。当用户自己或其他人现在想要选择相同的ID时,他必须等待......

    • 1
  3. Brendan McCaffrey
    2021-12-06T18:42:13+08:002021-12-06T18:42:13+08:00

    Erik Darling 的上述答案可能就是您正在寻找的。所以在这里我不会过多的介绍。

    你知道查询每次都使用相同的执行计划吗?我已经多次看到应用程序使用动态 SQL 污染计划缓存。95% 的时间使用的参数返回少数行。典型的计划通常是索引查找。然后在另外 5% 的时间里,参数匹配更多的行并且 SQL 进行索引扫描。

    • 1

相关问题

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

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

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

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

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

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