当前在 SQL Server 2008 R2 上运行
我正在尝试提高 UPDATE 语句的性能。我注意到弹出显示计划中的 Eager Spool 操作。我对假脱机操作的理解非常基本 - 它们在更新期间为表创建临时存储。
我也知道,虽然它们可以防止更糟糕的执行时间,但急切的假脱机通常表明表结构和/或查询语句存在潜在问题。
我的问题很简单:当您在查询计划中看到 Eager Spool 时,您首先要解决哪些问题?
我将分析我们系统的每个部分以提高性能 - 我只是在寻找关于我应该从哪里开始的指导。
使用 SQL Server 2008 R2:
如何写入 SQL Server 错误日志?我有一个 ROLLBACK 语句,我想将它与写入错误日志的语句结合起来用于外部监控。
例子:
BEGIN TRAN
INSERT INTO table1
SELECT *
FROM table2
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
--Write to log
RETURN
END
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)
编辑:
我想澄清一下 - 我想写入对象资源管理器中“管理”文件夹下的“SQL Server 日志”、“当前”日志。
使用:SQL Server 2008 R2
我目前正在逐步执行查询执行计划,并且遇到了表上聚集索引更新的实例。这里的问题是正在更新的列不是聚集索引的一部分。
桌子:
<table>
id INT IDENTITY(1,1) -- Clustered Index
, name VARCHAR(20) -- Nonclustered Index
, status CHAR(1)
, quantity INT
, price FLOAT
Run Code Online (Sandbox Code Playgroud)
更新声明:
UPDATE a
SET a.status = @status
, a.quantity = @quantity
, a.price = @price
FROM <table> a
WHERE a.name = @name
Run Code Online (Sandbox Code Playgroud)
执行计划显示 Eager Spool 成本为 36%,聚集索引更新成本为 55%,名称索引上的索引查找成本为 9%,计算标量和顶级项目成本为 0%。
为什么计划显示聚集索引更新?我能做些什么来防止这种情况,并防止急切的线轴?
sql-server clustered-index execution-plan sql-server-2008-r2
使用 SQL Server 2008 R2:
我目前正在尝试追踪我们遇到的死锁问题的原因。不知道该往哪里转。这是设置。
TABLE Scores:
id INT IDENTITY(1,1),
first_name VARCHAR(50),
last_name VARCHAR(50),
player_id VARCHAR(50),
score INT
PRIMARY KEY/CLUSTERED INDEX:
id
NON-CLUSTERED INDEX:
first_name, last_name INCLUDES id, player_id, score
Run Code Online (Sandbox Code Playgroud)
多线程应用程序处理消息,然后为每条消息调用两个存储过程之一。
如果应用程序尚未处理用户,它将调用一个存储过程,将一行插入到表中。
如果应用程序已经处理了用户,它会更新first_name
、last_name
、scores
、 中的任何一个或全部,first_name
并且last_name
player_id
不会改变。
每个 表中只有一行player_id
。
应用程序处理消息的线程是根据 player_id 选择的,因此两个线程不会同时处理同一个玩家的消息。
INSERT 和 UPDATE 语句正在使用该WITH (ROWLOCK)
指令。
这是问题:
该进程导致死锁,线程 1 锁定主聚集索引,线程 2 锁定非聚集索引。
我不明白为什么会发生锁 - UPDATE 和 INSERT 语句正在使用行锁,并且已经过测试并证明线程没有访问相同的行。
我能做些什么来解决这个问题?
注意事项:
必须存在两个存储过程,一个是更新,一个是插入。尽管我很想切换到单个 MERGE,但这不会发生。:/
sql-server-2008 sql-server deadlock sql-server-2008-r2 locking
我现在在 SQL Server 2008 R2 中看到了一些行为,我无法确定服务器是否表现不佳。
我已经设置了一个测试,将一个整数插入到一个表中,如下定义,75,000 次。
dbo.Test1
(
id INT IDENTITY(1,1)
, [text] VARCHAR(2000)
, [timestamp] DATETIME NOT NULL DEFAULT(GETDATE())
)
Run Code Online (Sandbox Code Playgroud)
插入数据的应用程序(下面的 C# 代码)和 SQL Server 实例都在同一个物理盒子上。
结果:该过程需要将近 10 分钟的时间来循环和插入数据。不太确定这怎么可能。
for (int i = 0; i < 75000; i++)
{
using (SqlConnection connection = new SqlConnection(@"<server>"))
{
connection.Open();
using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) SELECT '" + i + "'", connection))
{
command.ExecuteNonQuery();
}
connection.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
根据@AaronBertrand 的回复更新问题。
我有多大?正如我所指定的,它是一个循环中的整数。我不关心可能会或可能不会出现在文本列中的文本。
什么样的驱动?这是一个 7200 …