我正在使用 Brent Ozar 的 sp_BlitzCache 存储过程,并试图确定它报告的原因:
“您计划中的某些内容强制进行串行查询。如果这不是设计使然,则需要进一步调查。”
经过调查,我发现服务器配置已设置:
'Max Degree of Parallelism = 1'
(这是我正确配置的洗衣清单。这是无知的日子。)
这是设置布伦特报告强制序列化的原因吗?
对于 ETL 报告系统,15 分钟无数据拉取的总执行时间类似于 24 小时有数据拉取的总执行时间是否正常?
我曾预计没有数据时 ETL 的总时间会更短,但这不是 15 分钟到 24 小时拉动之间的情况。但我必须承认,我对报表服务器中 T 和 L 阶段的内部结构一无所知。
有人可以阐明 T 和 L 阶段的持续时间是否通常是固定的(直到某个点)?
我承认每个人的经验和能力都不同。话虽如此,我想避免通过行动为 DBA 设定过高(或过低)的期望;似乎是“管理员”。
鉴于:
我不是试图证明我自己的观点。我希望调整我或公司其他人的意见。
问题:
鉴于上述情况,是否应该期望 DBA 只是一个“管理员”?这是你经常看到的吗?
我进入这部肥皂剧(请参阅我最近的其他问题),期望 DBA 被“期望”深入研究。我开始相信我误解了,我倾向于成为一名 DBA——成为一名“管理员”。
我欢迎其他人的经验,也许是关于完善这个问题的建议。
OPTION (RECOMPILE)
用于生产?
这个选项似乎得到了很多坏消息。这是应得的吗?
我有一个 DBA,到目前为止,他不喜欢OPTION (RECOMPILE)
Report ETL ssis 代理查询这一想法。这些查询(据我所知)按计划的时间间隔按顺序执行。
返回历史:
等等,你确定 OPTION (RECOMPILE) 是答案吗?
我知道的风险:
因此,鉴于上述情况 - 这个选项实际上是否在现实世界中使用?我推荐(并测试)它作为生产环境的一个选项是否可以接受?
我被要求提供更多细节。我提到我确实有其他与该主题相关的帖子。让我提供更多信息:
serializable
休眠层内;我了解到,这对于大批量生产环境来说并不是最佳选择。让我分享其他问题:
我看到了经典的“在工作室管理器中运行速度快但在应用程序中运行缓慢”的问题。听起来可能是参数嗅探。但是,我在 ETL 和 SSIS 方面的经验为零。
从 DBA 我收到了以下查询,它以 ? 而不是一个参数。这是查询的混淆示例:
SELECT
tablex.x_id,
tablex.create_ts,
tablex.update_ts,
tablex.myStatus,
tablex.x_type,
tablex.ami_uploaded,
tablex.work_id,
tablex_capture_ts,
[column1],
[column2],
[column3],
[column4]
FROM sqltable..tablex
INNER JOIN
sqltable..tableWork ON tablex.work_id = tableWork.work_id
WHERE
(tablex.update_ts >= ?)
查询引擎推荐第二个包含多个包含列的 update_ts 索引。如果可能的话,我想避免这种情况,因为它会增加内存压力,而且我不相信它可以解决真正的问题。想法?
这似乎是查询统计信息出现偏差的情况,当查询引擎嗅探参数时,它会避免使用现有索引,因为估计的行数超出了阈值。
我的问题:
此外,这是我一直在努力解决的一个长期问题。所有这些帖子都与同一问题有关。多么奇妙的发现之旅:
SQL Server - 我可以手术删除一个糟糕的缓存查询计划还是我追求错误的想法?
任何意见是极大的赞赏。
这应该是本地存储过程版本的实际执行计划。此版本在 1 秒内返回,并表现出我希望 ETL 具有的行为:
https://www.brentozar.com/pastetheplan/?id=ry4wy6dBO
现在,这是 ETL 版本的屏幕截图,需要几分钟才能完成。抱歉,我无法提供有关此特定查询的更多详细信息:
这是一个小时内完成的分析器跟踪的屏幕截图。我认为这就是 ETL 命令的执行方式。我还不知道,为什么这些都有相同的时间。我还需要找到准备工作。看看那些 cpu、reads 和 duration 列!
鉴于:
更新 1
更新 2
问题:
根本问题是,在忙碌的一天中看似随机的时间,几个 SQL 查询超时,但是,出于这个问题的目的,我对屏幕抓取是否表明本身存在问题感兴趣。也许这是主观的,但我对这个值没有经验。
行动:
失败本身并没有直接指向具体问题,因此我目前正在收集证据并尽可能尝试消除过程。目前我正在调查是否过长的等待时间和查询的“完美风暴”会导致级联锁,从而导致查询超时。
收集到的证据:
问题:
还有哪些其他信息可以帮助确定锁定和等待时间是否可能是查询超时的原因?例如,我从 sql server studio manager 活动监视器获取了以下屏幕截图。这个价值让我感到惊讶。
我需要帮助理解我的选择。鉴于:
我建议我们的 DBA 切换到简单模式,因为我们在活动监视器中看到一堆处于等待状态的查询,最终导致应用程序服务器出错。
我以前从未遇到过这个问题,在消除过程中我看到我们处于完全恢复模式而不是简单模式。
我要求我们从 FULL 切换到 SIMPLE,这就是我得到的答复。是否有其他选择可能是 DBA 不知道的?
我能提供什么帮助?
“我们无法在 SQL 中使用 AlwaysOn 切换到简单模式。”
我可以在初始加载阶段关闭 AlwaysOn 还是我不走运?
让我设置舞台:
问题:
WITH (INDEX(update_ts_INDEX))
- 使用索引。查询时间从 2 分钟缩短到不到 1 秒。假设:
笔记:
查询示例:
DECLARE @P1 DATETIME = GETDATE() - .1;
SELECT value_1, update_ts, value_2 FROM PRODUCTION_TABLE
WHERE (PRODUCTION_TABLE.update_ts > @P1);
如果我删除变量并手动编码日期,它将使用索引。
问题: 我可以通过外科手术删除此特定查询的错误缓存查询计划吗?
- - 更新 - -
UsingOPTION (RECOMPILE)
导致查询引擎选择正确的索引。
给定以下 SQL,“ONLY”、“OPERATOR(pg_catalog.=)”和“FOR KEY SHARE”是做什么的?
SELECT 1
FROM ONLY "public"."acmeinstanceinfo" x
WHERE "widgetid" OPERATOR(pg_catalog.=) $1
FOR KEY SHARE OF x
我对 Microsoft SQL 服务器有相当多的经验,但对 PostgreSQL 零经验。对此查询所做的任何见解都会很棒。
我在一个 sql server 数据库中有 3000 万行,我在其中添加了一个简单的标记列。一个字符允许为空。我确实为该列添加了一个索引。
我用它来跟踪哪些行已被处理以进行数据提取。在初始开发期间,我将从头开始(多次)重新启动提取过程,并且需要将值重置为“1”。
作为新手数据库开发人员(我在跟谁开玩笑……),我的第一次尝试是使用一个简单的更新脚本将“2”(我已经处理过这一行)的值重置为“1”。我第一次运行脚本时,它在大约 5 分钟内执行完毕。我最后一次执行 - 花了 45 分钟。一定有更好的方法。
我是否可以通过完全删除该列并使用默认值“1”重新创建它来加快速度?速度会保持一致吗?
- 更新 - -
下次我需要这样做时,我将尝试以下操作:
ALTER TABLE acmewidgets DROP COLUMN LegacyExtract;
ALTER TABLE acmewidgets
ADD LegacyExtract CHAR NOT NULL DEFAULT (1);