标签: sql-server-2016

索引视图会减慢更新速度。有解决方法的提示吗?

我尝试创建索引视图。我终于有了一个(几乎)符合标准的案例。所有内部联接、极少数非确定性函数(已移至外部视图)和自联接仅位于移至外部视图的两个表中。

问题是仅视图就需要 3 秒以上的时间来编译,这对于用例来说太慢了。遵循这样的建议:

索引视图也是提高 INNER JOINS 性能的好方法。当两个或多个表在索引视图中预联接时,查询优化器可以选择检索物化视图数据,而不是执行昂贵的联接操作。

我正在考虑用索引视图解决问题。

然而,一旦创建了这个索引视图(它包含大约 20 个连接),对基础表的每次更新都会变得非常慢。设置统计 IO On 显示它正在重新访问语句上的所有基础表,这些表在重新评估视图时甚至不修改任何数据,例如如下所示的更新:

update a
  set y = b.y, z = b.z
from a inner join b on a.x = b.x
where exists (select a.x, a.y, a.z except select b.x, b.y, b.z)
Run Code Online (Sandbox Code Playgroud)

因此,受影响的行数为零,但整个索引视图及其依赖项仍然会执行一系列操作,并且执行时间会显示这一点。

有没有办法让 SQL Server 不使用该视图,除非它确实需要更新记录?也许有我不知道的暗示。

sql-server materialized-view sql-server-2016

5
推荐指数
0
解决办法
732
查看次数

SSMS 无法显示此任务的编辑器(通知操作员任务)

每当我双击 SSMS 维护计划中的通知操作员任务时,我都会收到一条错误消息,显示“无法显示此任务的编辑器” 。

属性 IsMailHost 不可用于数据库“[msdb]”。该对象的该属性可能不存在,或者由于访问权限不足而无法检索。(微软.SqlServer.Smo)

数据库邮件已配置并且工作正常。

我正在使用 SQL Server 2016 (13.0.4411.0) 和 SSMS 13.0.16106.4。

通过 PowerShell 询问 IsMailHost 属性似乎表明 IsMailHost 属性为 true。

$db = SqlServer\Get-SqlDatabase -ServerInstance sqlserver1 -Name msdb
Write-Host $db.IsMailHost
Run Code Online (Sandbox Code Playgroud)

上面的脚本返回True

如果我尝试在旧的 SQL 2008 服务器上使用 SSMS 10.0.5538.0 打开通知操作员任务,它工作正常,但使用 SSMS 13.0.44110.0,我会收到相同的错误消息。我开始认为这是 SSMS 构建的错误,而不是服务器的配置问题。

sql-server ssms database-mail sql-server-2016

5
推荐指数
1
解决办法
1275
查看次数

如何识别导致事务日志增长的事务?

我有一个 20 GB 的数据库,它的事务日志坚持超过 7 GB。

当我使用此脚本找出该数据库中最大对象的大小时,我发现它们相对较小。

在此输入图像描述

我一直在使用默认跟踪来查看此事务日志何时自动增长,但我没有发现。

DECLARE @path NVARCHAR(260);

SELECT 
   @path = REVERSE(SUBSTRING(REVERSE([path]), 
   CHARINDEX(CHAR(92), REVERSE([path])), 260)) + N'log.trc'
FROM    sys.traces
WHERE   is_default = 1;

SELECT 
   DatabaseName,
   [FileName],
   SPID,
   Duration,
   StartTime,
   EndTime
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE EventClass = 93 -- log autogrow event
ORDER BY StartTime DESC;
Run Code Online (Sandbox Code Playgroud)

我还尝试了这里的一些脚本,以检查哪些事务正在填充日志,但找不到任何事务。

我相信一定有一些非常长的事务同时进行,或者至少有一个较长的事务正在执行。

我怎样才能检查这些(long transactions in the database)?

在 LIVE 中,这是一个完整恢复模式数据库,是alwayson 的一部分。在 TEST 中,这是一个简单的恢复模式数据库,但由于所有作业都在那里,日志仍然增长到 7GB。

sql-server optimization transaction transaction-log sql-server-2016

5
推荐指数
1
解决办法
2515
查看次数

将列从 NVARCHAR 转换为 VARCHAR

我有几个有很多NVARCHAR(MAX)列的大表。该数据库仅供美国使用,我认为任何列中都没有任何外来字符或字母,所以我想调查一下:

  1. 将其中许多列从 更改为NVARCHARVARCHAR并且
  2. 根据我所做的一些数据分析,将这些列的大小调整为更合适的大小。例如,我知道其中某些列中数据的最大长度仅为 30 个字符左右,因此NVARCHAR(MAX)看起来有些过大。

我还试图限制隐式转换。

在执行此操作之前,有什么简单的方法可以确定每列是否确实只包含VARCHAR数据并且不会出现任何转换问题NVARCHAR

sql-server datatypes varchar type-conversion sql-server-2016

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

不使用系统时间的时态表

我们希望在 SQL Server 2016 中实现时态表。我们正在创建一个数据仓库并开发类型 2 缓慢变化的维度表。

对于 BeginDate,我们希望它取决于交易日期而不是当前的 getdate 时间。我们正在重新处理交易历史记录。下面的示例中,客户具有健身房或银行状态,并且根据交易日期从不活动状态变为活动状态或待处理状态。

我们目前有这个。

CREATE TABLE dbo.Department
(
    CustomerId int primary key,
    MembershipStatus int,
    TransactionDate datetime
 );
Run Code Online (Sandbox Code Playgroud)

我们想创建一个这样的表。

CREATE TABLE dbo.DepartmentHistory
(
    CustomerId int primary key,
    MembershipStatus int,
    TransactionDate datetime,
    BeginDatetime datetime,
    EndDatettime datetime
 );
Run Code Online (Sandbox Code Playgroud)

示例用法如下:

  1. 2018 年 3 月 5 日的第一笔客户交易为待处理 P
    +------------+--------+------------+---------+
    | 客户 ID | 状态 | 开始日期 | 结束日期 |
    +------------+--------+------------+---------+
    | 1 | 普 | 2018 年 3 月 5 日 | 空|
    +------------+--------+------------+---------+
  1. 第二笔交易是 2018 年 …

sql-server temporal-tables sql-server-2016

5
推荐指数
1
解决办法
2931
查看次数

从 Powershell 连接到 DAC 时,错误日志中出现“最大数量‘1’专用管理员连接已存在”消息

我正在通过 PowerShell 的专用管理员连接 (DAC) 连接到 SQL Server(2016 和 2017 最新版本)。

SQL Server 错误日志中记录以下错误消息:

日期 2019 年 4 月 2 日下午 1:59:13 记录 SQL Server(当前 - 2019 年 4 月 2 日下午 1:59:00)

源登录

消息
无法连接,因为已存在最大数量“1”的专用管理员连接。在建立新连接之前,必须通过注销或结束进程来删除现有的专用管理员连接。[客户端:127.0.0.1]

查询成功运行。已经尝试了许多连接字符串管理迭代;这是迄今为止最强大的。

Stack Exchange 上有一个解决方案,该解决方案涉及在关闭连接之前终止 spid,但这也会向 SQL Server 错误日志中抛出一条令人讨厌的消息,因此没有什么乐趣。

检查sys.dm_exec_sessions没有发现任何有趣的事情;使用此技术,没有连接保持打开状态。下面的 PowerShell 有一个虚拟查询,我无法谈论为什么我们要以这种方式连接,因为它是专有的,但它是 100% 必要的,它是一个非常快速的连接,我需要每 10 次执行一次分钟。

这个错误只是噪音。DAC 查询按预期运行和工作。

即使在静止的系统上重新启动,每次都会记录该错误。没有其他 DAC 连接正在使用 - 如果有,Powershell 会在命令提示符处抛出明显的错误消息。

有趣的是,当使用 时sqlcmd,SQL Server 错误日志中不会记录任何错误消息。

#begin powershell script
$SqlServerName = "server\instance"

$DbQuery = "
INSERT INTO  master.dbo.sometable(value1,value2) …
Run Code Online (Sandbox Code Playgroud)

sql-server powershell sql-server-2016 sql-server-2017 dac

5
推荐指数
1
解决办法
2592
查看次数

SQL SERVER:使用命名默认约束创建表

我想创建一个带有字段默认约束的表。我知道我可以在创建表后添加约束,但我需要在一个命令中创建表和指定的默认约束,如下所示

create table table1(field1 varchar(25), constraint df_table1_field1 default('a') for field1)

不幸的是,这不起作用。

有什么建议么?

sql-server sql-server-2016

5
推荐指数
1
解决办法
2172
查看次数

SQL Server 服务 - 未自动启动,“系统找不到指定的文件”,但手动启动正常

这是一个奇怪的问题,我已经没有办法解决这个问题了。这就是问题所在,这是我能总结的最好的。

\n

当 SQL Server 引擎和代理服务设置为“自动”时,服务器首次启动时不会启动。查看事件查看器,发现以下错误:

\n
\n

由于以下错误,MSSQLSERVER 服务无法启动:\n系统找不到指定的文件。

\n
\n

但是,如果我在启动后进入服务并手动启动服务,它们就会毫无问题地开始运行。更令人困惑的是,这并不限于单个服务器。如果有帮助的话,它们都是集群/AG 的一部分。

\n

翻阅了一些不同的网站和帖子,这是我的比较:

\n

https://blog.sqlauthority.com/2020/01/16/sql-server-event-id-7000-the-system-cannot-find-the-file-specified/

\n
\n

这与我们在事件日志中看到的错误相同。当我查看服务的属性时,我发现 \xe2\x80\x9cPath toexecutable\xe2\x80\x9d 中提到的路径是无效路径。

\n
\n

不适用于此处。我可以手动启动服务,并且服务和注册表中的路径是正确的。

\n

正在使用域帐户(不是 gMSA),并且密码设置正确。

\n

sql-server sql-server-2016

5
推荐指数
1
解决办法
2694
查看次数

门号 1、2 或 3?...安全更改、错误或从 SQL Server 2016 就地升级到 SQL Server 2019 的升级失败?

我做了什么:

ServerA最近,我测试了在运行 SQL Server 2016 (SP 2 CU17) 标准版到 SQL Server 2019 标准版的开发服务器上进行就地升级。(我知道这不是进行升级的首选方法,但同样只是在开发服务器上进行测试,所以没有坏处。)

在安装向导过程中,其中一个步骤挂起很长时间,因此我的同事单击“下一步”按钮跳过该步骤。我不太记得那是哪一步,但我相信它是产品更新或安装设置文件步骤。我记得接下来它说它跳过了几种不同类型的下载。剩下的安装一切顺利,顺利完成。

我能够启动实例、登录并访问我们的数据库。然后,我将数据库兼容级别提高到 150(SQL Server 2019 的兼容级别)。我运行了一些性能测试查询,然后最终决定打开旧基数估计器。到目前为止一切似乎都正常。

发生的事情是:

然后我注意到 上有一些有趣的事情ServerB,这是另一台已经运行 SQL Server 2019 的开发服务器,并且有一个指向 的链接服务器设置ServerA。一切都运行良好ServerB,除了任何跨链接服务器引用视图的查询,ServerA该视图在其中使用架构绑定标量函数。我收到错误The EXECUTE permission was denied on the object 'MyFunction', database 'Database1OnServerA', schema 'dbo'。如果我返回ServerA并更改该函数并WITH SCHEMABINDING注释掉该行,则ServerB可以从再次引用该函数的视图中进行选择。

附加信息:

链接服务器对象中使用的帐户是一个 SQL Server 登录帐户ServerA,只有映射db_datareader到它的角色(当然除了数据库角色之外)。没有对其设置额外的细粒度权限,并且也仅分配有服务器角色。Database1ServerAPublicPublic

有趣的是,我的问题的另一种解决方案是向链接服务器帐户或专门授予链接服务器帐户的EXECUTE权限。但在升级到 SQL …

sql-server upgrade linked-server sql-server-2016 sql-server-2019

5
推荐指数
1
解决办法
227
查看次数

服务器重新启动后查询存储强制计划是否仍然存在?

想问一下,因为找不到这个信息。

服务器重新启动后查询存储强制计划是否仍然存在?

在哪些情况下,通过查询存储强制执行的计划不会保持有效?

sql-server sql-server-2016 query-store

5
推荐指数
1
解决办法
714
查看次数