在一个相当大的网站上工作。有一些表格示例 - 经常受到打击的客户表格。
问题
我们正在编写一段代码来选择一群客户并发送邮件等(不是关键任务)。这些选择通常会产生大约 20000 条记录。我们显然不希望这些 select 语句阻止对 customer 表的常规访问。
由于对数据的操作绝对不是关键任务,因此我们采取了使这些读取未提交的方式。
但是,如果在代码中我们进行带有限制和偏移量的选择并保持循环,则不会进行这些大量选择,这会减少对数据库的锁定。
换句话说 - 在减少锁定等方面,20 个 select 语句每个检索 1000 条记录是否比 1 个 select 语句检索 20000 条记录更可取。
任何建议将不胜感激。
好的,首先,我需要挑一点:
仅当结果的准确性不重要时才应考虑使用
READ UNCOMMITTED
/ ,因为这是事务隔离级别所影响的。我知道该操作不是关键任务,但这不应该成为选择限制较少的隔离级别的驱动因素。NOLOCK
如果您继续使用
READ UNCOMMITTED
,两种方法之间的锁定开销将相同(即,不会获取任何锁)。但是,运行多个语句而不是一个语句会影响其他事情,例如查询编译(使用 CPU)、网络干扰和应用程序的复杂性。在这种情况下,我认为发送邮件程序的操作相对较少(我可能是错的),因此后一个因素可能是最重要的考虑因素。如果您出于准确性原因选择切换回更高的隔离级别,那么就锁定而言,这是完全不同的球类游戏。
20k 条记录并不多。您是否将
SELECTing
其他表中的其他数据作为邮寄的一部分,这会减慢速度?您保持交易开放的时间是否超过您需要的时间?否则,您可以使用乐观的并发隔离级别之一吗
Snapshot
?Read Committed Snapshot
他们应该允许您阅读而不会阻塞。