标签: sql-server

将文章添加到事务发布而不生成新快照

使用带有拉取订阅者的 SQL 2008 R2 事务复制,当我们添加一篇文章时,我想避免创建整个快照(数据库约为 80 GB,因此这需要几个小时)。

从这篇文章 中,我已经看到了如何通过关闭即时同步来使用部分快照来做到这一点,但这对我们不起作用。

理想情况下,我只想将它作为我们的 db 脚本的一部分运行来创建表,所以如果我们想要复制它,我们会这样做:

Create Table ...    
sp_addArticle ...    
sp_PushThisToOurSubscribersNow    
Run Code Online (Sandbox Code Playgroud)

replication sql-server sql-server-2008-r2

27
推荐指数
4
解决办法
5万
查看次数

删除所有(1200 万)条记录后,SQL Server“空表”变慢了?

我有一个大约有 150 列的 SQL Server 2008 实例。我之前在这个表中填充了大约 1200 万个条目,但此后清除了该表以准备新的数据集。

但是,曾经在空表上立即运行的命令,例如count(*)和select top 1000inSQL Management Studio现在需要花费大量时间才能运行。

SELECT COUNT(*) FROM TABLE_NAME 
Run Code Online (Sandbox Code Playgroud)

花了 11 多分钟才返回 0,SELECT TOP 1000花了将近 10 分钟才返回一张空桌子。

我还注意到我硬盘上的可用空间实际上已经消失了(从大约 100G 减少到 20G)。之间发生的唯一事情是我运行的一个查询:

DELETE FROM TABLE_NAME
Run Code Online (Sandbox Code Playgroud)

这世界到底怎么回事?!?

sql-server-2008 sql-server

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

与事务结合触发

假设我们有以下情况:

我们有一张桌子(比方说Table_A),它有一个触发器INSERT。触发器作业是table_B根据 中插入的值更新 中的某些行table_A。

现在,当我们简单地在表中插入一行时一切正常,但是我们通过事务插入数据的情况呢?触发器会等到所有事务语句成功运行,还是会在识别到插入时触发?。如果触发器在识别出第一个插入时立即触发,如果事务在最后一行失败会发生什么?这种情况有什么机制吗?

trigger sql-server transaction

27
推荐指数
1
解决办法
3万
查看次数

要安全地重新启动托管 Microsoft SQL Server 的计算机,需要执行哪些步骤?

在重新启动承载 MS SQL Server 实例的服务器时,是否需要采取任何特殊步骤来防止数据损坏?

比如最近遇到了手动停止SQL服务的建议。我的理解是,这是由 Windowsshutdown进程处理的。

我敢肯定,个人可能会推荐无数个步骤,就像我刚刚提到的那样,但我想避免重复过时或迷信的做法。Microsoft 或广泛的行业标准是否有任何建议?


这个问题与重启机器的短期程序有关。还有另一个问题是关于在永久关闭机器之前确保机器未被使用的长期程序。

sql-server best-practices shutdown

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

SQL Server 返回“将表达式转换为 int 数据类型时出现算术溢出错误”。

当我运行此命令时 SUM()

SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;
Run Code Online (Sandbox Code Playgroud)

我越来越,

Arithmetic overflow error converting expression to data type int.
Run Code Online (Sandbox Code Playgroud)

关于它的原因是什么的任何想法?

我只是按照这个答案中的说明进行操作。

sql-server aggregate datatypes sql-server-2017

27
推荐指数
2
解决办法
10万
查看次数

SQL Server 定期清除计划缓存和执行统计信息

将 SQL Server 2014 升级到 2016 后,服务器每隔几个小时就会不断重置缓存的执行计划和dm*视图(如dm_exec_query_stats)等

至于如果有人执行DBCC FREEPROCCACHE和DBCC DROPCLEANBUFFERS手动(除了没人做,它会自动发生)。

同一个数据库在 SQL Server 2014 和 Windows Server 2012 上运行良好,但在迁移到 SQL Server 2016(和 Windows Server 2016)后事情就变糟了

事情我检查:数据库并没有具备“自动关闭”标志。SQL 服务器ad hoc optimized设置为true(我认为它会有所帮助,但它没有)。“查询存储”为“关闭”。服务器有 16 GB 内存。

“SQL Server 日志”中也没有任何帮助。只是每周备份消息...

我还检查了这篇文章https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-set-options(向下滚动到“示例”部分,就在上面它)有自动清除计划的情况列表。这些都不适用。

更新:

不幸的是,这些建议都没有帮助。授予 LPIM 权限,检测和修复为同一查询生成大量计划的非参数化查询,降低“最大服务器内存”......计划不断随机重置,从每几个小时到每 5-10 分钟。如果服务器“处于内存压力之下”,为什么 2014 版本在同一台机器上运行良好。

这是请求的 sp_Blitz 输出

**Priority 10: Performance**:

- Query Store Disabled - The new SQL Server 2016 Query …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016

27
推荐指数
2
解决办法
1万
查看次数

什么是“部分匹配索引”?

我正在尝试了解有关 SQL Server 2016 中引入的“外键引用检查”查询计划运算符的更多信息。关于它的信息并不多。微软在这里宣布了它,我在这里发表了关于它的博客。通过从具有 254 个或更多传入外键引用的父表中删除一行,可以看到新的运算符:dbfiddle link。

操作员详细信息中显示了三种不同的计数:

FK检查详情

  • 外键引用计数是传入外键的数量。
  • No matching Indexes Count是没有合适索引的传入外键的数量。验证更新或删除的表不会违反该约束将需要扫描子表。
  • 我不知道Partial Matching Indexes Count代表什么。

在这种情况下什么是部分匹配索引?我无法使以下任何一项工作:

  • 过滤索引
  • 将外键列作为INCLUDE索引列
  • 以外键列作为第二键列的索引
  • 多列外键的单列索引
  • 创建多个覆盖索引以启用多列外键的“索引连接”计划

Dan Guzman指出,即使索引键与外键列的顺序不同,多列外键也可以匹配索引。他的代码在这里,以防有人能够使用它作为起点来找出更多关于部分匹配索引的信息。

index foreign-key sql-server sql-server-2016

27
推荐指数
2
解决办法
1725
查看次数

在整个数据库中更改 GETDATE() 的使用

我需要将本地 SQL Server 2017 数据库迁移到 Azure SQL 数据库,但我面临着一些挑战,因为要克服很多限制。

特别是,由于 Azure SQL 数据库仅在 UTC 时间(无时区)下工作,而我们需要本地时间,因此我们必须更改数据库中GETDATE() 各处的使用,事实证明,这比我预期的要多。

我创建了一个用户定义的函数来获取适合我的时区的本地时间:

CREATE FUNCTION [dbo].[getlocaldate]()
RETURNS datetime
AS
BEGIN
    DECLARE @D datetimeoffset;
    SET @D = CONVERT(datetimeoffset, SYSDATETIMEOFFSET()) AT TIME ZONE 'Pacific SA Standard Time';
    RETURN(CONVERT(datetime,@D));
END
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是GETDATE()在每个视图、存储过程、计算列、默认值、其他约束等中实际更改此函数。

实施此更改的最佳方法是什么?

我们正处于托管实例的公共预览版中。它仍然有同样的问题GETDATE(),所以它对这个问题没有帮助。迁移到 Azure 是一项要求。这个数据库总是在这个时区使用(并将被使用)。

sql-server azure-sql-database sql-server-2017

27
推荐指数
4
解决办法
1万
查看次数

授予文件系统访问 SQLSERVERAGENT 虚拟帐户的权限

我正在尝试NT Service\SQLSERVERAGENT根据此问题中的标记答案授予Windows 帐户文件系统访问权限。我相信这是一个虚拟服务帐户,它不会显示在控制面板 -> 用户帐户区域中。

如何授予此服务帐户访问文件系统的权限?具体来说,在 Windows 7 上。

我已经阅读了几种方法,但似乎没有一种方法适合我。我尝试了 PowerShell 方法,但 AD 命令不是有效命令。我什至下载并安装了这些命令所需的 Windows 补丁。我还了解到我应该能够通过 SQL Server 配置管理器或 Management Studio 执行此操作。不过,我似乎无法弄清楚在哪里调整这些权限。

SQL Server 代理进程无法启动,并显示以下错误消息:

Login failed for user 'NT SERVICE\SQLSERVERAGENT'.  
Reason: Failed to open the explicitly specified database 'msdb'.  
[CLIENT: <local machine>]
Run Code Online (Sandbox Code Playgroud)

根据我的谷歌搜索,它与此帐户的权限有关。

我不确定数据库是否已损坏,但它说数据库处于正常状态。SQL Server 代理登录是sysadmin和public组的一部分。

sql-server permissions sql-server-agent

26
推荐指数
1
解决办法
8万
查看次数

由于“XTP_CHECKPOINT”,数据库“database_name”的事务日志已满

我有一个关于XTP_CHECKPOINT.

我使用的是 SQL Server 2014。我有一个处于 SIMPLE 恢复模式模式的数据库。它也在被复制。

没有未结交易。我跑了DBCC OPENTRAN,它返回:

“没有活跃的未结交易。”

但是每当我尝试创建或删除表或删除数据时,我都会收到此消息:(
我已将实际数据库名称替换为单词database_name)

“由于 'XTP_CHECKPOINT',数据库 'database_name' 的事务日志已满”

有谁知道为什么会发生这种情况,更重要的是,我怎样才能让它停止?

是的,数据库确实处于 SIMPLE 恢复模式模式。即事务日志应自动截断。

顺便说一句,我在完全恢复模式下的另一个数据库做了同样的事情,开始返回相同的错误:

由于“XTP_CHECKPOINT”,数据库“database_name”的事务日志已满

我试图将日志增长设置更改为无限增长,但它不会让我返回相同的错误。

除了文件组之外,我可以在没有任何 XTP 内容的情况下重现该问题。方法如下:http : //pastebin.com/jWSiEU9U

sql-server transaction-log sql-server-2014 memory-optimized-tables

26
推荐指数
3
解决办法
2万
查看次数