在问了这个比较顺序和非顺序 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) 这份 2007 年的白皮书比较了单个 select/insert/delete/update 和 range select 语句在组织为聚集索引的表上的性能与在与 CI 相同的键列上组织为具有非聚集索引的堆的表上的性能桌子。
一般来说,聚集索引选项在测试中表现更好,因为只有一种结构需要维护,而且不需要书签查找。
该论文未涵盖的一个潜在有趣案例是堆上的非聚集索引与聚集索引上的非聚集索引之间的比较。在那种情况下,我曾期望堆甚至可能表现得更好,因为一旦在 NCI 叶级 SQL Server 有一个 RID 可以直接跟随,而不需要遍历聚集索引。
有没有人知道在这个领域进行过类似的正式测试,如果有,结果是什么?
我有一个开发数据库,它在重新启动时进入了恢复模式,并且在过去一个小时左右一直在恢复。
我需要要么停止恢复,要么以某种方式杀死它。
我一点也不关心数据库或任何数据,我有部署脚本。
有任何想法吗?
什么时候应该使用完整恢复模型,什么时候应该对数据库使用简单恢复模型?
我总是使用完整恢复模式,因为它是默认模式,但今天我遇到了这个错误:
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) 根据这个微软文档:
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 为我格式化此代码?
我经常读到,当必须检查一行是否存在时,应该始终使用 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) 那里有很多跟踪标志。有些有据可查,有些没有,还有一些在 2016 版本中找到了默认行为状态的方法。除了官方支持渠道、微软员工等,还有什么方法可以找到新的跟踪标志?
我已经在这里和这里阅读了 Aaron Bertrand 最近的几篇文章,但没有发现任何关于新跟踪标志的信息。
我将 mssqlsystemresource 的数据和日志文件复制到一个新位置,并像常规数据库一样附加它以浏览系统表和视图,但没有立即发现任何内容。我考虑过列出已知跟踪标志的列表,并循环遍历不在该列表中的数字,以查看 DBCC TRACEON 允许哪些,但想先在这里提出问题。
假设启用它们的 DBCC 命令必须检查某些资源以确保跟踪标志有效,那么它会到达哪里?是否有包含列表的 .dll 或其他系统文件?
我知道这个问题撒了一个广泛的网络,但促使它阅读的原因是阅读了具有特定预期行为的 Trace Flag 以及 2016 年没有产生所描述效果的新功能。我最初的想法是,也许数字以某种方式转置了,比如 7129 变成了 7219。我希望得到一个范围内的有效跟踪标志列表,比如 7000-7999,以寻找排列。将它们全部作为 DBCC TRACEON 标志和启动参数进行测试,再加上针对功能行为测试结果,将会非常麻烦。
我遇到了一个奇怪的问题,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_performance_counters,我看到Target Server Memory (KB)是在131072000和Total Server Memory (KB)是 at 的一半以下65308016。在大多数情况下,我认为这是正常行为,因为 SQL Server 尚未确定它需要为自己分配更多内存。
然而,它已经“卡住”在 64GB 左右超过 2 个月了。在此期间,我们对一些数据库执行了大量内存密集型操作,并向实例添加了近 40 个数据库。我们总共有 292 个数据库,每个数据库都有 4GB 的预分配数据文件和 256MB 的自动增长速率和 2GB …
使用 SQL Server 2005。
我正在执行一个没有 where 子句的巨大 DELETE FROM。它基本上等同于 TRUNCATE TABLE 语句 - 除了我不允许使用 TRUNCATE。问题是表很大 - 1000 万行,需要一个多小时才能完成。有没有办法让它更快,没有:
t-log 已经在一个单独的磁盘上。
欢迎任何建议!
我正在使用 Microsoft SQL Server 2012 并尝试在 Management Studio 中针对它运行一个简单的查询。我收到以下错误(在 SSMS 中,在服务器上运行):
执行批处理时发生错误。错误消息是:抛出了“System.OutOfMemoryException”类型的异常。
系统安装了 24GB 的 RAM,但在任务管理器中查看 sqlservr.exe 进程仅使用 2.9GB。
某处是否有限制其 RAM 使用的设置?
sql-server ×10
performance ×3
ssms ×2
delete ×1
memory ×1
recovery ×1
sp-blitz ×1
trace-flags ×1