标签: sql-server

在专用数据库服务器上,要为操作系统保留多少内存?

假设您有一个明确用于数据库功能的专用服务器——您应该为操作系统保留多少内存?

我意识到这可能会有所不同,具体取决于特定的操作系统、特定的数据库软件等。但是,由于内存对数据库性能非常重要,我希望数据库具有最大合理级别的内存,而不会使主机操作系统挨饿。

所以

  • 什么是好的经验法则?
  • 我们应该查看哪些计数器或性能指标来确定我们是否走得太远并且主机操作系统是否以某种方式被数据库饿死?

sql-server windows memory

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

如何对服务器上的所有数据库执行 SQL

我有一些标准 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)

如何对单个服务器上的所有数据库执行此操作?(除了一次手动连接一个并执行)

sql-server

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

为什么在我的测试用例中,顺序 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万
查看次数

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万
查看次数

如何使用单个查询插入或更新?

我有一个表测试,其中包含主键和自动递增的列 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)

但我想使用单个查询?

有人可以告诉它是否可能吗?

sql-server merge upsert

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