小编gbn*_*gbn的帖子

SQL Server 2005阻止问题(ASYNC_NETWORK_IO)

我负责在IIS和SQL Server 2005上运行的第三方应用程序(无法访问源)(500个并发用户,1TB数据,8个IIS服务器).我们最近开始看到对数据库的严重阻塞(在生产中运行此应用程序几个月后没有问题).这种情况在白天以大约每30分钟的随机间隔发生,每次影响20到100次.所有会话最终都会使应用程序超时并且会话中止.

问题消失,然后逐渐重新出现.负责阻止的SPID始终具有以下功能:

  • 等待类型= ASYNC_NETWORK_IO
  • 正在运行的SQL是"(@claimid varchar(15))SELECT claimid,enrollid,status,orgclaimid,resubclaimid,primaryclaimid FROM claim WHERE primaryclaimid = @claimid AND primaryclaimid <> claimid)".这是相对无害的SQL,应该只返回一个或两个记录,而不是大数据集.
  • 没有其他SQL语句涉及阻塞,只有这个SQL语句.
  • 这是参数化SQL,其执行计划缓存在sys.dm_exec_cached_plans中.
  • 此SPID在声明表上具有对象级S锁,因此也会阻止声明表的所有UPDATE/INSERT.
  • 主机ID各不相同.不同的Web服务器负责阻塞会话.例如,有时我们追溯到Web服务器1,有时是Web服务器2.

当我们追溯到阻塞中涉及的Web服务器时,我们会看到以下内容:

  • Web服务器上的事件日志中始终存在某种与应用程序相关的错误,该错误链接到SQL会话中的主机ID和主机进程ID.
  • 错误消息各不相同,通常是某种SystemOutofMemory.(这些错误消息似乎与我们过去看到的错误消息类似,没有产生如此严重的后果.我们认为之前发生过,但没有导致阻塞.为什么现在?)
  • Web服务器或SQL Server上的网络适配器没有已知问题.

(无论如何,违规查询返回的记录集很小.)

事情排除在外:

  • 索引经常进行碎片整理.
  • 统计定期更新.
  • 关于claim.primaryclaimid的统计数据的样本量增加.
  • 强制重新编译缓存的执行计划.
  • 使用primaryclaimid,claimid创建复合索引.
  • 没有网络问题.
  • Web服务器上没有已知问题.
  • Web服务器上的应用程序软件没有变化.

我们假设事件链是这样的:

  1. Web服务器进程提交上面的SQL.
  2. SQL Server执行SQL,在此期间它获取声明表上的锁.
  3. Web服务器进程出错并死亡.
  4. SQL服务器会话挂起,等待Web服务器进程读取数据集.
  5. 需要在声明表的某些部分(处理声明的任何人)上获取X锁的SQL Server会话被声明表上的锁阻止,并保持阻塞,直到它们全部达到应用程序超时.

任何在等待供应商帮助时进行故障排除的建议都将受到欢迎.

有没有办法强制SQL Server仅锁定此特定SQL语句的行/页级别?有没有办法在ASYNC_NETWORK_IO等待上设置阈值?

performance sql-server-2005

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

T-SQL:使用OVER和PARTITION BY

我有以下数据

 |  Item  | Value |    Date   |
 ------------------------------
 |   1    |  10   | 01.01.2010
 |   1    |  20   | 02.01.2010
 |   1    |  30   | 03.01.2010
 |   1    |  40   | 04.01.2010
 |   1    |  50   | 05.01.2010
 |   1    |  80   | 10.01.2010
 |   2    |  30   | 04.01.2010
 |   2    |  60   | 06.01.2010
 |   2    |  70   | 07.01.2010
 |   2    |  80   | 08.01.2010
 |   2    |  100  | 09.01.2010
Run Code Online (Sandbox Code Playgroud)

以下声明

SELECT   Item, Value, MIN(Date) …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2005

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

UPDATE语句包含在IF EXISTS块中

我正在尝试编写一个更新列的DML脚本,但我想确保该列首先存在,所以我将它包装在IF EXISTS块中

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN
    UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21
END
Run Code Online (Sandbox Code Playgroud)

所以奇怪的是,即使条件失败,它也会尝试执行更新.所以列不存在,UPDATE语句运行,我得到一个错误.为什么?

更奇怪的是,这确实有效:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Client' AND COLUMN_NAME='IsClarityEnabled') 
BEGIN
    EXEC('UPDATE Client SET IsClarityEnabled = 1 WHERE ClientID = 21')
END
Run Code Online (Sandbox Code Playgroud)

UPDATE命令有什么特别之处导致它以这种方式运行吗?

sql t-sql sql-server

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

比较表中的两个日期并使用SQL返回更大的日期

两个日期都存储在一个表中.如果date1更大,我想返回date1,如果date2更大,我想返回date2.我希望它们成为更大的查询的一部分,所以我想要一个主要的查询,但如果这是不可能的,我可以使用临时表,然后使用第二个查询.代码将在存储过程中执行.

t-sql sql-server comparison date

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

使用Windows XP作为SQL Server

我想知道是否有人知道使用Windows XP作为文件和SQL服务器的任何限制.我问,因为我们销售的应用程序之一,需要客户设置文件共享服务器和SQL Server.我们已经允许他们使用SQL Express,但我们想看看我们是否可以建议将Windows XP作为Windows Server的低成本替代品.如果对文件或数据库的并发连接数有限制,我可以看到的唯一潜在问题.我们只是考虑向拥有10-15名用户的小型公司推荐这一点.

sql-server windows-xp sql-server-express

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

整洁的SQL

我正在寻找一个工具,我可以用来清理(格式化,标签等...)我的存储过程和视图.有什么像html的整洁,但对于免费/开源的SQL?

sql sql-server ssms

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

如何确定列大小是以字节为单位还是以列元数据中的字符为单位?

我正在开发一些软件,它必须临时在各种数据库(Oracle、DB2、SQLServer)中创建虚拟条目。该行中的每一列都填充有随机数据。

该代码使用 java 中的 java.sql.DataBaseMetaData 类来获取 COLUMN_SIZE 属性,以计算出要在 VARCHAR2 和其他字符串列类型中存储的随机字符串的大小。

DatabaseMetaData metadata = connection.getMetaData();
while (resultSet.next()) {
  ResultSet resultSet = metadata.getColumns(...);
  int size = resultSet.getInt("COLUMN_SIZE");
}
Run Code Online (Sandbox Code Playgroud)

问题是,至少在 Oracle 中,我似乎无法弄清楚列长度是以字节还是字符形式返回的。此外,根据编码的不同,字符的字节数也不同。将所有这些结合起来,我收到一些 SQL 错误,因为尝试插入的字符串太大。我错过了一些明显的东西吗?

java sql sql-server oracle db2

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

我想在Microsoft SQL Server中的两个不同的行中交换列的值

我想在Microsoft SQL SERVER中执行以下两个SQL查询

UPDATE Partnerships SET sortOrder = 2 WHERE sortOrder = 1;
UPDATE Partnerships SET sortOrder = 1 WHERE sortOrder = 2;
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,我不允许sortOrder包含相同的值,它是一个唯一的键.我怎么能绕过这个,因为第一个查询违反了唯一的密钥规则并终止了?或者我是否必须摆脱我所拥有的独特关键规则?

谢谢!

t-sql sql-server

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

SQL插入多语言数据 - 丢失变音符号等

将多语言数据插入SQL 2008数据库(nvarchar字段)我注意到它似乎丢失了一些特殊的字符标记.

例如

    INSERT INTO [dbName].[dbo].[tbl_Question_i18n]  
           ([QuestionId]  
           ,[LanguageId]  
           ,[QuestionText])  
     VALUES  
           (@lastinsertedquestionid  
           ,@romanian  
           ,'Num?r unic de referin?? (URN)')  
Run Code Online (Sandbox Code Playgroud)

插入为'Numar unic de referinta(URN)'

虽然如果我"编辑前200行",我可以将相同的文本直接粘贴到该字段中,没有任何问题.

我错过了什么?

sql t-sql sql-server unicode nvarchar

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

sql多案例声明

嗨,我正在尝试编写多个案例陈述来预设作业的优先级.有一些表和ID涉及到这一点,但基本上我想检查作业是否存在,如果它与如果相关的问题是80,然后有多个案例状态,以便如果作业次要类别是1然后答案将是High的ID.到目前为止我所做的代码可以解释得更好......

 ALTER Procedure [dbo].[usp_CreatePresetPriority]
   @HelpdeskID int,
   @MinorCategoryID int
 As
 BEGIN

IF EXISTS(SELECT * FROM TicketInformation WHERE TicketID = @HelpdeskID AND QuestionID = 80)
    BEGIN
        UPDATE TicketInformation
        SET AnswerInput = Null, 
            AnswerID = CASE @MinorCategoryID WHEN 87 THEN 129 END
        WHERE TicketID = @HelpdeskID And QuestionID = 80

    END

ELSE
    BEGIN
        INSERT INTO TicketInformation (TicketID, QuestionID, AnswerID, AnswerInput)
        VALUES (@HelpdeskID, 80, CASE @MinorCategoryID WHEN 87 THEN 129 END, Null)
    END
Run Code Online (Sandbox Code Playgroud)

所以这只适用于一个选项 - 其中@MinorCategoryID = 87我希望有超过1个语句设置@MinorCategoryID,而91THEN 130等...

我试过了...

    IF EXISTS(SELECT * FROM …
Run Code Online (Sandbox Code Playgroud)

sql

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