小编Nic*_*aro的帖子

Eager 线轴表示什么问题

当前在 SQL Server 2008 R2 上运行

我正在尝试提高 UPDATE 语句的性能。我注意到弹出显示计划中的 Eager Spool 操作。我对假脱机操作的理解非常基本 - 它们在更新期间为表创建临时存储。

我也知道,虽然它们可以防止更糟糕的执行时间,但急切的假脱机通常表明表结构和/或查询语句存在潜在问题。

我的问题很简单:当您在查询计划中看到 Eager Spool 时,您首先要解决哪些问题?

我将分析我们系统的每个部分以提高性能 - 我只是在寻找关于我应该从哪里开始的指导。

sql-server sql-server-2008-r2

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

写入错误日志

使用 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 logs sql-server-2008-r2 error-handling

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

非聚集列上的聚集索引更新

使用: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

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

插入/更新死锁

使用 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_namelast_namescores、 中的任何一个或全部,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

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

SQL Server - 事务缓慢

我现在在 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 …

performance sql-server sql-server-2008-r2 query-performance

-2
推荐指数
1
解决办法
1758
查看次数