【发布时间】:2015-03-19 14:11:14
【问题描述】:
我有两个表被多个用户大量查询。平均每秒对这些表发出 100 多个(更新/选择)查询。
父母 孩子
*GrantParent 不参与join 所以我说的只有两个表
我需要为每个父母重新排序所有孩子。可以有 3000-4000 个父母,每个父母可能有大约相同数量的孩子。
列类型: 父 ID GUID 子索引 int 文件 ID Varchar IsDeleted 位
表在 PK 上有聚集索引,在 where 使用的列上有非聚集索引。
UPDATE C SET C.ChildIndex = T.ReOrderedChildIndex FROM [Child] C INNER JOIN
(
SELECT ROW_NUMBER() OVER (PARTITION BY dbo.Child.[ParentID] ORDER BY [ChildIndex] asc) AS ReOrderedChildIndex,
dbo.Child.ChildIndex,
dbo.Child.FileID,
dbo.Child.ParentID
FROM dbo.Child WITH (NOLOCK) INNER JOIN
dbo.Parent WITH (NOLOCK) ON dbo.Child.ParentID = dbo.Parent.ParentID
WHERE (dbo.Parent.GrandParentID = 1) AND (dbo.Child.IsDeleted = 0)
) T
ON C.FileID =T.FileID AND (C.ParentID=T.ParentID) AND (C.IsDeleted = 0)
即使我在所有数据选择存储过程中都使用了 WITH (NOLOCK),上面的查询看起来也需要更长的时间并且等待选择查询。
还有另一个查询以与上述查询中对孩子相同的方式对父母进行重新排序。
在“活动监视器”中,会显示选定存储过程的锁。
重新排序执行重新排序的最佳方式是什么?
我遇到以下问题,并认为它们源于这些查询: 1-随机发生死锁。 2- 经常发生连接池超时。
*Windows 应用程序使用启用了连接池的 Entlib 4.0 访问数据库,池最大大小为 200。
SQL Server 2008 R2
【问题讨论】:
-
Nolock 在数据更改查询、插入、更新、删除或合并中不起作用。
-
父子关系是否只允许一级? Parent->Child 或 Parent->Child1->Child2->Child3?
-
只有一层。孩子只能是孩子,父母只能是父母,所以不涉及递归或自连接。对于一位祖父母来说,所有父母都是独一无二的,对于每个父母来说,所有孩子都是独一无二的。关于更新中的 Nolock .. 我认为 update 有一个嵌套的选择,所以应该考虑选择 nolock 吗?
-
您可以 NOLOCK 父级,但您绝对不能告诉它不要锁定正在更新的表。
-
更新数据时不要使用 NOLOCK。您可能会损坏您的数据库。当查询速度不够快时,您需要改掉只在查询中抛出 NOLOCK 的习惯。那不是魔术快速按钮。 blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere
标签: sql-server winforms sql-update query-optimization database-deadlocks