假设您有一个明确用于数据库功能的专用服务器——您应该为操作系统保留多少内存?
我意识到这可能会有所不同,具体取决于特定的操作系统、特定的数据库软件等。但是,由于内存对数据库性能非常重要,我希望数据库具有最大合理级别的内存,而不会使主机操作系统挨饿。
所以
我有一些标准 SQL 可以针对单个服务器上的多个数据库运行,以帮助我诊断问题:
select
so.name,
so.type,
MAX(case when sc.text like '%remote%' then '' ELSE 'N' END) AS Relevant,
@@ServerName as Server,
DB_Name() as DBName
from
sysobjects so with (nolock)
join syscomments sc with (nolock) on so.id = sc.id
where (sc.text like '%emote%')
group by so.name, so.type
order by so.type, so.name
Run Code Online (Sandbox Code Playgroud)
如何对单个服务器上的所有数据库执行此操作?(除了一次手动连接一个并执行)
在问了这个比较顺序和非顺序 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) 我正在使用 Microsoft SQL Server 2012 并尝试在 Management Studio 中针对它运行一个简单的查询。我收到以下错误(在 SSMS 中,在服务器上运行):
执行批处理时发生错误。错误消息是:抛出了“System.OutOfMemoryException”类型的异常。
系统安装了 24GB 的 RAM,但在任务管理器中查看 sqlservr.exe 进程仅使用 2.9GB。
某处是否有限制其 RAM 使用的设置?
我有一个表测试,其中包含主键和自动递增的列 id 和名称。当且仅当没有记录时,我想插入一条新记录。例如
输入是 id=30122 和 name =john
如果有 ID 为 30122 的记录,那么我将 name 列更新为 john,如果没有记录,那么我将插入一条新记录。
我可以使用 2 个查询,例如
select * from test where id=30122
Run Code Online (Sandbox Code Playgroud)
如果它有一些记录,那么我可以使用 update test set name='john' where id=3012
或者如果它没有记录,那么我可以使用
insert into test(name) values('john')
Run Code Online (Sandbox Code Playgroud)
但我想使用单个查询?
有人可以告诉它是否可能吗?