小编Mar*_*man的帖子

在 INSERT 上使用 WITH TABLOCK 的好处

在某些情况下,INSERT INTO <tablename> (WITH TABLOCK)由于日志记录最少,执行 an会更快。这些情况包括将数据库置于BULK_LOGGED恢复模型中。

是否有任何其他潜在的性能优势,使用WITH TABLOCKINSERT的空白表时,数据库(tempdb数据库)使用SIMPLE恢复模式?

我正在使用 SQL Server 2012 标准版。

我的用例是在使用 的存储过程中创建然后立即填充临时表INSERT...SELECT,其中可能包含多达几百万行。我尽量避免这种tempdb滥用,但有时需要这样做。

我正在尝试构建一个需要 require 的案例TABLOCK。它似乎不会伤害任何东西,并且可能有好处。我试图弄清楚是否有足够的潜在好处将它添加到我们的代码库中的任何地方,我确信没有其他进程想要写入表。

我通常使用集群 PK 插入新创建的本地临时表,但有时会使用堆。

performance sql-server insert sql-server-2012

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

如何将 SQL Server 死锁报告中的键转换为值?

我有一份死锁报告,告诉我有一个涉及到的冲突

waitresource="KEY: 9:72057632651542528 (543066506c7c)"
Run Code Online (Sandbox Code Playgroud)

我可以看到这个:

<keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528">
Run Code Online (Sandbox Code Playgroud)

该范围内<resource-list>的元素。

我希望能够找到键的实际值(例如,id = 12345)。我需要使用什么 SQL 语句来获取该信息?

sql-server deadlock primary-key sql-server-2012

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

用组的上一个填充日期的数据值填充缺失的日期

图片在部门之间转移的服务台票。我们想知道在票打开的每一天,每个票在一天结束时的部门是什么。该表包含每张票的最后一个部门,在该部门发生变化的每一天开放(包括该票最初打开日期和关闭日期的一行)。数据表如下所示:

CREATE TABLE TicketAssigment (
    TicketId     INT NOT NULL,
    AssignedDate DATE NOT NULL,
    DepartmentId INT NOT NULL);
Run Code Online (Sandbox Code Playgroud)

我需要的是使用按日期排序的前一个 TicketAssigment 行中的 DepartmentId 为每个 TicketId 填写任何缺失的日期。

如果我有像这样的 TicketAssigment 行:

1, '1/1/2016', 123 -- Opened
1, '1,4,2016', 456 -- Transferred and closed
2, '1/1/2016', 25  -- Opened
2, '1/2/2016', 52  -- Transferred
2, '1/4/2016', 25  -- Transferred and closed
Run Code Online (Sandbox Code Playgroud)

我想要这个输出:

1, '1/1/2016', 123
1, '1/2/2016', 123
1, '1/3/2016', 123
1, '1/4/2016', 456
2, '1/1/2016', 25
2, '1/2/2016', 52
2, '1/3/2016', 52
2, '1/4/2016', …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization sql-server-2012 date

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

为什么在创建临时表的存储过程末尾截断临时表会更快地释放临时数据库空间?

SQL Server 缓存在存储过程中创建的临时表,并且仅在过程结束和随后执行时重命名它们。我的问题与 tempdb 空间何时被释放有关。我读到该表在程序结束时截断。我在评论中读到这是在每个会话的基础上处理的,并且在 MSDN看到了一个关于是否需要清理的问题。但是如果它从来没有被同一个会话执行过两次呢?

我还听说有一个后台垃圾收集进程,一旦表超出范围,就会释放该空间。

在创建它的存储过程结束时截断临时表似乎会导致表在 tempdb 中用于数据的空间比不使用 truncate 语句时释放的空间更快,尽管与预期相反。为什么?

使用或不使用这种截断语句的相对性能影响是什么?使用 SNAPSHOT 隔离时,tempdb 经常受到压力,我认为尽快从大型临时表中释放 tempdb 中使用的空间将防止 tempdb 不必要的增长。这种潜在的空间节省是否会以性能为代价?

这是一些重现问题的代码(主要来自@TheGameiswar,有一些更改):

SET NOCOUNT ON;
GO
ALTER PROC usp_test
AS
BEGIN
    IF object_id('tempdb..#temp') IS NOT NULL
        DROP TABLE #temp

    SELECT *
    INTO #temp
    FROM [dbo].[Event_28] -- This is a table with 15313 rows, using 35648 KB according to sp_spaceused

    --SELECT SUM(user_object_reserved_page_count) AS [user object pages used]
    --  ,(SUM(user_object_reserved_page_count) * 1.0 / 128) …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures truncate tempdb temporary-tables

12
推荐指数
1
解决办法
6511
查看次数

事务隔离级别快照与截断?

我希望有人可以对我没有预料到的关于 SNAPSHOT 隔离与 TRUNCATE 的这种行为有所了解。

数据库:允许快照隔离 = True;已读已提交快照 = False。

过程 1(用大量连接替换长期运行的复杂 SELECT 表 foo 的内容):

BEGIN TRAN; 
TRUNCATE TABLE foo; 
INSERT INTO foo SELECT...; 
COMMIT;
Run Code Online (Sandbox Code Playgroud)

程序 2(从表 foo 中读取):

SET TRANSACTION ISOLATION LEVEL SNAPSHOT; 
SELECT * FROM foo;
Run Code Online (Sandbox Code Playgroud)

如果在执行程序 2 时程序 1 正在运行,程序 2 将通过 LCK_M_SCH_S 等待(根据 sp_WhoIsActive)暂停,直到程序 1 完成。当 Procedure2 完成时,它会引发此异常:

数据库“DatabaseName”中的快照隔离事务失败,因为自该事务开始以来,该语句访问的对象已被另一个并发事务中的 DDL 语句修改。这是不允许的,因为元数据没有版本化。如果与快照隔离混合使用,对元数据的并发更新可能会导致不一致。

但是,Microsoft 并未将 TRUNCATE 列为 SNAPSHOT 隔离下不允许的 DDL 语句:http : //msdn.microsoft.com/en-us/library/bb933783.aspx

显然,我没有正确理解某些东西,因为我本来期望 Procedure2 的最佳情况是在 TRUNCATE 之前立即从表中返回最近提交的数据,或者是被 Procedure1 阻止然后返回新内容的最坏情况桌子。你能帮我吗?

sql-server sql-server-2008-r2 truncate snapshot-isolation

10
推荐指数
1
解决办法
3395
查看次数

SSIS 2012:环境引用 n 与项目无关

我有一个要更新的软件包。该包由作业代理作业执行。删除包然后部署新版本后,我运行一个脚本来执行任何必要的 [create_environment]、[create_environment_reference]、[create_environment_variable] 和 [set_object_parameter_value] 语句。

但是,当我开始工作时,它失败并显示以下错误消息(其中“n”是一个数字,它没有出现在任何相关的 SSISDB 表或视图中作为任何类型的 id):

环境引用 n 与项目无关

ssis-2012

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

为什么过程有时会挂起执行 SELECT...INTO #Temp2 FROM #Temp1 JOIN LocalTable...?

我们有几个由作业调用的存储过程,它们遵循特定的模式(旨在最小化阻塞)。其中一些 proc 有时会挂起,运行 CPU、tempdb 分配、读取和写入,直到被终止。图案是:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
CREATE #RemoteTemp...;
INSERT INTO #RemoteTemp EXEC MyLinkedServer.DbName.SchemaName.ProcName;
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT...INTO #MixedTemp FROM #RemoteTemp JOIN LocalTable...;
Run Code Online (Sandbox Code Playgroud)

然后我们使用#MixedTemp. 但是,最后一条语句有时会在不到一秒的时间内运行,有时会挂起,即使每次执行的行数都相同。什么可能导致这种情况?

附加信息:

  • 1117 和 1118 已启用。
  • 这个 8 核实例的 8 个 tempdb 文件。
  • 没有发生 tempdb 自动增长。

挂起期间:

  • Sch-S 锁定本地表。
  • 在正在读取的临时表上:

    Lock resource_type="HOBT.BULK_OPERATION" request_mode="S"
    request_status="GRANT" request_count="1" Lock resource_type="OBJECT"
    request_mode="X" request_status="GRANT" request_count="1"
    
    Run Code Online (Sandbox Code Playgroud)
  • 在插入的临时表上:

    Lock resource_type="OBJECT"
     request_mode="X" request_status="GRANT" request_count="1"
    
    Run Code Online (Sandbox Code Playgroud)

从 sp_lock(6 和 7 是连接到临时表的数据库,2 是 tempdb):

spid   dbid   ObjId       IndId  Type …
Run Code Online (Sandbox Code Playgroud)

performance sql-server stored-procedures insert sql-server-2012

6
推荐指数
1
解决办法
1013
查看次数

多语句 TVF 上的 WITH SCHEMABINDING 是否会改进基数估计?

根据查询性能和多语句表值函数等文章,SQL Server 假设多行表值函数返回一行。如果它实际上返回许多行,这会导致为调用语句选择一个糟糕的执行计划。

添加SCHEMABINDING到函数是否会导致函数返回值集的基数估计更正确?

如果我们假设我们将一个UserId传递给这个函数并返回一个RecordId值的表,该表允许用户访问,并且一些用户只被允许查看一些记录,而一些用户被允许查看很多甚至所有记录,函数或调用语句(或包含它们的过程)是否会从使用中受益RECOMPILESCHEMABINDING函数中的使用会改变这个答案吗?

我意识到我可以通过实验来解决这个问题,但我希望有人已经找到了答案。指向有详细记录的地方的指针会有所帮助。

sql-server-2005 sql-server functions cardinality-estimates

5
推荐指数
1
解决办法
1374
查看次数

如何创建延迟小于 15 分钟的辅助只读报告数据库

我们有一个 2012 标准版实例,它每 15 分钟将 2 个相关数据库的日志传送到辅助 2012 标准版实例以用于 DR 目的。尽管它提供只读访问权限,但在还原作业运行时,用户每 15 分钟就会自动断开连接(完成还原最多需要 2 分钟)。

在不干扰该过程的情况下,我们希望为报告和开发人员故障排除目的设置一个辅助实例,该实例也将至少每 15 分钟更新一次(报告需要接近实时的数据),但不会涉及定期断开连接,启用与主要不同的安全性(以便开发人员可以从辅助读取但不能从主要读取),并且最好允许创建在主要上不存在的索引(以提高报告性能)。

1)我们怎样才能做到这一点?2) 如何在不升级到企业版的情况下实现这一点?

replication sql-server sql-server-2012

5
推荐指数
1
解决办法
2737
查看次数

SQL Server 2016 InitializeExternalUserGroupSid 启动失败消息

我有一个继承的 SQL Server 2016 安装。它不使用或配置 R 或机器学习。当它启动时,我在日志中看到这些消息:

InitializeExternalUserGroupSid 失败。隐式身份验证将被禁用。

隐含的身份验证管理器初始化失败。隐式身份验证将被禁用。

这些是正常的和预期的还是表明存在问题?

error-log sql-server-2016

5
推荐指数
0
解决办法
2096
查看次数