我负责在IIS和SQL Server 2005上运行的第三方应用程序(无法访问源)(500个并发用户,1TB数据,8个IIS服务器).我们最近开始看到对数据库的严重阻塞(在生产中运行此应用程序几个月后没有问题).这种情况在白天以大约每30分钟的随机间隔发生,每次影响20到100次.所有会话最终都会使应用程序超时并且会话中止.
问题消失,然后逐渐重新出现.负责阻止的SPID始终具有以下功能:
当我们追溯到阻塞中涉及的Web服务器时,我们会看到以下内容:
(无论如何,违规查询返回的记录集很小.)
事情排除在外:
我们假设事件链是这样的:
任何在等待供应商帮助时进行故障排除的建议都将受到欢迎.
有没有办法强制SQL Server仅锁定此特定SQL语句的行/页级别?有没有办法在ASYNC_NETWORK_IO等待上设置阈值?
我有以下数据
| 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) 我正在尝试编写一个更新列的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命令有什么特别之处导致它以这种方式运行吗?
两个日期都存储在一个表中.如果date1更大,我想返回date1,如果date2更大,我想返回date2.我希望它们成为更大的查询的一部分,所以我想要一个主要的查询,但如果这是不可能的,我可以使用临时表,然后使用第二个查询.代码将在存储过程中执行.
我想知道是否有人知道使用Windows XP作为文件和SQL服务器的任何限制.我问,因为我们销售的应用程序之一,需要客户设置文件共享服务器和SQL Server.我们已经允许他们使用SQL Express,但我们想看看我们是否可以建议将Windows XP作为Windows Server的低成本替代品.如果对文件或数据库的并发连接数有限制,我可以看到的唯一潜在问题.我们只是考虑向拥有10-15名用户的小型公司推荐这一点.
我正在寻找一个工具,我可以用来清理(格式化,标签等...)我的存储过程和视图.有什么像html的整洁,但对于免费/开源的SQL?
我正在开发一些软件,它必须临时在各种数据库(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 错误,因为尝试插入的字符串太大。我错过了一些明显的东西吗?
我想在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包含相同的值,它是一个唯一的键.我怎么能绕过这个,因为第一个查询违反了唯一的密钥规则并终止了?或者我是否必须摆脱我所拥有的独特关键规则?
谢谢!
将多语言数据插入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行",我可以将相同的文本直接粘贴到该字段中,没有任何问题.
我错过了什么?
嗨,我正在尝试编写多个案例陈述来预设作业的优先级.有一些表和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-server ×8
sql ×6
t-sql ×5
comparison ×1
date ×1
db2 ×1
java ×1
nvarchar ×1
oracle ×1
performance ×1
ssms ×1
unicode ×1
windows-xp ×1