在生产环境中选择风险最小的方法是什么?

Zik*_*ato 5 performance sql-server-2008 sql-server query-performance

我的目标是在生产中使用选择而不影响其他任何东西。

当我刚接触 SQL 时,我只是写了简单的选择,但后来我知道这会导致锁定。

如果我不关心脏读,我可以在每个选择上使用 nolocks 或设置事务隔离级别来读取未提交。

但我确实关心脏读,所以我选择了隔离级别快照。隔离级别快照写入 tempdb,我不知道这是否有问题(额外写入数据库意味着更慢的 DB 和更少的空间?)

那么在 DB 上编写选择的最少侵入性方法是什么,我不能减慢它的速度或创建共享锁?我应该回到隔离级别读取未提交的每个查询吗?

这是从开发人员的角度提出的问题。我不知道有关 DB 设置的详细信息,但希望以最少麻烦的方式使用选择。

geo*_*tnz 5

正确答案取决于很多因素:

  • 您的数据库的大小。
  • 缓冲池与数据库的大小相比。
  • 后台(即:不是您)查询活动的数量和性质。
  • 您要运行的查询的性质。
  • 您首先会遇到什么瓶颈(CPU、I/O、tempdb 吞吐量)。
  • 在正常工作负载中您愿意容忍多少额外延迟。

您应该始终获得估计的查询计划并查找密集操作,例如扫描大型表/索引或对大量行进行排序。使用实时、频繁使用的数据库时,最重要的考虑因素之一是避免通过运行需要将大量数据放入缓存的查询来将页面驱出缓冲池。

如果您担心选择查询并行并消耗过多的 CPU,您可以通过添加以下内容将查询限制为单个核心:OPTION (MAXDOP 1)查询末尾来将查询限制为单个核心。

如果您的数据库没有启用“读取已提交快照”,请查看是否可以将其打开。这将为您的选择提供类似快照的行为,这样您就不会阻止写入者。但是,如果您运行较长的即席查询并且存在大量写入活动,则会将大量数据写入 tempdb。

您还可以研究使用资源调控器来限制自己。