相关疑难解决方法(0)

将数组参数传递给存储过程

我有一个进程可以抓取一堆记录(1000 条)并对它们进行操作,当我完成后,我需要将其中的大量记录标记为已处理。我可以用一个大的 ID 列表来表明这一点。我试图避免“循环更新”模式,所以我想找到一种更有效的方法来将这个 ID 包发送到 MS SQL Server 2008 存储过程中。

提案#1 - 表值参数。我可以定义一个只有一个 ID 字段的表类型,然后发送一个包含要更新的 ID 的表。

建议 #2 - XML 参数 (varchar) 和 OPENXML() 在 proc 主体中。

建议 #3 - 列表解析。如果可能的话,我宁愿避免这种情况,因为它看起来笨拙且容易出错。

其中有什么偏好,或者我错过了什么想法?

sql-server-2008 sql-server

63
推荐指数
7
解决办法
27万
查看次数

造成死锁的主要原因是什么,它们可以预防吗?

最近我们的一个 ASP.NET 应用程序显示了一个数据库死锁错误,我被要求检查并修复该错误。我设法找到死锁的原因是一个存储过程,它严格更新游标内的表。

这是我第一次看到这个错误,不知道如何有效地跟踪和修复它。我尝试了我知道的所有可能的方法,最后发现正在更新的表没有主键!幸运的是,这是一个身份栏。

后来我发现为部署编写数据库脚本的开发人员搞砸了。我添加了一个主键,问题就解决了。

我感到很高兴并回到我的项目中,并做了一些研究以找出导致僵局的原因......

显然,这是导致死锁的循环等待条件。没有主键的更新显然比有主键需要更长的时间。

我知道这不是一个明确定义的结论,这就是我在这里发布的原因......

  • 缺少主键是问题吗?
  • 除了(互斥、保持等待、无抢占和循环等待)之外,是否还有其他条件会导致死锁?
  • 如何防止和跟踪死锁?

sql-server-2008 sql-server deadlock

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

证明在每个查询中不使用 (nolock) 提示

您是否曾经不得不证明不使用查询提示是合理的?

WITH (NOLOCK)在每个访问非常繁忙的服务器的查询中都看到了。开发人员认为它应该默认开启,因为他们讨厌在他们的代码中看到它数千次。

我试图解释说它允许脏读,最终它们会得到坏数据,但他们认为性能权衡是值得的。(他们的数据库一团糟;难怪他们有性能问题。)

如果你有一个明确的例子来说明如何反对这种滥用NOLOCK提示的情况,那将不胜感激。

sql-server locking nolock

23
推荐指数
3
解决办法
4972
查看次数

标签 统计

sql-server ×3

sql-server-2008 ×2

deadlock ×1

locking ×1

nolock ×1