【问题标题】:SQL Server insert/Update/Delete and Select performance/deadlock suggestionsSQL Server 插入/更新/删除和选择性能/死锁建议
【发布时间】:2015-10-28 22:57:36
【问题描述】:

我面临一个任务,我必须在 .net 框架中设计一个 Web 应用程序。在此应用程序中,用户将仅(99% 的时间)拥有只读访问权限,因为他们只会看到数据 (SELECT)。

但是,后端数据库将成为每分钟都会更新/插入/删除记录的野兽。预计每年至少会有大约 1000 万条记录添加到系统中,总共不到 5 个表。

问题/请求 1

由于这些更新/插入将非常频繁地发生(每分钟或最晚 2 次),我希望获得一些提示,以便在更改某些行时,选择查询可能不会导致线程死锁,反之亦然。

问题/请求 2

我的计算猜测是,在正常情况下,每分钟 24/7 只会插入几百条记录(并根据某些条件更新/删除)。如果我编写了一个 C# 工具,该工具将从任意数量的源(xml、csv 或直接从远程数据库中的某些表中获取数据,配置文件或注册表设置将指示从哪种格式导入数据)然后执行插入/更新/删除,这是否足够快和/或会导致死锁问题?

我希望我的问题足够详细...如果这一切都含糊不清,请告诉我...

提前致谢

【问题讨论】:

  • 就个人而言,我会确保打开数据库选项READ_COMMITTED_SNAPSHOT。在这种模式下,读者不会阻止作者,作者也不会阻止读者。这种模式会消耗更多的温度,但我认为这是完全值得的,并且避免了使用像nolock 提示这样的技巧。除此之外,您还需要自己进行测试和基准测试。
  • 您需要确定的第一件事是,您的应用用户是否需要在进入数据库后立即查看最新更新,或者他们可以接受稍微旧的数据。如果答案是后者,那么您可以为您的应用程序使用缓存、复制的数据库,甚至是专用的报告数据库,这些数据库会定期更新。
  • 我只是先制作应用程序,然后看看您是否有死锁问题。 SQL Server 非常擅长为您管理这些。
  • 这是我使用 SQL 拦截器的解决方案。 stackoverflow.com/questions/1302746/…

标签: c# asp.net sql-server database


【解决方案1】:

我将首先回答您的问题#2:根据您描述的场景,它会足够快。但请记住向数据库发出直接的 sql 命令。我个人有一个非常非常相似的场景,应用程序运行没有任何问题,但是当计划的作业使用工具(如 nhibernate)执行多次插入/删除时,确实会发生死锁。所以,再次,如果可能的话,直接执行 sql 语句。

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

例如:

SELECT * FROM table_sales WITH (NOLOCK)

它避免了数据库上的阻塞。但是您必须记住,您可能正在阅读过时的信息(再一次,在您描述的场景中,这可能不会有问题)。

您也可以尝试“READ COMMITTED SNAPSHOT”,它从 2005 版本开始就受支持,但对于这个示例,我将保持简单。稍微搜索一下,以确定哪个可能是您的最佳选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多