标签: sql-server

为什么在我的测试用例中,顺序 GUID 键的执行速度比顺序 INT 键快?

在问了这个比较顺序和非顺序 GUID 的问题后,我尝试比较 INSERT 性能在 1) 一个带有顺序初始化的 GUID 主键newsequentialid()的表,和 2) 一个带有顺序初始化的 INT 主键的表identity(1,1)。我希望后者最快,因为整数的宽度较小,并且生成顺序整数似乎比顺序 GUID 更简单。但令我惊讶的是,带有整数键的表上的 INSERT 比顺序 GUID 表慢得多。

这显示了测试运行的平均时间使用 (ms):

NEWSEQUENTIALID()  1977
IDENTITY()         2223
Run Code Online (Sandbox Code Playgroud)

谁能解释一下?

使用了以下实验:

SET NOCOUNT ON

CREATE TABLE TestGuid2 (Id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWSEQUENTIALID() PRIMARY KEY,
SomeDate DATETIME, batchNumber BIGINT, FILLER CHAR(100))

CREATE TABLE TestInt (Id Int NOT NULL identity(1,1) PRIMARY KEY,
SomeDate DATETIME, batchNumber BIGINT, FILLER CHAR(100))

DECLARE @BatchCounter INT = 1
DECLARE @Numrows INT = 100000


WHILE …
Run Code Online (Sandbox Code Playgroud)

sql-server clustered-index

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

堆上非聚集索引与聚集索引的性能

这份 2007 年的白皮书比较了单个 select/insert/delete/update 和 range select 语句在组织为聚集索引的表上的性能与在与 CI 相同的键列上组织为具有非聚集索引的堆的表上的性能桌子。

一般来说,聚集索引选项在测试中表现更好,因为只有一种结构需要维护,而且不需要书签查找。

该论文未涵盖的一个潜在有趣案例是堆上的非聚集索引与聚集索引上的非聚集索引之间的比较。在那种情况下,我曾期望堆甚至可能表现得更好,因为一旦在 NCI 叶级 SQL Server 有一个 RID 可以直接跟随,而不需要遍历聚集索引。

有没有人知道在这个领域进行过类似的正式测试,如果有,结果是什么?

sql-server clustered-index

39
推荐指数
3
解决办法
5799
查看次数

如何停止、脱机和删除恢复中的 SQL Server 数据库?

我有一个开发数据库,​​它在重新启动时进入了恢复模式,并且在过去一个小时左右一直在恢复。

我需要要么停止恢复,要么以某种方式杀死它。

我一点也不关心数据库或任何数据,我有部署脚本。

有任何想法吗?

sql-server-2005 sql-server

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

数据库的简单或完整恢复模型?

什么时候应该使用完整恢复模型,什么时候应该对数据库使用简单恢复模型?

我总是使用完整恢复模式,因为它是默认模式,但今天我遇到了这个错误:

Microsoft OLE DB Provider for SQL Server (0x80040E14) 数据库“DATABASE NAME”的事务日志已满。要找出无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列

特定的数据库实际上是我服务器上最小和最不活动的数据库之一,所以我不知道这个数据库上的日志如何被填满,而不是其他数据库。

为了缩小日志并使数据库再次可访问,我将恢复模式从 FULL 更改为 SIMPLE 并缩小了逻辑文件日志,使用以下命令

alter database myDbName SET recovery simple
go
dbcc shrinkfile('LOG FILE LOGICAL NAME', 100)
go
Run Code Online (Sandbox Code Playgroud)

它帮助,但现在我需要了解为什么它的帮助下,如何这种情况开始,如何防止这种情况在未来?

编辑:

每天晚上 1 点,我们都会对服务器上的每个数据库进行脚本备份。这是由 31 行脚本完成的,其中最重要的部分是

set @Filename = 'D:\backup\' + convert(varchar, getDate(), 112) + ' - ' + @DBName + '.bak'
set @Description = 'Full backup of database ' + @Filename
BACKUP DATABASE @DBName TO DISK …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 recovery

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

在 SSMS 2012 中格式化 T-SQL

根据这个微软文档:

http://msdn.microsoft.com/en-us/library/ms174205.aspx

我应该能够使用 ctrl+K 然后 ctrl+D 在 SQL Server Management Studio 2012 中格式化我的 SQL 文档,但是当我使用该组合时,出现错误:

组合键(Ctrl+K、Ctrl+D)绑定到当前不可用的命令(格式化文档)。

我正在尝试对现有的 SQL 文档进行修改,该文档根本没有格式化,这使得阅读非常困难。有谁知道如何使格式化文档命令可用,以便我可以使用 SQL 为我格式化此代码?

sql-server ssms

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

检查存在与 EXISTS 胜过 COUNT!... 不是?

我经常读到,当必须检查一行是否存在时,应该始终使用 EXISTS 而不是 COUNT 来完成。

然而,在最近的几个场景中,我测量了使用计数时的性能改进。
模式是这样的:

LEFT JOIN (
    SELECT
        someID
        , COUNT(*)
    FROM someTable
    GROUP BY someID
) AS Alias ON (
    Alias.someID = mainTable.ID
)
Run Code Online (Sandbox Code Playgroud)

我不熟悉判断 SQL Server“内部”发生了什么的方法,所以我想知道 EXISTS 是否存在一个未知的缺陷,这对我所做的测量非常有意义(EXISTS 可能是 RBAR 吗?!)。

你对这种现象有什么解释吗?

编辑:

这是您可以运行的完整脚本:

SET NOCOUNT ON
SET STATISTICS IO OFF

DECLARE @tmp1 TABLE (
    ID INT UNIQUE
)


DECLARE @tmp2 TABLE (
    ID INT
    , X INT IDENTITY
    , UNIQUE (ID, X)
)

; WITH T(n) AS (
    SELECT
        ROW_NUMBER() OVER (ORDER …
Run Code Online (Sandbox Code Playgroud)

performance sql-server

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

在 SQL Server 中查找新跟踪标志的方法

那里有很多跟踪标志。有些有据可查,有些没有,还有一些在 2016 版本中找到了默认行为状态的方法。除了官方支持渠道、微软员工等,还有什么方法可以找到新的跟踪标志?

我已经在这里这里阅读了 Aaron Bertrand 最近的几篇文章,但没有发现任何关于新跟踪标志的信息。

我将 mssqlsystemresource 的数据和日志文件复制到一个新位置,并像常规数据库一样附加它以浏览系统表和视图,但没有立即发现任何内容。我考虑过列出已知跟踪标志的列表,并循环遍历不在该列表中的数字,以查看 DBCC TRACEON 允许哪些,但想先在这里提出问题。

假设启用它们的 DBCC 命令必须检查某些资源以确保跟踪标志有效,那么它会到达哪里?是否有包含列表的 .dll 或其他系统文件?

我知道这个问题撒了一个广泛的网络,但促使它阅读的原因是阅读了具有特定预期行为的 Trace Flag 以及 2016 年没有产生所描述效果的新功能。我最初的想法是,也许数字以某种方式转置了,比如 7129 变成了 7219。我希望得到一个范围内的有效跟踪标志列表,比如 7000-7999,以寻找排列。将它们全部作为 DBCC TRACEON 标志和启动参数进行测试,再加上针对功能行为测试结果,将会非常麻烦。

sql-server trace-flags

39
推荐指数
3
解决办法
1738
查看次数

SQL Server 的“服务器总内存”消耗停滞了数月,还有 64GB 以上的可用空间

我遇到了一个奇怪的问题,SQL Server 2016 标准版 64 位似乎将自己限制在分配给它的总内存的一半(128GB 中的 64GB)。

的输出@@VERSION是:

Microsoft SQL Server 2016 (SP1-CU7-GDR) (KB4057119) - 13.0.4466.4 (X64) 2017 年 12 月 22 日 11:25:00 版权所有 (c) Windows Server 2012 R2 Datacenter 6.3 上的 Microsoft Corporation 标准版(64 位)(内部版本 9600:)(管理程序)

的输出sys.dm_os_process_memory是:

sys.dm_os_process_memory

当我查询时sys.dm_os_performance_counters,我看到Target Server Memory (KB)是在131072000Total Server Memory (KB)是 at 的一半以下65308016。在大多数情况下,我认为这是正常行为,因为 SQL Server 尚未确定它需要为自己分配更多内存。

然而,它已经“卡住”在 64GB 左右超过 2 个月了。在此期间,我们对一些数据库执行了大量内存密集型操作,并向实例添加了近 40 个数据库。我们总共有 292 个数据库,每个数据库都有 4GB 的预分配数据文件和 256MB 的自动增长速率和 2GB …

performance sql-server memory sql-server-2016 sp-blitz

39
推荐指数
2
解决办法
4801
查看次数

加速无子句的巨大 DELETE FROM <table> 的方法

使用 SQL Server 2005。

我正在执行一个没有 where 子句的巨大 DELETE FROM。它基本上等同于 TRUNCATE TABLE 语句 - 除了我不允许使用 TRUNCATE。问题是表很大 - 1000 万行,需要一个多小时才能完成。有没有办法让它更快,没有:

  • 使用截断
  • 禁用或删除索引?

t-log 已经在一个单独的磁盘上。

欢迎任何建议!

performance sql-server delete

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

Management Studio System.OutOfMemoryException

我正在使用 Microsoft SQL Server 2012 并尝试在 Management Studio 中针对它运行一个简单的查询。我收到以下错误(在 SSMS 中,在服务器上运行):

执行批处理时发生错误。错误消息是:抛出了“System.OutOfMemoryException”类型的异常。

系统安装了 24GB 的 RAM,但在任务管理器中查看 sqlservr.exe 进程仅使用 2.9GB。

某处是否有限制其 RAM 使用的设置?

sql-server ssms sql-server-2012

38
推荐指数
4
解决办法
15万
查看次数