标签: sql-server

有哪些工具可以为 SQL Server 生成测试数据?

从我的另一个问题中可以看出,生成测试数据是我现在的主题。

在这一点上,我仍在手动生成我的测试数据。但是,此过程始终会生成少量数据(通常为 5-10 行),因为它一个手动过程。

是否有任何工具可以自动执行此过程?特别是,我希望能够生成 100 万行以上。

performance sql-server testing performance-testing

14
推荐指数
3
解决办法
9191
查看次数

如何删除正在恢复的数据库

我正在使用 SQL Server 2008 R2 运行日志传送。

我遇到了辅助数据库驱动器空间不足且未应用日志传送事务日志的情况。

我想解决这个问题的方法是删除辅助数据库并从头开始配置日志传送。

我现在遇到的问题是我的辅助数据库处于恢复状态,我无法删除它们。我该如何继续?

例如,如果我尝试让它们离线,我会收到错误消息,

ALTER DATABASE is not permitted while the database is in the Restoring state.
Run Code Online (Sandbox Code Playgroud)

sql-server log-shipping

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

拒绝访问 SQL Server 中的信息架构

我正在寻找禁用SQL Server 中用户/组访问sys.tables/的最佳方法Information Schema

从 2008 年发现了这个线程

它显示了一种如何拒绝访问的方法,[sys].[something]如下所示:

 DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
 GO
Run Code Online (Sandbox Code Playgroud)

但是没有办法如何禁用对以下内容的访问Information Schema

DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用。

如何禁用对 information_schema 的访问?

是否有更简单的方法禁用对所有sys/ 的访问information_schema

更新: 实际上我不能同时运行以下语句:

DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server-2008 sql-server sql-server-2008-r2 information-schema

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

高 CXPACKET 和 LATCH_EX 等待

我正在处理的数据处理系统存在一些性能问题。我从一小时的 peroid 中收集了等待统计数据,其中显示了大量的 CXPACKET 和 LATCH_EX 等待事件。

该系统由 3 个处理 SQL Server 组成,它们进行大量的数字运算和计算,然后将数据馈送到中央集群服务器。处理服务器最多可以同时运行 6 个作业。这些等待统计数据适用于我认为导致瓶颈的中央集群。中央集群服务器有 16 个内核和 64GB RAM。MAXDOP 设置为 0。

我猜 CXPACKET 来自正在运行的多个并行查询,但是我不确定 LATCH_EX 等待事件表示什么。从我读到的这可能是一个非缓冲等待?

任何人都可以建议这种等待统计的原因是什么,以及我应该采取什么行动来调查这个性能问题的根本原因?

顶部查询结果是总等待统计数据,底部查询结果是 1 小时内的统计数据 SQL 等待示例

performance sql-server parallelism wait-types query-performance

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

TempDB 争用

我们在 SQL Server 2014 SP1 上有一个活动的 OLTP 40GB 数据库。发现查询缓慢,IO_Completion 等待,磁盘队列长度上升到 900,SQL Server 停止响应。我们尝试了什么:

  1. 重新启动实例,一分钟后它开始以相同的方式运行。

  2. 第二次重启后,我们更改了每个 tempdb 数据文件的初始大小(创建了 16 个数据文件),它开始正常工作。

注意:我们将表变量用于中间结果集。这些结果集非常小。

一个月内发生了两次。每次我手动向数据文件添加一点空间时,它就会开始正常工作。更有趣的是,我们在 SQL Server 2008 R2 和 SQL Server 2012 上的相同设置(相同的硬件、相同的文件夹和文件设置、相同的工作负载)运行良好。

请帮助我们找到永久解决方案。

所有数据文件的初始大小都是 1000MB,当前每个是 1500MB。都是一样的。每个自动增长是 100MB。在此之前,我们面临 PFS 和 GAM 页面争用,我们增加到 16 个并解决了问题。跟踪标志 1117 和 1118 都已启用。2 个 NUMA 节点上的 24 个内核。所有数据文件都在同一卷上。简单的磁盘,没有 SAN。

实例位于物理机上。带有表变量的查询和带有哈希联接的查询最常产生 IO_Completion 等待。


wBob 的详细回答促使我们进行更详细的搜索。我们之前是怎么错过的:

数据库 'tempdb' 中文件 'templog' 的自动增长被用户取消或在 7704 毫秒后超时。使用 ALTER DATABASE 为此文件设置较小的 FILEGROWTH 值或显式设置新文件大小。

这是我们在发生此类问题时在日志中发现的。我们正在移动 TempDB 以分离快速驱动器。

sql-server tempdb sql-server-2014

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

批量插入时间变化很大

所以我有一个简单的批量插入过程来从我们的临时表中获取数据并将其移动到我们的数据集市中。

该过程是一个简单的数据流任务,默认设置为“每批行数”,选项为“tablock”和“无检查约束”。

桌子相当大。587,162,986 数据大小为 201GB,索引空间为 49GB。表的聚集索引是。

CREATE CLUSTERED INDEX ImageData ON dbo.ImageData
(
    DOC_ID ASC,
    ACCT_NUM ASC,
    MasterID ASC
)
Run Code Online (Sandbox Code Playgroud)

主键是:

ALTER TABLE dbo.ImageData 
ADD CONSTRAINT ImageData 
PRIMARY KEY NONCLUSTERED 
(
    ImageID ASC,
    DT_CRTE_DOC ASC
)
Run Code Online (Sandbox Code Playgroud)

现在我们遇到了一个问题,BULK INSERT通过 SSIS 运行速度非常慢。1 小时插入一百万行。填充表的查询已经排序,并且要填充的查询运行时间不到一分钟。

当进程运行时,我可以看到等待 BULK insert 的查询需要 5 到 20 秒,并显示等待类型为PAGEIOLATCH_EX. 该过程一次只能处理INSERT大约一千行。

昨天在我的 UAT 环境中测试这个过程时,我遇到了同样的问题。我运行了几次这个过程并试图确定这个缓慢插入的根本原因是什么。然后突然间它在不到 5 分钟的时间内开始运行。所以我又跑了几次,结果都是一样的。此外,等待 5 秒或更长时间的批量插入的数量从数百个下降到大约 4 个。

现在这令人困惑,因为我们的活动并没有大幅下降。

持续时间内的 CPU 低。

中央处理器

当它变慢时,磁盘上的等待似乎更少。

等待

在进程运行不到 5 分钟的时间范围内,磁盘延迟实际上会增加。

潜伏

在此过程运行不佳期间,IO 低得多。

输入输出

我已经检查过并且没有文件增长,因为文件只有 70% 已满。日志文件还有 50% 的时间要处理。数据库处于简单恢复模式。DB …

sql-server ssis sql-server-2012

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

如何使用 COLUMNS_UPDATED 检查某些列是否已更新?

我有一个包含 42 列的表和一个触发器,当这些列中的 38 列更新时,它应该做一些事情。因此,如果其余 4 列发生更改,我需要跳过逻辑。

我可以使用UPDATE()函数并创建一个大IF条件,但更喜欢做一些更短的事情。使用COLUMNS_UPDATED我可以检查是否所有某些列都更新了?

例如,检查第 3、5 和 9 列是否更新:

  IF 
  (
    (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20)
     AND 
    (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) 
  )
    PRINT 'Columns 3, 5 and 9 updated';
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

因此,203和的5值,以及1列的值,9因为它设置在第二个字节的第一位。如果我将语句更改为OR它会检查列3和/5或列9是否更新?

如何OR在一个字节的上下文中应用逻辑?

trigger sql-server t-sql

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

如何使用 TSQL 动态更改数据库

我在尝试将 SSMS 的上下文动态更改为动态 SQL 中指定的数据库时遇到问题:

EXEC sys.sp_executesql N'USE db1 ' ;
Run Code Online (Sandbox Code Playgroud)

它成功执行,但 SSMS 的数据库上下文不会改变。

我试过对上面的稍作修改

DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

同样,它成功执行,但数据库没有改变。

sql-server dynamic-sql t-sql sql-server-2014

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

使用 XPath/XQuery 连接同一 XML 元素的所有值

我有一个这样的 XML 值:

<R>
  <I>A</I>
  <I>B</I>
  <I>C</I>
  ...
</R>
Run Code Online (Sandbox Code Playgroud)

我想连接所有的I值并返回它们作为单个字符串:ABC...

现在我知道我可以分解 XML,将结果聚合回无节点 XML,然后应用于.values('text()[1]', ...)结果:

SELECT
  (
    SELECT
      n.n.value('text()[1]', 'varchar(50)') AS [text()]
    FROM
      @MyXml.nodes('/R/I') AS n (n)
    FOR XML
      PATH (''),
      TYPE
  ).value('text()[1]', 'varchar(50)')
;
Run Code Online (Sandbox Code Playgroud)

但是,我想仅使用 XPath/XQuery 方法来完成所有这些工作,如下所示:

SELECT @MyXml. ? ( ? );
Run Code Online (Sandbox Code Playgroud)

有这样的方法吗?

我在这个方向寻找解决方案的原因是因为我的实际 XML 也包含其他元素,例如:

SELECT
  (
    SELECT
      n.n.value('text()[1]', 'varchar(50)') AS [text()]
    FROM
      @MyXml.nodes('/R/I') AS n (n)
    FOR XML
      PATH (''),
      TYPE
  ).value('text()[1]', 'varchar(50)')
;
Run Code Online (Sandbox Code Playgroud)

而且我希望能够将I值提取为单个字符串,并将J值提取为单个字符串,而不必为每个值使用笨拙的脚本。

xml sql-server xquery sql-server-2014

14
推荐指数
2
解决办法
4111
查看次数

将许多可空整数 1:1 转换为二进制字符串的最快方法是什么?

我的部分工作量使用了一个CLR 函数,该函数实现了诡异的哈希算法来比较行以查看是否有任何列值发生了变化。CLR 函数将二进制字符串作为输入,因此我需要一种快速的方法将行转换为二进制字符串。我希望在整个工作负载期间散列大约 100 亿行,所以我希望这段代码尽可能快。

我有大约 300 个不同架构的表。出于这个问题的目的,请假设一个简单的表结构,包含 32 个可空INT列。我在这个问题的底部提供了示例数据以及一种对结果进行基准测试的方法。

如果所有列值都相同,则行必须转换为相同的二进制字符串。如果任何列值不同,则必须将行转换为不同的二进制字符串。例如,像下面这样简单的代码将不起作用:

CAST(COL1 AS BINARY(4)) + CAST(COL2 AS BINARY(4)) + ..
Run Code Online (Sandbox Code Playgroud)

它不能正确处理 NULL。如果COL1第 1 行为COL2NULL,第 2 行为 NULL,则两行都将转换为 NULL 字符串。我相信正确处理 NULL 是正确转换整行的最难部分。INT 列的所有允许值都是可能的。

先抢答一些问题:

  • 如果重要的话,绝大多数时间 (90%+) 列都不会为 NULL。
  • 我必须使用CLR。
  • 我必须散列这么多行。我无法坚持哈希。
  • 我相信由于 CLR 函数的存在,我无法使用批处理模式进行转换。

将 32 个可INT为空的列转换为 aBINARY(X)VARBINARY(X)string的最快方法是什么?

承诺的示例数据和代码:

-- create sample data
DROP TABLE IF EXISTS dbo.TABLE_OF_32_INTS;

CREATE TABLE dbo.TABLE_OF_32_INTS (
    COL1 INT NULL,
    COL2 INT NULL, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2017

14
推荐指数
4
解决办法
351
查看次数