我在 SQL Server 2017 CU3 上遇到一些奇怪的错误消息。我正在迁移数据库并重新组织文件组。“重组”是指我使用存储过程在新文件组上为对象创建分区函数和分区方案,在分区时重建索引,然后删除分区。
最后我有一些空的文件组。他们的文件被删除。文件组本身也被删除。这在大多数情况下效果很好。但是,对于两个数据库,我删除了文件...留下了一个没有关联文件的文件组,但是
ALTER DATABASE REMOVE FILEGROUP
Run Code Online (Sandbox Code Playgroud)
抛出错误 5042:
无法删除文件组“xyz”,因为它不为空。
我怎样才能摆脱那个空的文件组......可能是什么问题?
我已经阅读了一些常见问题,但是它们在我的系统中不存在:
检查:
SELECT * FROM sys.partition_schemes;
SELECT * FROM sys.partition_functions;
Run Code Online (Sandbox Code Playgroud)
0 行...数据库中没有剩余的分区对象
UPDATE STATISTICS 对于数据库中的所有对象
没有效果
检查文件组上的索引:
SELECT * FROM sys.data_spaces ds
INNER JOIN sys.indexes i
ON ds.data_space_id = i.data_space_id
WHERE ds.name = 'xyz'
Run Code Online (Sandbox Code Playgroud)
0 行
检查文件组中的对象:
SELECT
au.*,
ds.name AS [data_space_name],
ds.type AS [data_space_type],
p.rows,
o.name AS [object_name]
FROM sys.allocation_units au
INNER JOIN sys.data_spaces ds …Run Code Online (Sandbox Code Playgroud)我养成了将连接条件与其他附加条件分开的习惯。不过我理解逻辑执行顺序是:
where如果我在子句中而不是子句中添加附加条件,是否会对性能产生不利影响join?或者这通常是在查询优化阶段得到简化和同等处理的部分?
以下是两个简单的示例查询,它们都返回相同的计划:
USE StackOverflow2010;
-- additional filters in where clause
SELECT TOP 500 p.id
FROM dbo.Posts p
INNER JOIN dbo.Votes v ON p.id = v.PostId
WHERE
v.VoteTypeId = 2
ORDER BY p.id
;
-- all criteria in on clause
SELECT TOP 500 p.id
FROM dbo.Posts p
INNER JOIN dbo.Votes v ON p.id = v.PostId AND v.VoteTypeId = 2
ORDER BY p.id
;
Run Code Online (Sandbox Code Playgroud)
我想补充一点,如果我编写较长的分析语句,通常跨越 100 行以上(格式化),我会尝试尽快减少结果集,通常使用派生表,并在到达连接之前添加一个额外的位置。
我已经做了一些搜索,但还没有找到解决我的问题的方法。
我从一些用户不关心命名 PK 约束、外键或索引的数据库开始,最后使用系统生成的名称,如PK__CarRenta__3213E83F2E5BD364. 在mssqltips上,Aaron Bertrand 发表了一篇很棒的文章,介绍了如何使用存储过程重命名这些对象。
太好了……但是我如何避免用户或应用程序创建没有名称的新对象,然后由 SQL Server 为其分配系统生成的名称?
我已经阅读了同一个伟大的 Aaron Bertrand撰写的关于如何使用基于策略的管理来强制执行命名约定的文章。然而,这似乎只适用于在马已经螺栓(或对象已经创建)之后的通知。
您能想出一种方法来自动回滚尝试创建没有名称的对象的语句吗?
我在具有两个节点的故障转移群集(单实例群集)中运行 SQL Server 2017 Standard CU 5。我按照这 2本手册停用CEIP又名间谍软件功能:
但是我仍然收到消息“软件使用指标已启用”。在服务重新启动后的 SQL Server 错误日志中。此外,在我的 Windows 事件日志中,ESENT 经常出现如下错误:
有一篇针对此问题的MS 知识库文章。但是它是针对 SQL Server 2012 的。它说这个错误与“软件使用指标功能”有关。我已经按照建议为 SQL Server 服务帐户授予权限。但是,错误消息不断出现,无论如何我都不希望 Microsoft 收集数据。
以下是我的问题:
我们目前有一些ALLOW_PAGELOCKS设置为关闭的索引。这样做大概是为了减少死锁。但是,我怀疑当时它真的会产生影响。
现在我试图了解 SQL Server 何时实际选择开始锁定页面而不是聚集索引中的键。我最近问过 Jonathan Keyhaisas,他告诉我如果我在多个后续页面上触摸行,就会发生这种情况。但是,我没有通过使用示例查询更新聚集索引中的行来获得任何独占页面锁。
你能通过示例查询和表帮助我更好地理解页锁吗?我正在运行 SQL Server 2008 SP4。
提前致谢
马丁
我很快将迁移到 SQL Server 2017,因此我正在努力美化我们数据库中一些被忽视的方面。一方面是文件组:我的 DBA 前任创建了多个文件组,但是没有人真正被告知大多数对象只是转到默认文件组 (PRIMARY)。
现在我想强制人们创建表和索引实际上命名他们的对象应该驻留的文件组。含义:没有“ON [Filegroup]”的 CREATE TABLE 或 CREATE INDEX 应该回滚,并显示文件组丢失的错误。有什么方法可以做到这一点,您会建议继续采用这种方法吗?我刚刚发现基于策略的管理无法阻止在默认文件组上创建对象。
这样做的要点是,someboy 应该首先为对象选择文件组,而不是在默认文件组中创建它们,然后必须根据 DBA 的咆哮移动对象:-)。
我想过两种技术......但是由于缺少知识而无法开始使用它们中的任何一种:
非常感谢您的帮助
马丁
我知道,这类问题已经被回答过几次了,但我没有找到一些当前的答案,并且想知道 SQL Server Standard Edition 2016 SP1 是否在这方面做了一些改变,因为它支持企业版之前支持的所有“可编程性功能”仅有的。
我的具体场景如下:我有一个中央备份服务器,它将运行 SQL Server 2017 标准版,并定期恢复从其他 SQL Server 实例获取的新备份。大多数实例也将使用 SQL Server 2017 Standard...但是有一个数据仓库运行 SQL Server 2014 Enterprise Edition。
预先非常感谢您的协助