当我查看生产 SQL Server 2016 的服务器日志时,我看到多个条目:
[信息] 数据库 ID:[5]。正在删除不可恢复的检查点表行(id:294)。
对于每个条目,末尾的 id 加 1。
我用谷歌搜索了这个错误,实际上没有任何关于它的信息。这个条目是什么意思?听起来相当不祥。
我在 SQL Server 2016 Standard 上有一个 2 节点群集,并配置了动态仲裁的故障转移群集。
有件事让我很困惑:在这种情况下我们真的需要见证人吗?
由于我启用了动态仲裁,因此如果其中一个节点出现故障,我的集群也不会出现故障。
但有些人说,为了最佳实践,我们仍然需要配置一个见证人。所以我的问题是:见证人会有什么不同吗?
当我尝试创建/更改视图来创建这样的索引时
\nCREATE UNIQUE CLUSTERED INDEX IDX_vSalPopulation\n ON sfdc.vSalPopulation (ID);\nRun Code Online (Sandbox Code Playgroud)\n我收到以下错误消息
\n\n\n消息 1938,级别 16,状态 1,第 40 行 无法在视图\n\'vSalPopulation\' 上创建索引,因为基础对象 \'YR_TRM_SBTRM_TABLE\'\n 具有不同的所有者。
\n
当我检查表时,我发现这些表由不同的模式拥有
\nexec sp_tables \'dbo.YR_TRM_SBTRM_TABLE\'\nexec sp_tables \'vSalPopulation\'\nRun Code Online (Sandbox Code Playgroud)\n\n\nRun Code Online (Sandbox Code Playgroud)\nTABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS\nMyDB dbo YR_TRM_SBTRM_TABLE TABLE NULL \nMyDB sfdc vSalPopulation VIEW NULL\n
有关索引视图的文档指出,您不能拥有引用两个不同数据库的索引视图。
\nWITH SCHEMABINDING选项创建视图。但是,我有相同的数据库,但有两个不同的架构。也许问题实际上是第三个要求?虽然我没有引用其他视图,但还是有函数的。也许我误解了错误消息。权限?那么,一般来说,是否可以有一个索引视图来引用来自两个不同模式的对象?
\n给我同样错误的视图的简化定义如下所示
\nALTER VIEW sfdc.vSalPopulation\n WITH SCHEMABINDING \nAS\nSELECT DISTINCT\n ID\nFROM …Run Code Online (Sandbox Code Playgroud) sql-server clustered-index materialized-view sql-server-2016
我有一个查询,它与 8 的 MAXDOP 并行运行。当我查看时,sp_who2我看到相同的会话 ID 使用不同的连接 ID 重复多次(> 8)。
我使用了下面的查询,看到等待类型仍然是 CXCONSUMER 等待类型。但我看到 130 个不同的 exec_context id。
SELECT
dot.session_id,
dot.exec_context_id,
dot.task_state,
dowt.wait_type,
dowt.wait_duration_ms,
dowt.blocking_session_id,
dowt.resource_description
FROM sys.dm_os_tasks dot
LEFT JOIN sys.dm_os_waiting_tasks dowt
ON dowt.exec_context_id = dot.exec_context_id
AND dowt.session_id = dot.session_id
WHERE dot.session_id = 96
ORDER BY exec_context_id;
Run Code Online (Sandbox Code Playgroud)
如果查询并行运行,当我将负载分配到不同的工作线程时,它是否具有不同的 spid。?
看了肯德拉·利特尔 (Kendra Little) 的文章。非常有帮助的一个。
我使用查询来查看并行处理查询中使用的不同调度程序。
我看到多次使用相同的shcheduler_id/worker地址。这正常吗?
我的 MAXDOP 也是 4,但我看到 5 个不同的 scheduler_ids,这很奇怪。
我找不到任何相关的东西listing the installed features in sql server 2016。
我可以手动查看日志 - 根据下面的信息,但我想自动化它。
安装 SQL Server 2016 后,我得到一个日志文件 - 位于以下文件夹中的某处:
C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\Log\20200109_205540
名称以Summary_+开头的文件my_server_name
在该文件中,除其他外,我可以找到已安装的 Sql Server 功能列表:

安装后,稍后当系统已在使用时,应用登录和权限,修复防火墙等。
有没有一种简单的方法来获取安装在 sql server 实例上的功能列表?
可疑表有 299 个 nvarchar(max) 列、1 个整数列和 1 个 nvarchar(255) 列。请不要问我为什么,这是第 3 方供应商数据库。无论如何,根据我的数学计算,在最坏的情况下,我们应该在 8060 限制范围内:
24x299 + 4 + 510 = 7690
在使用供应商的导入工具的导入过程中,从外部源插入失败并出现上述错误。我在计算中遗漏了什么吗?11842 可能来自哪里?有任何想法吗?
谢谢!
我正在研究一种解决方案,该解决方案将允许刷新报告表,从而可能让用户在需要刷新时读取它。有没有人实现了这样一种方法,而无需在刷新时终止用户与该表的连接?
AdventureWorks 中的以下简单查询:
SELECT *
FROM Person.Person p
JOIN HumanResources.Employee e
ON p.BusinessEntityID = e.BusinessEntityID
Run Code Online (Sandbox Code Playgroud)
给出以下执行计划:
如果我查看上面的计划,我可以看到索引扫描和索引搜索都(正确)估计了 290 行,但是,连接两者的估计循环运算符估计了 279 行。
旧的估计器也正确地猜测了搜索和扫描中的 290 行,但嵌套循环估计了 289 行,在这个查询的情况下这是一个更好的估计。
那么在新 CE 的情况下,优化器估计当它连接索引扫描中的 290 行和索引查找中的 290 行时,是否会有 11 行不匹配?
它使用什么方法/公式来进行这个估计?
我所说的任何方法都是正确的,它已经从早期的 CE 版本改变了,因为它做出了不同的估计?
我意识到新 CE 的“坏”估计不足以损害性能,我只是想了解估计器处理
现在,我知道日志在大删除过程中会变大,应该尝试将其分成几批。但我觉得这种情况很奇怪,如果有人能向我解释,那就太好了!
我有一个 27GB 的数据库和大约 30GB 的日志。被删除的表大小约为 15GB,其中有 2000 万条记录。该表有 20 列,只有 bigint 和 int 数据类型。
删除操作是从相关表中删除 1800 万条重复记录。我已切换选择进行删除以确保记录计数匹配并且确实如此。
在我用完磁盘空间并被迫回滚之前,日志增长到大约 110GB。
表上没有触发器,只有16个非聚集索引,没有聚集索引。如果我在运行操作之前禁用所有索引,它会完成而不会从原始大小增加日志。
所以我的问题是,从表中删除时,我是否记录了每个索引的每次删除?如果是这样,这是正常行为还是可能是因为缺少聚集索引?
昨天我收到一封来自我们的供应商的邮件,提到他们的应用程序存在性能问题。
我还不知道问题是什么,但他们提出的解决方案是缩小数据库(因为有很多可用空间)。据我所知,这不会导致性能改进,但显然他们在其他客户申请时使用这种方法取得了成功。
我认为缩小发生的方式是将页面从文件的后面移动到前面,就像这样压缩数据库并导致大量碎片。
范围扫描是否有可能利用压缩数据库?
或者还有其他一些边缘情况可以从缩小数据库中受益吗?
sql-server-2016 ×10
sql-server ×7
performance ×2
automation ×1
checkpoint ×1
clustering ×1
delete ×1
errors ×1
failover ×1
installation ×1
logs ×1
parallelism ×1
replication ×1
windows ×1