标签: sql-server-2014

应用2014 SP2+CU4后CDC捕获作业失败/CT表列变化

我们遇到了 CDC 问题,即捕获作业失败并且不会自行重启。这是在 DEV 环境中,所以没有害处,但有没有人看到这些错误或知道 CDC 到底出了什么问题?

SQL 2014 EE 12.0.5540 - 带有 SSISDB 的 2 节点 AG

在此处输入图片说明

过程或函数 sp_batchinsert_1663605265 指定的参数过多。更多信息查询sys.dm_cdc_errors动态管理视图

日志扫描进程未能从日志序列号 (LSN) {00002d0d:0000f11f:0002} 构建复制命令。备份发布数据库并联系客户支持服务。想要查询更多的信息

日志扫描进程在处理日志记录时失败。参考当前会话中以前的错误以确定原因并纠正任何相关问题。更多信息查询sys.dm_cdc_errors动态管理视图

我们尝试使用sp_cdc_drop_jobabd删除并重新创建捕获作业sp_cdc_add_job。我们还尝试故障转移到另一个节点以及服务器/服务重新启动。似乎没有什么能让 CDC 自行重启。

我们在周五通过 AG 滚动补丁应用了 CU4,因此我们处于最新最好的状态。在我们修补并故障转移后,这个问题立即出现。

添加日志查询结果

在此处输入图片说明

sql-server change-data-capture sql-server-2014

7
推荐指数
1
解决办法
4108
查看次数

为什么 OPTIMIZE FOR UNKNOWN 将我的查询改进了几秒钟?

好的,所以我有一个我们在 SSRS 报告中使用的非存储过程查询。这个查询非常慢(过去两个小时我已经运行了这个查询的原始版本,但仍未完成),为了改进它,我从头开始重写它,我想出了以下内容:

现在这里是无聊的单词问题部分:

我们希望为TOP 5每个销售代表提取一份客户列表,但从该列表中排除所有TOP 10客户。(因此,如果 John Doe 有客户 A、B、C、D 和 E,而客户 C 是前 10 名之一,则只提取 A、B、D 和 E。)

为此,第一个查询使用了IN (... NOT IN ( ) ),所以我认为是嵌套IN的问题,为了重写它,我做了一个OUTER APPLY真正打破一切的查询。

无论如何,我修复了所有这些并运行了查询,但仍然需要 10-15 秒,我认为这是参数嗅探。为了进行调查,我在 SSMS 中运行了查询,添加了OPTION (RECOMPILE)(查看会生成什么查询计划),并得到以下内容:

方案一

可以在 Brent Ozar 的“粘贴计划”中查看此处。生成这个的查询是:

DECLARE @Top10Temp TABLE (Id INT)
INSERT INTO @Top10Temp
SELECT TOP 10 Id
FROM Object1
WHERE Column2  = @ReportId
  AND Column3 …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization execution-plan sql-server-2014 parameter-sniffing

7
推荐指数
1
解决办法
1458
查看次数

重组聚集索引时从二级读取数据的问题

我们在 SQL Server 2014 SP2 CU5(3 个节点)中有一个 AOAG。有一个读取提交的快照隔离级别为ON的数据库。我们有一个压缩的大表。我们在这个表上的一些更大的查询是在辅助中执行的。

然后在主节点上有一个夜间作业来重新组织几个表上的索引。当它遇到上述表的聚集索引时,我们会收到以下错误:

访问数据库 'yyyy' 中的表 'xxxx' 中的版本化行时事务中止。未找到请求的版本化行,因为尝试创建版本的操作不允许可读的辅助访问。

在某些时候,大查询正在执行带有提示的读取READUNCOMMITTED。我认为这是这个错误的原因,所以我删除了它们。但是错误仍然存​​在。

有任何想法吗?

当前设置:

  • 02 次要处于同步模式
  • 03 次要异步模式

AOAG 电流设置

表详细信息

  • 行数:122.567.668
  • 总空间MB:18.460
  • 已用空间MB:18.238

定义:

CREATE TABLE [dbo].[big_table](
[ID] [int] NOT NULL IDENTITY(1, 1),
1 [int] NULL,
2 [datetime] NULL,
3 [int] NULL,
4 [int] NULL CONSTRAINT [DF_ccc_bUnits] DEFAULT ((0)),
5 [money] NULL,
6 [money] NULL,
7 [int] NULL,
8 [int] NULL CONSTRAINT [DF_ccc_MinDays] DEFAULT ((0)),
9 [int] NULL,
10 [int] NULL,
11 …
Run Code Online (Sandbox Code Playgroud)

sql-server availability-groups sql-server-2014 index-maintenance

7
推荐指数
1
解决办法
1691
查看次数

记录和检索时间相关值的最佳方法

我有有一张桌子交易总线(登机乘客)。给定路线 ID日期,我需要在另一个表中查找当天正在执行的服务类型巴士时刻表最多每 6 个月左右更改一次,大多数年份保持不变。

目前调度表的定义如下:

CREATE TABLE [dbo].[Routes](
    [ID] [int] NOT NULL,
    [RouteID] [int] NOT NULL,
    [Type] [varchar](50) NOT NULL,
    [StartDate] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [ID] ASC
));
Run Code Online (Sandbox Code Playgroud)

一个示例可能如下所示:

ID  RouteID  Type          StartDate
--  -------  ------------  ----------
 1      301  Standard      2015-01-01
 2      301  Discontinued  2016-06-01
 3      302  Standard      2015-01-01
 4      302  ParaTrans     2017-01-01
Run Code Online (Sandbox Code Playgroud)

所以,如果我有一个2015-04-20RouteID 301交易,我想取回“标准”,但如果交易是从2018-01-20 开始,它应该返回“停止”。对于2015-01-01之前的交易,它应该返回 NULL(或“”,或任何可能与有效答案冲突的结果,即“标准”、“Paratrans”或“停止”)。 …

database-design sql-server sql-server-2014

7
推荐指数
1
解决办法
383
查看次数

SELECT MIN(+ - Column) 有什么作用?

我今天遇到了一个查询,它做了一些我以前从未见过的事情。它做了这样的事情:

SELECT 
    MIN(+ - schema_id) AS [WhatInTheWorld?], 
    MIN(schema_id) AS MinimumID, 
    MAX(+ - schema_id) AS [Uhhh], 
    MAX(schema_id) AS MaxID
FROM sys.objects
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果:

WhatInTheWorld? MinimumID    Uhhh       MaxID
-4              1            -1         4
Run Code Online (Sandbox Code Playgroud)

“+”和“-”究竟是做什么的?

sql-server sql-server-2014

7
推荐指数
1
解决办法
217
查看次数

_WA_Sys_ 统计何时更新?

我的数据库中有一些自动生成的 _WA_Sys_ 统计信息,它们有一段时间没有更新(与同一个表中的其他统计信息相比)

经验法则似乎是在大于 500 行的表中,统计信息在 20% + 500 行数据更改时更新。

但是,我可以看到使用以下查询

SELECT  t.name,
        i.name,
        i.rowcnt,
        i.rowmodctr,
        p.last_updated
FROM    sys.sysindexes i
        JOIN sys.tables t
            ON i.id = t.object_id
        JOIN sys.stats s
            ON s.object_id = t.object_id AND i.name = s.name
        CROSS APPLY sys.dm_db_stats_properties(s.object_id,s.stats_id) p
WHERE   rowmodctr > 0
ORDER BY i.rowmodctr DESC
Run Code Online (Sandbox Code Playgroud)

有一个表包含许多过时的 _WA_Sys_ 统计信息(并且 rowmodctr 高于 20% + 500)

如果对表运行查询并在 WHERE 子句中添加与过时 _WA_Sys_ 统计信息关联的列之一并检查统计信息的更新日期,我可以看到它已更新。

如果我再次使用 WHERE 子句运行相同的查询,则统计信息不会更新

似乎 _WA_Sys 统计信息在运行查询时更新,将使用它们并且它们已过时?

statistics sql-server-2014 cardinality-estimates

7
推荐指数
1
解决办法
830
查看次数

以管理员身份从代理运行 Powershell 脚本

当 SQL Server 服务启动时,我需要在我的服务器上的 IIS 中回收一个 AppPool。

我采取的路线是有一个启动存储过程,它运行具有 Powershell 作业步骤的代理作业。

我已经从互联网上创建/抓取了一个 Powershell 脚本来回收应用程序池:

# Load IIS module:
Import-Module WebAdministration
# Set a name of the site we want to recycle the pool for:
$site = "Default Web Site"
# Get pool name by the site name:
$pool = (Get-Item "IIS:\Sites\$site"| Select-Object applicationPool).applicationPool
# Recycle the application pool:
Restart-WebAppPool $pool
Run Code Online (Sandbox Code Playgroud)

这适用于操作系统级别,但仅当 Powershell 以管理员身份运行时才有效(即使我在 Admin 组中登录到 Windows 的帐户也是如此)

果然,如果我使用包含上述代码的 Powershell 步骤在代理中创建作业,则在执行时会出现错误

作业步骤在 PowerShell 脚本的第 6 行收到错误。对应的行是'$pool = (Get-Item "IIS:\Sites\$site"| Select-Object applicationPool).applicationPool'。更正脚本并重新安排作业。PowerShell 返回的错误信息是:'无法检索 …

powershell windows-server sql-server-2014

7
推荐指数
2
解决办法
4063
查看次数

.NET 执行 SQL 查询,Active Monitor 显示多行相互阻塞

我使用 .NET 在 SQL Server 2014 上执行 SQL 操作,这里是使用的代码:

using(SqlConnection conn = new SqlConnection(connectionString)){
    //https://stackoverflow.com/questions/1880471/capture-stored-procedure-print-output-in-net
    conn.InfoMessage += new SqlInfoMessageEventHandler(logSqlMessages);
    conn.Open();
    using(SqlCommand stmt = new SqlCommand{
        Connection = conn,
        CommandText = sql,
        CommandTimeout = 30000 // The time in seconds to wait for the command to execute. The default is 30 seconds.
        //,CommandType = CommandType.StoredProcedure
    })
    {
        affectedRecords = stmt.ExecuteNonQuery();
    } // using stmt
} // using conn
Run Code Online (Sandbox Code Playgroud)

当我查看 Active Monitor 时,有数十行引用相同的操作。它们都具有相同的session_id,其中一些具有正在运行的任务状态,并且大多数处于暂停状态。其中一些具有 LastWaitTime CXPACKET,大多数具有PAGEIOLATCH_SH.

我还在 SQL …

sql-server optimization ado.net activity-monitor sql-server-2014

7
推荐指数
1
解决办法
514
查看次数

按连接表的列排序时提高性能

我有一个包含查找表的外键的父表(简化示例):

CREATE TABLE [dbo].[Parent] (
    [Id] [uniqueidentifier] NOT NULL,
    [LookupId] [uniqueidentifier] NULL
)

CREATE TABLE [dbo].[Lookup] (
    [Id] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](64) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该Parent表有超过 1000 万行,而该Lookup表大约有 5000 行。真正的Parent实现有几个这样的对其他表的外键引用,并且这些列中的每一个都可能包含 NULL。

两个示例表的Id列都具有唯一的聚集索引,Parent具有 的非聚集索引LookupIdLookup的非聚集索引Name

我正在运行一个分页查询,我想在结果中包含查找值:-

SELECT
    P.Id,
    L.Name
FROM Parent P
LEFT JOIN Lookup L ON P.LookupId = L.Id 
ORDER BY P.Id
OFFSET 500000 ROWS FETCH NEXT 50 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

这运行得很快,按 排序也是如此P.LookupId。 …

sql-server sql-server-2014 query-performance

7
推荐指数
1
解决办法
431
查看次数

什么可能导致 SQL Server 一开始拒绝执行 SP,但稍后允许它不更改权限?

用户(Windows 登录)刚刚抱怨他被拒绝执行程序。我去检查并确认他有执行它的权限。我没有改变任何东西(现在我是唯一一个拥有管理员权限的人,如果需要的话),在两次尝试失败后,他尝试第三次运行 SP 并且成功了。

我将 XE 配置为捕获错误消息,它捕获了错误代码 229 的两倍:

对象“storedProcedureName”、数据库“databaseName”、架构“schemaName”的 EXECUTE 权限被拒绝。

是否存在预期这种行为的任何情况?


Microsoft SQL Server 2014 (SP3-CU-GDR) (KB4535288) - 12.0.6372.1 (X64)

sql-server permissions errors sql-server-2014

7
推荐指数
4
解决办法
1853
查看次数