标签: sql-server-2016

SQL Server 2016 中的服务器角色

SQL Server 2016 中有 3 个新的服务器角色:

  • 中等
  • 超大号

知道这些是做什么用的吗?谷歌没有提供有关这些的任何信息。

在此处输入图片说明

data-warehouse sql-server role sql-server-pdw sql-server-2016

6
推荐指数
1
解决办法
687
查看次数

SQL Server 警报未向操作员发送通知电子邮件

我设置了几个 SQL Server 警报并添加了 Operator 来通知是否发生任何警报。

我只是注意到确实发生了几个警报,但我们没有收到任何警报电子邮件。我确实向操作员发送了一封测试通知电子邮件,它工作正常,我们收到了电子邮件。

知道为什么在实际警报发生时我们没有收到电子邮件警报吗?

数据库邮件日志中没有任何内容。

SQL Server 是可用性组的一部分,我只在操作员中提供电子邮件名称,而不提供任何“网络发送地址”或“寻呼机电子邮件名称”。此外,所有警报都列在操作员的属性中。

警报历史记录“发生次数:266”,上次警报的日期是昨天 6 月 29 日,但我根本没有收到警报电子邮件。甚至运营商历史也没有任何历史(从未通过电子邮件发送)。

sql-server sql-server-agent database-mail alerts sql-server-2016

6
推荐指数
1
解决办法
4483
查看次数

当目标表有聚集索引时插入速度要慢得多

我刚刚调试了一个让我完全困惑的问题。

我们的开发数据仓库上的 ETL 转换流程在每天成功运行数月后刚刚失败。使用相同的表架构、索引和数据调用相同存储过程的相同 SSIS 作业在生产中工作正常。

此步骤通常需要不到 2 分钟。今天,在 4 小时后,工作尚未完成,但也没有失败。没有报告的错误。SQL 日志sp_who2中没有任何内容,也没有显示任何阻塞。

  • 是查询执行良好时的估计计划的链接。
  • 是查询未完成时估计计划的链接。

该作业会截断临时表,然后插入大约 600,000 行数据。ETL 进程具有对该表的独占访问权。当我检查时,我只能看到等待CXPACKET

我已将故障追溯到唯一的聚集索引。

该表在标识列上有一个非聚集主键(见下文)

CREATE TABLE [dbo].[Transform_JobCosting_Transaction](
    [ETL_TransformKey] [int] IDENTITY(1,1) NOT NULL,
    [TransactionId] [varchar](255) NOT NULL,
    [KeyType] [varchar](255) NOT NULL,
    [FinancialYear] [varchar](255) NOT NULL,
    [Job] [varchar](255) NOT NULL,
    [Subjob] [varchar](255) NOT NULL,
    [AnalysisCode] [varchar](255) NULL,
    [etc] [varchar](255) NOT NULL,
    [etc] [varchar](255) NOT NULL,
    [etc] [varchar](255) NOT NULL
     CONSTRAINT [PK_Transform_JobCosting_Transaction] PRIMARY KEY NONCLUSTERED 
(
    [ETL_TransformKey] ASC
)WITH (PAD_INDEX = …
Run Code Online (Sandbox Code Playgroud)

sql-server clustered-index sql-server-2016

6
推荐指数
1
解决办法
4699
查看次数

列存储聚合下推不适用于浮点/真实数据类型

我对float/real数据类型的聚合下推有问题。根据文档,“任何数据类型 <= 64 位”或 8 字节 () 支持聚合下推:

  • 支持的聚合运算符有 MIN、MAX、SUM、COUNT、AVG
  • 支持任何 <= 64 位的数据类型。例如,支持 bigint 是因为它的大小是 8 个字节,但不支持十进制 (38,6),因为它的大小是 17 个字节。此外,不支持字符串类型
  • 聚合运算符必须位于 SCAN 节点或带有 group by 的 SCAN 节点之上

无论我做什么,它都不起作用。我尝试使列可以为空而不为空。分组和无分组。

我们在最新版本的 SQL Server 2016 (SP1-CU3) 上运行。我想知道有人经历过吗?这对我来说似乎是一个错误。我错过了什么吗?

如果您遇到同样的问题,请为我的 SQL Server 反馈请求点赞。现在我面临着将float列转换为numeric. 但是numeric类型的操作通常比较慢。所以我可能在一个地方赢了,在另一个地方输了。我已成功测试numeric(15,12)

这是说明问题的脚本(请启用实际执行计划以查看问题):

DROP TABLE IF EXISTS dbo.TestTable;

CREATE TABLE dbo.TestTable 
(
     cKey             INT               NOT NULL
   , cGroup           INT               NOT NULL
   , cNumeric36_3     NUMERIC(36, 3)    NULL
   , …
Run Code Online (Sandbox Code Playgroud)

performance sql-server aggregate columnstore sql-server-2016

6
推荐指数
1
解决办法
425
查看次数

将变量作为参数传递给 json_query 函数

我收到错误:

“JSON_VALUE 或 JSON_QUERY”的参数 2 必须是字符串文字

...同时尝试将变量作为参数传递给JSON_QUERY函数。请帮我解决它。

DECLARE @cnt INT = 1;
DECLARE @cnt_total INT = 1;
DECLARE @json NVARCHAR(MAX);
DECLARE @json1 NVARCHAR(MAX);
declare @str  VARCHAR(200);

WHILE @cnt <= 10
BEGIN
    set @str = '$.Seasons[0].Products['+convert(varchar,@cnt)+'].ProductChannels';
    set @str = char(39) +@str+ char(39);
    PRINT @STR
    select @json = json_query(jfile,@STR) from Import.tstjson;
--MORE CODE     
   SET @cnt = @cnt + 1;
END
Run Code Online (Sandbox Code Playgroud)

样本数据:

DECLARE @cnt INT = 1;
DECLARE @cnt_total INT = 1;
DECLARE @json NVARCHAR(MAX);
DECLARE @json1 NVARCHAR(MAX);
declare @str  VARCHAR(200); …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql json sql-server-2016

6
推荐指数
2
解决办法
7667
查看次数

Sqlcmd:无效参数 - 尝试将变量传递给 sqlcmd 时

我正在尝试在 Server 2012R2 上使用 DOS 命令提示符来运行包含以下内容的批处理。我想运行一个 SQL 命令 (sqlcmd) 并将结果返回到命令窗口。

这就是我目前正在尝试的,但 sqlcmd 不断抛出Sqlcmd: 'test': Invalid argument. Enter '-?' for help.20:56:08.

FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql" -v dbname="test"`) DO (
    Echo %%F
)
Run Code Online (Sandbox Code Playgroud)

但是,如果我在没有参数/变量的情况下尝试它,它会完美运行!

FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql"`) DO (
    Echo %%F
)
Run Code Online (Sandbox Code Playgroud)

有没有人知道使用 sqlcmd、DOS CMD 以及 FOR /F 循环(例如在我的第一个示例中)将变量传递给我的 sql 查询的方法?

scripting sql-server-2016

6
推荐指数
1
解决办法
2661
查看次数

异常的列比较和查询性能

我们有一些顾问致力于扩展内部数据仓库。我正在做代码审查并在所有加载过程中遇到这种模式:

    MERGE [EDHub].[Customer].[Class] AS TARGET
    USING (
        SELECT <columns>
        FROM [dbo].[vw_CustomerClass]
            WHERE JHAPostingDate = @PostingDate   
        ) AS SOURCE
        ON  TARGET.BankId = SOURCE.BankId       -- This join is on the business keys
            AND TARGET.Code = SOURCE.Code
    WHEN NOT MATCHED BY TARGET  
        THEN
            <INSERT Statement>
    WHEN MATCHED
        AND TARGET.IsLatest = 1
        AND EXISTS (
            SELECT SOURCE.[HASH]   
            EXCEPT          
            SELECT TARGET.[Hash]
            )
        THEN 
            <UPDATE Statement>
Run Code Online (Sandbox Code Playgroud)

要点是,如果我们有一个新的业务键,则插入,但如果业务键存在并且属性的散列与我们的当前行不匹配,则更新旧行并插入一个新行(稍后在代码中)。一切正常,但是当我看到这段代码时我暂停了

AND EXISTS (
            SELECT SOURCE.[HASH]   
            EXCEPT          
            SELECT TARGET.[Hash]
            )
Run Code Online (Sandbox Code Playgroud)

与 SOURCE.[HASH] <> TARGET.[Hash] 相比,它似乎过于复杂。EXCEPT 将进行准确的 NULL 比较,但在我们的情况下,哈希值永远不会为 NULL(或者我们有更大的问题)。我希望我们的代码易于阅读,这样当有人必须维护它时,它不会混淆。我向我们的顾问询问了它,他们推测它可能会因为集合操作而更快,但我决定编写一个简单的测试(下面的测试代码)。

我注意到的第一件事是 …

performance sql-server sql-server-2016 except query-performance

6
推荐指数
1
解决办法
415
查看次数

如何从表格中检索大文本?

为了我自己的记录,我在其中一台服务器上有一张表,我喜欢在其中保存我的活动和脚本

表定义是:

IF OBJECT_ID('[dbo].[activity]') IS NOT NULL 
DROP TABLE [dbo].[activity] 
GO
CREATE TABLE [dbo].[activity] ( 
[dt]        DATE                             NOT NULL,
[i]         SMALLINT                         NOT NULL,
[activity]  NVARCHAR(max)                     NOT NULL,
[script]    NVARCHAR(max)                     NULL  
           CONSTRAINT [DF__activity__script__6E01572D] DEFAULT (NULL))

GO
CREATE CLUSTERED INDEX [pk_activity] 
   ON [dbo].[activity] ([dt] desc, [i] desc)
Run Code Online (Sandbox Code Playgroud)

由于该表位于DBADBA_SERVER服务器上的数据库中,因此我从本地计算机创建了一个linked server到该表,DBA_SERVER以便我可以将脚本插入到我的表中。

这就是我将脚本插入我的表的方式,该脚本位于我的本地机器上:

    INSERT INTO [MY_DBA_SERVER].[DBA].[dbo].[activity]
               ([dt]
               ,[i]
               ,[activity]
               ,[script])
    SELECT
               DT=cast ('3 may 2018' as date)
               ,I=1100
               ,ACTIVITY='MOVE APPLICATION ROWS - the Ids work'
               ,[script]=BulkColumn 
    FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server blob openrowset sql-server-2016 bulk-insert

6
推荐指数
3
解决办法
3699
查看次数

链接服务器连接到多子网故障转移集群

我们最近将我们的 SQL Server 分发数据库迁移到了多子网故障转移集群,并且发现偶尔在从发布者添加文章/查看复制状态时,我们会收到如下错误:

无法为链接服务器“repl_distributor”初始化 OLE DB 访问接口“SQLNCLI11”的数据源对象。(.Net SqlClient 数据提供程序)

这似乎是由于链接服务器连接跟一个多子网故障转移群集(如所描述的在这里

除了遵循在我们发布者的每个节点(也是一个多子网故障转移集群)上实现 ODBC 连接的解决方案之外,还有什么我们可以尝试修复连接到多子网 FCI 的链接服务器吗?

sql-server sql-server-2016

6
推荐指数
1
解决办法
3820
查看次数

SQL Server 2016 SP2 - 在线重建死锁本身 - 这是一个错误吗?

ALTER INDEX [PK_Order_Line_Inventory] 
ON [OrderManager_C].[Order_Line_Inventory] REBUILD 
WITH ( ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION= 5, ABORT_AFTER_WAIT=SELF) )
Run Code Online (Sandbox Code Playgroud)

SPID 58 中的 3 个线程满足了这一点。但是,在争论同一个数据页时,其中一个线程成为死锁受害者。进程 ID 不同,执行上下文 ID 和 Txn 属性也不同。对于同一个命令,实际上有两个死锁,一个用于 3 个线程,第二个用于幸存的 2 然后成为一个。

SQL 2017在线索引操作指南中有这样一段,“虽然不常见,但在线索引操作在与数据库更新交互时会因为用户或应用程序活动而导致死锁。在这些罕见的情况下,SQL Server 数据库引擎会选择用户或应用程序活动是死锁受害者。 ”,但由于死锁涉及“本身”,我的根本原因没有找到。

该表只有一个单列、bigint、Clustered PK,在 520MB 中包含 2.7M 行;在 1::0/1 关系中对其父级的一个 FK。

出现问题:

  1. 这是一个错误吗?我已经十多年没有在 SQL Server 上看到这种行为了。
  2. REBUILD 中的任何一个存活下来了吗?
  3. 这种情况有可能复发吗?
  4. 我想我可以增强我们的碎片整理工具,以允许选择将特定表的 MAXDOP=4 覆盖为 =1,但这真的有必要吗?

我一直在寻找类似的事件,但是从 SQLCoffee 到 MS KB978250 的一个看起来很有希望的链接遇到了 404 错误,并且从搜索 MS(原始线程)中根本没有命中。该 KB 谈到了对 SQL2008 的修复 - 如果相关,人们会认为它仍然应该是 2016 位的修复......

任何人都可以对此有所了解吗? …

sql-server deadlock sql-server-2016

6
推荐指数
1
解决办法
259
查看次数