SQL Server插入/更新/删除和选择性能/死锁建议

4
我面临一个任务,需要在.NET框架中设计一个Web应用程序。在这个应用程序中,用户通常只有只读访问权限,因为他们只会查看数据(SELECT),占99%的时间。
然而,后端数据库将成为管理记录插入/删除/更新的巨头。预计每年系统中至少会添加约1000万条记录,分布在不到5个表中。
问题/请求1:由于这些更新/插入将非常频繁(最新的每一两分钟),我希望获得一些提示,以便当一些行正在更改时,查询操作不会导致线程死锁或反之亦然。
问题/请求2:我大概估算,在正常情况下,每分钟会插入几百条记录,24/7地进行更新/删除(基于某些条件)。如果我编写一个C#工具,从任意数量的源(XML、CSV或直接从远程数据库的某些表中)获取数据,然后进行插入/更新/删除,那么这是否足够快,或者是否会导致死锁问题?
我希望我的问题已经详细说明了...如果有什么不清楚的,请告诉我...
提前感谢您。

4
个人建议只需确保打开数据库选项READ_COMMITTED_SNAPSHOT,在该模式下,读者不会阻塞写者,写者也不会阻塞读者。该模式会消耗更多的临时空间,但我认为完全值得,并避免使用nolock提示等技巧。除此之外,您需要自行测试和基准测试。 - sstan
你需要首先确定的是,你的应用程序用户是否需要在数据更新后立即看到最新的更新,或者他们可以接受稍旧的数据。如果答案是后者,那么你可以使用缓存、复制的数据库,甚至为你的应用程序专门设计一个报告数据库,在定期间隔内进行更新。 - DhruvJoshi
我会先制作应用程序,然后再查看是否存在死锁问题。SQL Server 在这方面的管理相当不错。 - nportelli
这是我使用SQL拦截器的解决方案。 https://dev59.com/q3M_5IYBdhLWcg3wn0hO#39518098 - Tola Ch.
1个回答

0

我先回答你的问题#2:根据你所描述的情况,它足够快。但请记得向数据库发出直接的SQL命令。我个人有一个非常相似的场景,应用程序运行良好,但当计划任务使用工具(如nhibernate)执行多个插入/删除时,死锁会发生。因此,如果可能,请执行直接的SQL语句。

问题#1:您可以使用“SELECT WITH NOLOCK”。

例如:

SELECT * FROM table_sales WITH (NOLOCK)

它避免了数据库上的阻塞。但是请记住,您可能正在阅读过时的信息(再次强调,在您描述的情况下,这可能不是问题)。

您还可以尝试“READ COMMITTED SNAPSHOT”,它从2005版本开始支持,但是对于此示例,我将保持简单。搜索一下,以决定哪个可能是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接