标签: sql-server

除了清除计划缓存和(显然)更改内存设置之外,更改 Max Server Memory 还能做什么?

在 32 GB 内存和 4 个内核、60-80 个并发连接、大量临时工作负载上运行 SQL Server 2012 SP3,我们看到 SQL Server 进程 (CPU) 出现峰值,并且在不可预测的时间每天保持一两次峰值。我们正在努力确定峰值的根本原因。与此同时,我们发现改变最大内存设置(向上或向下)似乎是唯一能让 CPU 负载恢复正常的方法。

检查日志并搜索 StackExchange ( https://dba.stackexchange.com/a/183276 ),我们看到计划缓存正在通过更改最大内存设置进行刷新。但是,如果我们通过 DBCC FREESYSTEMCACHE('SQL Plans') 刷新计划缓存,则 CPU 负载不会恢复正常。

由于无论天气如何增加或减少它,更改最大内存设置都可以解决问题,因此该问题似乎与最大服务器内存设置没有直接关系。因此,我们试图了解更改内存设置还有什么作用,然后使用该信息来帮助确定 CPU 峰值的根本原因。

performance sql-server

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

Intellisense SSMS 2017 中的自动完成功能。它去哪儿了?

我最近得到了一个新的开发箱,安装了我的 Visual Studio。安装了我的 SSMS。开始编写一些过程和表格......没有智能感知帮助。

哇??

所有的框都打勾。我在正确的数据库中。如果表不存在,我会得到红色波浪线,但我没有完成对象名称的弹出窗口。我肯定搞砸了一些事情,因为我的谷歌搜索告诉我 2017 年的智能感知能力有了很大提高。

2018 年 11 月 6 日更新

我删除了我自己的答案,说缓存是罪魁祸首,因为它在允许和不允许自动完成的内容上似乎仍然非常不稳定。我可以跳回到较早版本的 SMSS 并获得在此版本之前我习惯的那种活泼的结果。

我已经开始使用Azure Data Studio处理日常事务。它超级活泼。许多 QoL 改进。甚至还没有接近足够的服务器管理功能,但对于一般的 proc 编写和数据分析来说要好得多。

sql-server ssms

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

如果存储过程在 TRY / CATCH 中失败,则未设置输出参数

在 SQL Server 2008 中(但也在 2014 年)。让我们考虑一个具有输出参数的过程。此过程可能会产生错误(并且会在以下示例中产生)。我注意到如果我们在TRY/CATCH块中调用过程,输出参数的行为是不一样的。

例子:

create procedure test_output @result varchar(10) output
as
begin
    set @result = 'hello'
    raiserror('This is an error', 16,1)
    set @result = 'error'
end
Run Code Online (Sandbox Code Playgroud)

如果我们以简单的方式启动程序:

declare @res1 varchar(10)
exec test_output @result = @res1 out
print 'Result is: '+ isnull(@res1, 'empty')
Run Code Online (Sandbox Code Playgroud)

我们得到(我很好):

Msg 50000, Level 16, State 1, Procedure test_output, Line 7 [Batch Start Line 12]
这是一个错误
结果是:错误

如果过程现在在 try/catch 块中:

declare @res2 varchar(10)
declare @error_message varchar(max)
begin try
    exec test_output …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql parameter error-handling

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

使用 FILESTREAM 文件组备份和恢复 SQL 服务器数据库

我使用 SQL Server 并且有一个包含两个文件组的巨大数据库:

  • Primary : 包含除大文件 (1MB+) 之外的所有数据
  • FILESTREAM(读/写):其中包含大文件

现在,备份方案是:

  • 每个星期五获得完整备份(凌晨 2 点)
  • 每周除周五外的每一天都获得差异备份(凌晨 2 点)

由于数据库很大,并且在远程服务器上生产,因此每当我想将数据库带到本地环境以创建测试数据库(每周一次)时,我必须同时携带主数据库和文件流。

我希望能够更改备份和还原的完成方式,只需引入主文件组,而忽略文件流。通过这种方式,每周我只会带来主要文件组,而不是所有假设文件流的信息。

我认为可能存在很多问题,并且在访问文件时所有文件流引用都可能丢失。我想知道是否可以在执行备份时修改所有文件流列的内容,或者使用测试环境中托管的不同文件流。此外,我只听说过一些文件组的零碎还原,但我对如何执行它有很多疑问。

问题1:我可以有这个场景吗?

问题 2:只有一个完整备份并将差异备份/事务日志带入测试环境是个好主意吗?

问题 3:我可以有更好的场景来备份和恢复吗?

我全神贯注于建议。如果您有任何示例案例,请向我展示 T-SQL 查询。

sql-server backup restore filestream

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

从生产中的表中删除列

我们有一种情况需要将 2 个表之间的关系从m:1更改为m:n

因此,我们需要在这两个表之间创建一个交叉引用表。

将所有现有数据从“子”表迁移到交叉引用表后,删除子表中的原始外键列是否是一个坏主意?

如果我们把它留在那里,我们基本上就有了技术债务。但我不是 dba 并且不能很好地理解从表中删除列的含义。(我知道这是可能的,但这是一个坏主意吗?我的数据库会因此讨厌我吗?)

谢谢

database-design sql-server

8
推荐指数
2
解决办法
1727
查看次数

SQL Server 不能将 NULL 存储在固定长度的列中吗?

我在Oracle 官方文档中看到了这个声明:

在 Microsoft SQL Server 中,只有具有可变长度数据类型的列才能存储 NULL 值。当您创建一个允许 NULL 具有固定长度数据类型的列时,该列会自动转换为系统可变长度数据类型...

我从来没有在SQL Server 文档中读到过这个,也没有经历过这样的事情。相反:在 SQL Server 中,固定长度的数据类型(例如 int 和 float,还有 char)被大量使用并且即使在可为 NULL 的情况下也非常有效地存储。

这个 Oracle 声明背后有什么理由吗?!

null oracle sql-server storage

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

从表返回的重复记录没有重复

我有一个存储过程,用于查询用于在我们的系统中分配工作的繁忙队列表。有问题的表在 WorkID 上有一个主键,没有重复项。

查询的简化版本是:

INSERT INTO #TempWorkIDs (WorkID)
SELECT
        W.WorkID

    FROM
        dbo.WorkTable W

    WHERE
        (@bool_param = 0 AND
        ((W.InProgress = 0
         AND ISNULL(W.UserID, -1) != @userid_param
         AND (@bool_filtered = 0
              OR W.TypeID IN (SELECT TypeID FROM #Types AS t)))
         OR 
         (@bool_param = 1
          AND W.InProgress = 1
          AND W.UserID != @userid_param)
        OR
        (@Auto_Param = 0
         AND W.UserID = @userid_param)))
         OR
         (@bool_param = 1 AND W.UserID = @userid_param)
    OPTION
        (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)

#Types表在过程中较早地填充。

正如我所说,WorkTable很忙,有时在此查询运行时,我怀疑其中一条记录正在从一组过滤器移动到另一组过滤器WHERE。具体来说,当有人开始处理一个项目,并且W.InProgress …

sql-server duplication sql-server-2008-r2 isolation-level

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

列出所有节点的所有父节点/上升节点

我有以下结构:

示例树:

树状图

示例表:

    [table]

    id  parent
    ----------
    1   NULL
    2   1
    3   1
    4   2
    5   2
    6   2
    7   3
    8   4
Run Code Online (Sandbox Code Playgroud)

对于每个id,我想在单独的行中列出它的所有父母,包括它的后代。

期望输出:

    id  parent
    ----------
    1   NULL
    2   1
    3   1
    4   1
    4   2
    5   1
    5   2
    6   1
    6   2
    7   1
    7   3
    8   1
    8   2
    8   4
Run Code Online (Sandbox Code Playgroud)

我尝试使用 CTE,但我似乎无法理解它。

    with temp(id,parent) as (
    SELECT S.id, S.parent
    FROM [table] as S 

    UNION ALL
    
    SELECT S2.id, S2.parent
    FROM [table] as S2 …
Run Code Online (Sandbox Code Playgroud)

sql-server cte sql-server-2014

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

更改分区表主键列的数据类型

我目前很幸运有以下情况:

  • 我们有一个分区并使用主键类型的生产数据库 int
  • 多个 (~20) 表,每个表包含 > 100.000.000 行,其中 2 个接近 2.000.000.000 行
  • 这些表都有一个类型int为主键的列,每行增加一
  • 这些表被分配,使用类型的分区的功能int,使用RIGHT(0),所以有效的所有数据是在所述一个和唯一的分区

由于某些表接近int32最大值,我们必须将这些列类型更改为bigint。这是问题开始的地方:

  • 不能修改主键列的类型(这个我可以通过删除主键,修改类型,然后重新创建主键来避免),但是,我在删除主键约束后仍然无法修改列类型,得到以下异常:

    {“对象‘XXX_XXX’依赖于‘ABCD’列。ALTER TABLE ALTER COLUMN ABCD 失败,因为一个或多个对象访问了这一列。”}

据我所知,分区方案(和函数)对表的模式绑定依赖关系阻止了数据类型修改。没有引用这些主键的外键。

我没有看到更新此数据库上的列类型的解决方案,更不用说生产数据库了。我们可以承受一些维护停机时间,比如 +- 60 分钟,但现在不能了。我有哪些选择?

附加信息

  • 我开始相信我唯一的选择是创建具有正确结构的新表并将现有表数据泵入新表中......

  • 表已经根据它们的主键值进行了分区(目前只有 1 个分区(RIGHT(0),未来的分区应该可以用于新值 ( RIGHT(x)),边界x尚未确定)

  • 这些是数据记录表,只有插入,没有更新或删除

  • 除了维护时段外,总是在这些表上执行 DML,每 6-8 周一次,最多持续 90 分钟。

  • 基于主键的索引都是聚集的

  • 这些表上没有非聚集索引

sql-server ddl sql-server-2012

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

SQL Server 检测到 2 个套接字,每个套接字有 4 个内核,但只有一个 NUMA 节点

我们在 VMWare 主机中有一个 SQL Server 2012 SP 2 CU 8 实例。操作系统为 Windows Server 2012 R2。

Windows 任务管理器说我们有两个套接字和 8 个虚拟内核。此数字对应于来宾下方的实际硬件。

任务管理器套接字和核心数

在任务管理器中,我也无法将视图更改为 NUMA 节点。

仍然没有 NUMA 节点

在 SQL Server 中仍然只能看到一个 NUMA 节点 SQL Server NUMA 配置

来自 Glen Berrys 诊断查询的这个片段也给了我这个信息

EXEC sys.xp_readerrorlog 0, 1, N'detected', N'socket';
Run Code Online (Sandbox Code Playgroud)

SQL Server 检测到 2 个插槽,每个插槽 4 个内核,每个插槽 4 个逻辑处理器,总共 8 个逻辑处理器;使用基于 SQL Server 许可的 8 个逻辑处理器。这是一条情报信息; 无需用户操作。

根据所有这些信息,我可以怀疑我们仅在一个 NUMA 节点上运行,但跨两个套接字运行。

我的问题:

  1. 我们只在一个 NUMA 节点上运行是否正确?
  2. 即使所有内容都位于一个 NUMA 节点上,这是否会影响性能?
  3. 什么组件确切地规定了 NUMA 边界?例如,如果我有一个带两个 Intel E5 处理器的双插槽主板,主板会决定我有多少个 NUMA 节点或处理器。

我认为有很多关于 NUMA 节点的错误信息。如果有人可以回答我的问题或指出详细解释这个概念的有用资源,那将不胜感激。

performance sql-server configuration vmware numa

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