标签: sql-server-2012

SQL Server 性能:PREEMPTIVE_OS_DELETESECURITYCONTEXT 显性等待类型

我昨天接到一位客户的电话,他抱怨 SQL Server 的 CPU 使用率过高。我们使用的是 SQL Server 2012 64 位 SE。服务器运行 Windows Server 2008 R2 Standard、2.20 GHz Intel Xeon(4 核)、16 GB RAM。

在确定罪魁祸首实际上是 SQL Server 之后,我使用此处的 DMV 查询查看了等待实例的顶部。前两个等待是: (1)PREEMPTIVE_OS_DELETESECURITYCONTEXT和 (2) SOS_SCHEDULER_YIELD

编辑:这是“顶部等待查询”的结果(尽管今天早上有人违背我的意愿重新启动了服务器):

在此处输入图片说明

我们做了很多密集的计算/转换,所以我可以理解SOS_SCHEDULER_YIELD。但是,我很好奇PREEMPTIVE_OS_DELETESECURITYCONTEXT等待类型以及为什么它可能是最高的。

我可以在此处找到关于此等待类型的最佳描述/讨论。它提到:

PREEMPTIVE_OS_ 等待类型是离开数据库引擎的调用,通常是到 Win32 API,并且在 SQL Server 之外为各种任务执行代码。在这种情况下,它正在删除以前用于远程资源访问的安全上下文。相关的API其实叫做DeleteSecurityContext()

据我所知,我们没有任何外部资源,如链接服务器或文件表。而且我们不进行任何模拟等操作。备份是否会导致此峰值或域控制器出现故障?

到底是什么导致这成为主要的等待类型?如何进一步跟踪这种等待类型?

编辑 2:我检查了 Windows 安全日志的内容。我看到一些可能感兴趣的条目,但我不确定这些是否正常:

Special privileges assigned to new logon.

Subject:
    Security ID:        NT SERVICE\MSSQLServerOLAPService
    Account Name:       MSSQLServerOLAPService
    Account Domain:     NT …
Run Code Online (Sandbox Code Playgroud)

sql-server dmv extended-events sql-server-2012 wait-types

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

将与表相关的条件放在 JOIN 中更好?

我已经看到很多人将与表相关的条件放在 JOIN 子句上。看这个例子,

SELECT i.Name
  FROM sys.TABLES AS tbl
  INNER JOIN sys.indexes AS i
    ON (i.index_id > 0 AND i.is_hypothetical = 0) 
    AND (i.object_id = tbl.object_id)
  WHERE (i.is_unique = 1 AND i.is_disabled = 0) 
    AND (tbl.Name = 'Warehouse')


SELECT i.Name
  FROM sys.TABLES AS tbl
  INNER JOIN sys.indexes AS i
    ON (i.object_id = tbl.object_id)
  WHERE (i.index_id > 0 AND i.is_hypothetical = 0) 
  AND (i.is_unique = 1 AND i.is_disabled = 0) 
  AND (tbl.Name = 'Warehouse')
Run Code Online (Sandbox Code Playgroud)

查询相同,但不同之处在于,第一个(i.index_id > 0 AND i.is_hypothetical = …

sql-server sql-server-2012

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

SQL Server 2012 永远在线备份,完整与仅复制

我需要快速说明仅复制备份与完整备份,因为它与事务日志编号和需要时的还原有关。

我有 SQL Server 2012 设置,始终为多个数据库打开。可用性组设置为副本上的首选备份。

副本上只能进行仅复制和事务日志备份。这是否意味着如果需要还原事务日志,我将需要在主服务器上进行完整备份?

谢谢

sql-server backup sql-server-2012 availability-groups

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

在计算字段上创建索引:字符串或二进制数据将被截断

我有一个Foo包含以下字段的表:

ID bigint not null identity(1,1),
SerializedValue nvarchar(max),
LongValue as TRY_CAST(SerializedValue as bigint)
Run Code Online (Sandbox Code Playgroud)

现在我想在 LongValue 上创建一个索引,以便我可以轻松查找表示数字的序列化值。

create nonclustered index IX_Foo on Foo(LongValue);
Run Code Online (Sandbox Code Playgroud)

其中向我吐出以下错误:

字符串或二进制数据将被截断。

是的,SerializedValue 中有现有数据。但是,祈祷,可以通过在计算字段上创建索引来截断什么?

sql-server sql-server-2012

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

为所有用户创建的数据库设置简单恢复模式和收缩日志文件

我希望你能指出我正确的方向。我不是 T-SQL 的常客,但我做了一些谷歌搜索,并找到了下面的脚本。我稍微修正了脚本。

我希望脚本:

  1. 选择除系统 DB 之外的所有数据库。
  2. 将恢复设置为简单。
  3. 收缩每个 db(.ldf) 的日志文件,系统 db 除外

剧本:

USE MASTER
declare
@isql varchar(2000),
@dbname varchar(64)

declare c1 cursor for select name from master..sysdatabases where name not in ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB')
open c1
fetch next from c1 into @dbname
While @@fetch_status <> -1
    begin
    select @isql = 'ALTER DATABASE @dbname SET RECOVERY SIMPLE'
    select @isql = replace(@isql,'@dbname',@dbname)
    print @isql
    exec(@isql)
    select @isql='USE @dbname checkpoint'
    select @isql = replace(@isql,'@dbname',@dbname)
    print @isql
    exec(@isql)
    select @isql='DBCC SHRINKFILE @dbname.ldf'
    select @isql …
Run Code Online (Sandbox Code Playgroud)

sql-server shrink sql-server-2012 transaction-log recovery-model

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

调用表值函数时使用 NOLOCK 提示

假设有以下函数:

CREATE FUNCTION [dbo].[ufnTest]()
RETURNS TABLE
AS RETURN SELECT 1 AS Nr
Run Code Online (Sandbox Code Playgroud)

我的实际函数将从许多不同的表中选择实际数据。我(大部分)理解使用 nolock 提示的风险,并决定在这种情况下我真的想要它们。所以我尝试像这样调用上面的函数:

SELECT * FROM [dbo].[ufnTest]() WITH(NOLOCK)
Run Code Online (Sandbox Code Playgroud)

但是,这失败并显示以下消息:

关键字“with”附近的语法不正确。如果此语句是公共表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前一条语句必须以分号终止。

修复此错误的提示不相关。也许这个表提示不适用于表值函数?

我会考虑几种选择。一种是在我的选择查询中的所有表上使用提示,但我不想这样做,因为 (a) 每当我更改函数时我都必须记住这一点,并且 (b) 它是重复的。另一种选择是SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,但缺点是我不太知道如何将它设置回之前的状态(并且从我的 TVF 选择之后的语句应该具有原始隔离级别)。

因此,我更愿意WITH (NOLOCK)从表值函数中进行选择。这可能吗?

sql-server sql-server-2012 functions nolock

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

AlwaysOn 可用性组 log_send_rate

在我们所有的 AlwaysOn 设置中,在虚拟机和裸机上运行 Windows 2012 和 SQL Server 2012,我发现 log_send_rate sys.dm_hadr_database_replica_states始终返回不正确的值。

例如(对于同步模式)

sys.dm_hadr_database_replica_states.log_send_rate(ave = 36,571(以 bol 列出的 kb/s))

Perfmon - SQLServer:可用性副本 - 发送到副本的字节数/秒(最大值 = 486,000.000,平均 = 259,000.000)

Perfmon - SQLServer:Databases - Log Bytes Flushed/sec (max = 653,044.000, avg = 341,000.000)

我没有看到任何关于此的帖子,但它似乎无法正常工作。正确的log_send_rate值对于监视 AlwaysOn 很有用。

有没有其他人经历过这种情况?

sql-server sql-server-2012 availability-groups

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

结合全文索引和标量索引

假设我们有一个包含 1200 万个姓名和地址的数据库,需要使用全文进行搜索,但每一行也包含一个整数值,比方说COMPANYID。该表在这 1200 万行中包含大约 250 个不同的 COMPANYID。

在定义全文索引时,是否有可能COMPANY在树中为每个索引提供自己的“分支”?

index sql-server full-text-search sql-server-2012

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

SQL Server 如何确定精度/小数位数?

我正在运行 SQL Server 2012

SELECT 
   0.15 * 30 / 360,
   0.15 / 360 * 30 
Run Code Online (Sandbox Code Playgroud)

结果:

 0.012500, 
 0.012480
Run Code Online (Sandbox Code Playgroud)

这个对我来说更令人困惑:

DECLARE @N INT = 360
DECLARE @I DECIMAL(38,26) = 0.15 * 30 / 360     
DECLARE @C DECIMAL(38,26) = 1000000     

SELECT @C *  @I *  POWER(1 + @I, @N)  / ( POWER(1 + @I, @N) - 1 )
SELECT @C * (@I *  POWER(1 + @I, @N)  / ( POWER(1 + @I, @N) - 1 ) )
Run Code Online (Sandbox Code Playgroud)

第一个选择给了我正确的结果:12644.44022 第二个截断结果:12644.00000

sql-server t-sql sql-server-2012 decimal

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

在视图中将列定义为可以为空(但不在引用的表中)

我的公司正在努力实施一个新的 HR 应用程序,以统一我们现有的 HR 流程。不过,我们遇到了一些症结;根据业务规则,Employee表的EmployeeID和SupervisorID列不能为空。但是,应用程序要求这些列可以为空,并且不会在将列设置为不允许为空时同步这些列。

建议的解决方案是创建一个视图,其中架构似乎允许列中存在空值,同时保留表以防止它们被输入到数据中。我并不完全相信这是可能的,而且我一直无法找到一种方法来做到这一点。这可能吗?如果没有,处理这种情况的最佳方法是什么?

sql-server t-sql sql-server-2012

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