【问题标题】:SQL Server slow in simple insert statementSQL Server 在简单的插入语句中速度很慢
【发布时间】:2015-09-21 12:21:20
【问题描述】:

有人遇到过这个问题吗?一个简单的插入语句耗时 7 秒,这个表包含 300 行记录。此表上没有触发器。

表:

CREATE TABLE [dbo].[Table]
(
    [intMsgIn] [int] IDENTITY(1,1) NOT NULL,
    [charType] [char](4) NOT NULL,
    [dtTrx] [datetime] NOT NULL,
    [varMsg] [varchar](4000) NULL,

    CONSTRAINT [PK_Tbl] PRIMARY KEY CLUSTERED ([intMsgIn] ASC)
        WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
              IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
              ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

SQL语句:

INSERT INTO Table (charType, dtTrx, varMsg)  
VALUES(@charType, getdate(), @varMsg)  

SELECT @@IDENTITY  

此 SQL 语句是存储过程中的代码,然后由 C# 应用程序调用。

有什么可能的原因导致这个慢吗?

【问题讨论】:

  • 数据库还在做什么?是否存在可能锁定表的查询?
  • 我建议使用 SCOPE_IDENTITY() 而不是其他任何东西(如@@IDENTITY)来获取新插入的标识值。 See this blog post for an explanation as to WHY
  • 附带说明,不要使用@@IDENTITY,使用SCOPE_IDENTITY()
  • 当你从 SSMS 中得到它时会发生什么?
  • 你是如何从 C# 调用它的?您可以发布您正在使用的代码吗?

标签: c# sql-server database-performance


【解决方案1】:

只是一个简单的提示。再试一次,看看sp_who2 N'ACTIVE'。它应该向您显示所有活动的正在运行的查询。您将有一个名为BlkBy 的列。

由于您的查询非常简单,我相信应该有任何类型的锁。 BlkBy 列将为您提供阻止您的任务的SPID。在这种情况下,您可以重新检查是否有并发的INSERTUPDATEDELETE-Statements 生成另一个锁。

如果使用sp_who2 进行测试太快,您还可以设置跟踪并检查结果,如果在您的INSERT 期间有任何锁定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多