小编Mar*_*uth的帖子

无法删除没有关联文件的文件组

我在 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)

sql-server filegroups sql-server-2017

9
推荐指数
2
解决办法
5408
查看次数

连接条件与 WHERE...它会产生性能差异吗?

我养成了将连接条件与其他附加条件分开的习惯。不过我理解逻辑执行顺序是:

  1. 在哪里

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 行以上(格式化),我会尝试尽快减少结果集,通常使用派生表,并在到达连接之前添加一个额外的位置。

performance join sql-server

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

防止用户创建没有名称的约束或索引

我已经做了一些搜索,但还没有找到解决我的问题的方法。

我从一些用户不关心命名 PK 约束、外键或索引的数据库开始,最后使用系统生成的名称,如PK__CarRenta__3213E83F2E5BD364. 在mssqltips上,Aaron Bertrand 发表了一篇很棒的文章,介绍了如何使用存储过程重命名这些对象。

太好了……但是我如何避免用户或应用程序创建没有名称的新对象,然后由 SQL Server 为其分配系统生成的名称?

我已经阅读了同一个伟大的 Aaron Bertrand撰写的关于如何使用基于策略的管理来强制执行命名约定的文章。然而,这似乎只适用于在马已经螺栓(或对象已经创建)之后的通知。

您能想出一种方法来自动回滚尝试创建没有名称的对象的语句吗?

sql-server policy-based-management sql-server-2017

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

如何关闭“启用软件使用指标”和 ESENT 错误的日志记录

我在具有两个节点的故障转移群集(单实例群集)中运行 SQL Server 2017 Standard CU 5。我按照 2本手册停用CEIP又名间谍软件功能:

  • CEIP 服务被禁用并停止,
  • 从集群中删除的 CEIP 角色
  • 并且所有关于 CustomerFeedback 和 EnableErrorReporting 的注册表项都设置为 0。

但是我仍然收到消息“软件使用指标已启用”。在服务重新启动后的 SQL Server 错误日志中。此外,在我的 Windows 事件日志中,ESENT 经常出现如下错误:

ESENT 错误访问被拒绝

一篇针对此问题的MS 知识库文章。但是它是针对 SQL Server 2012 的。它说这个错误与“软件使用指标功能”有关。我已经按照建议为 SQL Server 服务帐户授予权限。但是,错误消息不断出现,无论如何我都不希望 Microsoft 收集数据。

以下是我的问题:

  1. 这是与 CEIP 或其他东西相同的功能吗?
  2. 如何正确停用软件使用指标?

sql-server setup sql-server-2017

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

用于在 SQL Server 中的聚集索引上生成页锁的示例查询/DDL(无提示)

我们目前有一些ALLOW_PAGELOCKS设置为关闭的索引。这样做大概是为了减少死锁。但是,我怀疑当时它真的会产生影响。

现在我试图了解 SQL Server 何时实际选择开始锁定页面而不是聚集索引中的键。我最近问过 Jonathan Keyhaisas,他告诉我如果我在多个后续页面上触摸行,就会发生这种情况。但是,我没有通过使用示例查询更新聚集索引中的行来获得任何独占页面锁。

你能通过示例查询和表帮助我更好地理解页锁吗?我正在运行 SQL Server 2008 SP4。

提前致谢

马丁

sql-server-2008 sql-server locking

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

创建表/索引时如何强制用户指定文件组

我很快将迁移到 SQL Server 2017,因此我正在努力美化我们数据库中一些被忽视的方面。一方面是文件组:我的 DBA 前任创建了多个文件组,但是没有人真正被告知大多数对象只是转到默认文件组 (PRIMARY)。

现在我想强制人们创建表和索引实际上命名他们的对象应该驻留的文件组。含义:没有“ON [Filegroup]”的 CREATE TABLE 或 CREATE INDEX 应该回滚,并显示文件组丢失的错误。有什么方法可以做到这一点,您会建议继续采用这种方法吗?我刚刚发现基于策略的管理无法阻止在默认文件组上创建对象。

这样做的要点是,someboy 应该首先为对象选择文件组,而不是在默认文件组中创建它们,然后必须根据 DBA 的咆哮移动对象:-)。

我想过两种技术......但是由于缺少知识而无法开始使用它们中的任何一种:

  • 使用数据库触发器检查是否有 on 子句,如果没有回滚 --> 这似乎很脆弱,因为它取决于命令文本的文本分析
  • 使主文件组的大小非常小(100KB?),以便系统表仍然能够适应,但其他中等大小的表会导致错误,因为没有足够的空间-> 可能是一个坏主意,因为这可能对数据库可用性产生严重的副作用,并且在阻止在默认文件组中创建每个用户定义的表或索引方面不够精确

非常感谢您的帮助

马丁

sql-server filegroups sql-server-2017

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

SQL Server 版本:在标准版 2017 上备份还原企业版 2014

我知道,这类问题已经被回答过几次了,但我没有找到一些当前的答案,并且想知道 SQL Server Standard Edition 2016 SP1 是否在这方面做了一些改变,因为它支持企业版之前支持的所有“可编程性功能”仅有的。

我的具体场景如下:我有一个中央备份服务器,它将运行 SQL Server 2017 标准版,并定期恢复从其他 SQL Server 实例获取的新备份。大多数实例也将使用 SQL Server 2017 Standard...但是有一个数据仓库运行 SQL Server 2014 Enterprise Edition。

  • 是否可以在 SQL Server 2017标准版实例上还原从 SQL Server 2014企业版实例获取的备份,或者这是否会导致有关企业版功能的错误?
  • 有什么方法可以免费试用吗?SQL Server 评估版相当于企业版,不是吗?微软现在是否引入了一种将开发人员和评估许可证降级到 SQL Server 标准版功能的方法?

预先非常感谢您的协助

sql-server restore standard-edition enterprise-edition

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