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-229558

Sranda's questions

Martin Hope
Sranda
Asked: 2024-01-02 22:34:44 +0800 CST

DMV sys.dm_exec_trigger_stats - 重复条目

  • 5

我正在运行以下选择:

SELECT tstats.object_id, tstats.database_id, tstats.sql_handle, 
DB_NAME(tstats.database_id) AS [db_name], OBJECT_NAME(tstats.object_id) AS      
trigger_name, tstats.execution_count, tstats.total_worker_time,     
tstats.total_logical_reads, tstats.total_logical_writes, OBJECT_NAME(trgs.parent_id) AS  
trigger_parent, getdate() AS [timestamp] FROM sys.dm_exec_trigger_stats tstats INNER 
JOIN  sys.triggers trgs ON tstats.object_id = trgs.object_id ORDER BY object_id asc

SQL Server 版本是 2019 (RTM-CU24) 标准。

问题是,某些触发器返回两次(相同的对象 ID、不同的执行计数和其他统计信息):

触发统计 DMV 的重复输出

我正在尝试对这个sys.dm_exec_trigger_statsDMV 进行采样并每分钟生成增量,以查看哪些触发器正在影响应用程序性能 - 我认为数据库名称、触发器的父名称和触发器名称(或 object_id)的组合是唯一的。它们多次返回,具有不同的运行时统计信息,我无法理解。提示表示赞赏。

trigger
  • 1 个回答
  • 40 Views
Martin Hope
Sranda
Asked: 2023-11-01 22:45:47 +0800 CST

将 SQL 2016 加入到安装了 SQL 2014 的单节点集群

  • 5

我目前有 1 节点(这是一个实验室)Windows 2012R2 集群,安装了 SQL Server 2014(修补到基于 sqlserverupdates.com 的最后一个补丁)。目标是将集群升级到更新且受支持的集群。我发现我可以加入集群的操作系统最新的节点是 2016 年(可能无法跳过操作系统版本,无论如何加入 2019 年都失败了)。这是可以忍受的。当我尝试安装 SQL 2016、2019、2022 时,所有这些(参见屏幕截图)都声称看不到集群,只有安装在 Win2016 节点上的 SQL 2014 可以看到集群。一整天阅读论坛,我确信可以将较新的 SQL(2016+)加入到具有较旧 SQL(2014)的现有集群,而不会出现任何问题。

然后,当故障转移到较新的 SQL 时,我知道我无法返回到较旧的 SQL(SQL 在内部更新文件),这很好 - 目标是逐渐邀请较新的节点加入集群并驱逐旧的和不受支持的节点。但为什么我无法将 SQL2016+ 加入集群,这首先是我的一个困惑。建议表示赞赏。

SQL 2016 节点被添加到 2014 集群

sql-server
  • 1 个回答
  • 46 Views
Martin Hope
Sranda
Asked: 2023-09-14 22:52:44 +0800 CST

forwarded_fetch_count 和forwarded_record_count 之间的区别

  • 5

我一直在挠头,重新阅读MSFT帮助,但我仍然无法理解sys.dm_db_index_operational_stats和sys.dm_db_index_physical_stats中的forwarded_fetch_count和forwarded_record_count之间的区别。让我用下面的例子来说明我理解观点的问题。

我运行了以下查询:

;with heaps as ( 
select 
    DB_NAME(DB_ID()) dbname, object_name ( p.object_id ) objname, sum(row_count) row_count,
    DB_ID() database_id, p.object_id objectid
from 
    sys.dm_db_partition_stats p
    join sys.objects o on o.object_id = p.object_id 
WHERE 
    index_id = 0 and o.is_ms_shipped = 0 --and row_count > 0
    group by p.object_id ) 
select 
    h.*, 
    forwarded_fetch_count
from heaps h
    cross apply sys.dm_db_index_operational_stats(database_id, objectid, 0, null) ps
    WHERE forwarded_fetch_count > 0 ORDER BY forwarded_fetch_count DESC¨

和

SELECT page_count, OBJECT_NAME(ps.object_id)
,avg_record_size_in_bytes
,avg_page_space_used_in_percent
,forwarded_record_count 
FROM sys.dm_db_index_physical_stats(db_id('your_db_name'), NULL,NULL, NULL, 'DETAILED') AS ps
WHERE forwarded_record_count IS NOT NULL AND forwarded_record_count > 0
GO

这两个查询都返回了我正在调整的单个数据库中的不同表列表。第一个查询返回的表中每个表有 1000 到 100 000 条转发提取,第二个查询返回其他表集的 10 - 60 000 条转发记录计数。

作为管道胶带修复,我重建了有问题的表格。然而,在 Windows 的性能监视器中,我仍然看到大量的转发记录/秒(图表通常飙升至 100)。运行 sp_blitzfirst @seconds = 30 时,我会收到每秒大量转发的提取的警报。一旦警报是一般警报(意味着与任何数据库无关),同一语句的其他 9 个警报就会提到:“Forwarded Fetches/Sec High:TempDB Object”。根据转发的提取计数,TempDB 中的转发提取数量比 TempDB 中的转发提取数量多十倍或一百倍。

最后但并非最不重要的一点是,ISV 大量实施了触发器(我将其与 TempDB 转发提取相关)。

我的问题:

  • 两个视图中的两列有什么区别?
  • 当处理由于堆上转发记录而导致数据库缓慢时,我应该使用哪一个?(我知道MSFT的帮助提到了dm_db_index_physical_stats中与堆相关的forwarded_record_count,但仍然没有让我更清楚)。
  • 我可以确定 TempDB 中的什么原因导致这些转发的提取吗?
sql-server-2019
  • 1 个回答
  • 40 Views
Martin Hope
Sranda
Asked: 2023-08-03 16:31:15 +0800 CST

SELECT 查询的 TempDB GAM 争用

  • 7

我有以下问题,我的 TempDB 知识还没有涵盖这一点:

  • 在 SSMS 中运行约 200 毫秒的分析查询,从应用程序启动时在 SQL Server 上继续运行 60 秒以上 - 这种情况只是偶尔发生,大多数时候问题并不存在
  • 可运行/挂起查询的队列可能会增长到同一查询文本的数十个查询,其中一个 SELECT 查询是阻止其他相同 SELECT 的头阻塞程序
  • 当可运行/挂起队列与基线相比开始显着增长时,对于相同文本和参数值的特定查询,最主要的等待是 SOS_SCHEDULER_YIELD 和 PAGELATCH_UP
  • 当问题发生时,排队的数十个查询具有相同的文字参数值(轮班开始时间戳、员工 ID 和生产区域)
  • 被挂起的查询(在我们的监控快照期间 - DBA Dash)将 PAGELATCH_UP 等待作为最主要的等待,并且它们正在等待 tempdb 中的 GAM 页面
  • 当我使用在可运行/挂起队列中不断堆积的查询参数检查 SSMS 中的执行计划时,查询不会溢出到 tempdb

服务器、数据库和数据库流量的配置:

  • 4 到 6 个核心(问题独立发生在具有不同核心数的两台不同服务器上)
  • 4 - 6 个大小统一的 TempDB 文件
  • 分配给实例的 40GB RAM
  • 在特定数据库中,启用了 RCSI + 快照(因此 TempDB 受到攻击)
  • 运行查询的两个表上没有发生删除,只有 INSERT 和 SELECT - 当时仅插入 1 行
  • SELECT 通常会命中最年轻的记录(最近插入的记录)
  • 服务器通常每秒处理 400 - 700 个批量请求;当问题出现时,与正常操作相比,它会达到峰值 1500,从而产生较高的 IO + CPU 负载
  • 表中的数据或多或少具有均匀分布,即特定生产区域的无班次中没有员工 ID 的记录明显多于其他员工
  • 所附屏幕截图是一张表格,显示了问题完全显现时 DBA Dash 的快照
  • tempDB,尽管 RCSI+ 快照增长不多,但在 60GB 驱动器上只有几 GB(稳定状态持续了几个月,并且在我在这里描述的几集之后)
  • 屏幕截图中的所有 SELECT 查询都有 PAGELATCH_UP 等待,其中大约一半具有以下附加信息:
    • 等待资源类型:PAGE
    • 等待资源:2:3:2(我认为含义是:tempdb数据库,tempdb中的第三个文件,我们正在等待的第二页)
    • 等待文件:主| 温度2
    • 页面类型:GAM
    • 等待编译:False

除了明显努力找到根本原因并永久解决它之外,我的主要问题是:

  • 为什么 SELECT 查询可以大量访问 tempdb 中的 GAM 页面?
  • 如果我承认 SELECT 可以频繁接触 GAM 页面,那么什么可以阻止查询(头拦截器)进行(即读取 GAM 页面并使其立即可供其他人使用)?

任何相关学习资源/建议的指针将不胜感激

查询计划在这里

DBADash 运行查询快照

编辑:为了回答约翰的评论,我想添加以下内容:

  • CTFP:30
  • MAXDOP:4(为两台 SQL 服务器设置,其中一个有 6 个核心,另一个有 4 个)
  • 每个 SQL VM 有 2 个实例 - 发生问题的实例,然后是其他“办公室”实例,这对 SQL Server VM 造成的负载可以忽略不计
  • 表格

ManualPanelEntries:6933089 条记录,1221 MB 数据,2591 MB 索引 - 事实上,索引比数据本身消耗更多空间

权重:3108486条记录,178MB数据,170MB索引

  • 整个数据库:125GB

===========

写完这篇文章后我发现,头阻止程序(许多并行的相同 SELECT 之一)也在等待 GAM,即特定 tempdb 文件的第二页。就好像其他东西(版本存储?)在特定的 GAM 页面上持有锁定,阻止使用 TempDB 的其他查询继续进行。

sql-server-2019
  • 2 个回答
  • 129 Views
Martin Hope
Sranda
Asked: 2023-04-20 21:23:07 +0800 CST

多个实例和 AG 侦听器的组合 - 连接到 AG 侦听器会将我发送到不同的实例

  • 6

所讨论的环境由 AD 域和 2 个 AZ SQL VM 组成。SQL 服务器版本是 SQL 2022 Standard - CU 2。目前每个 AZ SQL VM 上有三个数据库实例,这些实例中的数据库在(基本)AlwaysON AG 中工作,用于非系统数据库。

最近,我与 Microsoft 合作,利用 Azure 中的所有 SQL 服务器托管和他们的建议,充分利用 Azure IaaS SQL 代理的功能是安装默认实例以及 3 个命名实例。我做到了。

现在对于这 3 个实例,情况如下:

  • SQL Server VM 的子网中有地址 A、B
  • 每个实例和该实例中每个数据库的侦听器的地址为 C、D、E、F ....
  • 2 个实例中的侦听器在 TCP 端口 > 49152 上运行
  • 最后一个实例的侦听器在端口 1433 上运行,但地址不同于 A 和 B

我的问题 在按照 Microsoft 的建议安装默认 SQL 实例后,当连接到端口 1433 上的侦听器时,我以某种方式结束了默认实例,而不是在 TCP 1433 上运行的侦听器所属的实例。

/* EDIT 01 */ 回答 Sean 的宝贵问题:

为了到达在 1433 上侦听的 AG 侦听器(但在与服务器地址不同的 IP 上),我使用了 <Listener's DNS name> 并在默认实例中结束 - 两者都在 1433 上运行但具有不同的 IP。卸载默认实例后,所有实例都将重新开始工作。

所有命名实例都在动态端口上侦听,默认实例在 1433 上侦听。在 1433 上,一个命名实例的侦听器也在侦听,但这些侦听器每个都有单独的 IP 地址。网络设置符合 MSFT 指南 - AZ SQL VM 前面的 Azure 负载平衡器,以便 AG 正常工作。我没有触摸负载均衡器来反映默认实例在 1433 上侦听,因为该默认实例没有任何 AG。

/* 编辑 01 结束 */

有谁知道为什么?

sql-server
  • 1 个回答
  • 33 Views
Martin Hope
Sranda
Asked: 2021-10-20 21:59:21 +0800 CST

减少数据库引擎为此聚合查询读取的行数

  • 1

我想调整这个查询 - 它正在读取比我想要的更多的行。我已按照 Database Tuning Advisor 的建议添加了一个索引。

查询是这样的:

SET STATISTICS TIME, IO ON;

SELECT TOP 1000 project,
    Max(timestamp) timestamp
FROM   the_table
WHERE  deviceid = 581
GROUP  BY project

IO ,时间统计是这样的:

Table 'the_table'. Scan count 1, logical reads 2373, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 390 ms,  elapsed time = 829 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

执行计划可以在这里找到。

此查询查找的 dta_index 由projectnumber和组成timestamp。该表大约有 4,500,000 行,消耗大约 350MB,每条deviceid记录的数量大致相同(即均匀分布,每个设备大约有 700K 条记录)。

我的问题:即使我只请求表中的前 1,000 行,无论我创建了什么索引或如何尝试重新编写查询,我总是最终读取 +/- 700K 行(即所有WHERE子句中所选设备的行)。如果您能放弃有关如何调整此查询的提示,我将不胜感激。

我不认为有比接触大约 700K 行更快的方法来缩小这个查询,特别是deviceid使用 exec 的第一个运算符。计划。

这是一个最小的可重现示例,包括表定义和两个示例行的插入:

CREATE TABLE [dbo].[the_table]
(
    [primary_key_col] [int] IDENTITY(1,1) NOT NULL,
    [Project] [int] NULL,
    [DeviceID] [int] NULL,
    [TimeStamp] [datetime] NULL,
    [Quantity] [int] NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
        [primary_key_col] ASC
    ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];

SET IDENTITY_INSERT [dbo].[the_table] ON;
INSERT [dbo].[the_table] ([primary_key_col], [Project], [DeviceID], [TimeStamp], [Quantity]) VALUES (4825107, 1232, 587, CAST(N'2021-10-23T05:48:48.000' AS DateTime), 1);
INSERT [dbo].[the_table]  ([primary_key_col], [Project], [DeviceID], [TimeStamp], [Quantity])  VALUES (4825108, 6458, 581, CAST(N'2021-10-23T05:49:17.000' AS DateTime), 1);
primary_key_col 项目 设备ID 时间戳 数量
4825107 1232 587 2021-10-23 05:48:48.000 1
4825108 6458 581 2021-10-23 05:49:17.000 1

索引不是故意的问题的一部分,无论我尝试了哪个索引,对于特定的 deviceID,我总是达到 700K 行。

谢谢。

sql-server query-performance
  • 2 个回答
  • 156 Views
Martin Hope
Sranda
Asked: 2021-05-10 23:37:23 +0800 CST

列存储索引分析没有指出我要更正列

  • 1

我正在使用此查询来更深入地查看我的列存储索引,同时对我的执行计划进行 t-shooting(即段消除等):

    SELECT
    tables.name AS table_name,
    indexes.name AS index_name,
    columns.name AS column_name,
    partitions.partition_number,
    column_store_segments.segment_id,
    column_store_segments.min_data_id,
    column_store_segments.max_data_id,
    column_store_segments.row_count
FROM sys.column_store_segments
INNER JOIN sys.partitions
ON column_store_segments.hobt_id = partitions.hobt_id
INNER JOIN sys.indexes
ON indexes.index_id = partitions.index_id
AND indexes.object_id = partitions.object_id
INNER JOIN sys.tables
ON tables.object_id = indexes.object_id
INNER JOIN sys.columns
ON tables.object_id = columns.object_id
AND column_store_segments.column_id = 
     columns.column_id
WHERE tables.name = 'R***'

ORDER BY tables.name, columns.name, 
column_store_segments.segment_id;

(表名已编辑)。

分析结果如下: Postimg。

我的问题很简单:为什么分析的结果与索引中的列名不对应?正如您在图像右侧看到的那样,结果网格上的列名与列存储索引属性中显示的不同。

环境:SQL 2019 CU10 标准;视窗服务器 2019。

提前感谢您的反馈,请注意 S。

sql-server
  • 1 个回答
  • 79 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