sql - 如何将写入与读取分开以最大程度地减少大量读取查询的影响?

标签 sql sql-server database

<分区>

我的数据库中有大量写入的表。需要由其他人运行只读查询。我不知道他们查询的复杂性和数量,但我知道当他们开始这样做时,写入变得非常慢。因此,将写入与读取分开似乎是可行的方法。

复制是答案吗?我还可以尝试什么?

最佳答案

与性能相关的任何事情“视情况而定”。

一般来说,你忽略了,因为一般来说,隔离级别无法为你解决这类问题。你可以翻书看看它是如何工作的。一般来说,如果您不确切地知道自己在做什么,那么干涉它是不明智的。

如果您结束处理有关它的问题,您可以:

1) 复制(但你需要深入研究它的细节)。 优点是简单,缺点:浪费服务器磁盘和cpu。

2) 创建 stag 表。 这是一个简单的解决方案,适用于在大量读取表上进行大量写入的情况。例子。你有一个网络服务,用户有时会上传大型 csv 文件,这些数据会保存在 stag 表中。那个简单的无索引表充当原始数据的缓冲区(或队列)。稍后在“机会窗口”中将数据插入真实表中。缺点是上传的数据不容易查询。优点是很容易处理格式错误的数据,并且只让经过清理的数据进入您的数据库。实现起来也非常容易。例如,您可以在每日完整备份之后或之前为其创建一个 SQL 服务。

3) 通过查询微调隔离级别查询:优点是如果你真的知道要做什么,系统会很糟糕缺点是:很难做正确的 tweeks,容易让你的系统陷入死锁、幽灵 &脏读和丢失数据。还需要大量时间以正确的方式实现和维护(您必须密切关注调整后的查询以确保)。

EDIT 关于 WITH(NOLOCK) 评论:认真的家伙?自 SQL 2000 以来,它已被弃用!这是懒人的 Elixir ,但效果不佳。考虑您进行脏读、处理一些数据并保留更多与该脏数据相关的数据的场景。现在回滚撤消脏的,你现在得到一个孤立的行或更糟糕的数据完整性 hell 。不要再使用它,除非您仍在使用 SQL Server 7。研究隔离级别以了解 NOLOCK 变得多么糟糕和无用(在过去的 15 年里!)

关于sql - 如何将写入与读取分开以最大程度地减少大量读取查询的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324966/

相关文章:

c# - 数据库的正确模型,每个用户都有一个表

mysql - 有两个用户 ID 表和它们之间的链接

sql-server - 如何给连接列表中的服务器一个别名

sql - 在内部连接中排序

PHP警告: mysqli_fetch_object() expects parameter 1 to be mysqli_result,

c# - ExRam Gremlinq 无法与 Cosmos DB 配合使用

java - 使用模拟对象进行 Junit 测试

php - php/mysql 函数的奇怪行为

sql - oracle中的条件选择语句

c# - 何时/如何使用 SQL Server XML 数据类型?