是否可以在任何版本的 SQL Server 中禁用特定表的所有锁?
我有一些表在部署时填充了数据。例如,其中一个较小的表[items].[Colour]
包含'Blue', 'Green', 'Red', 'White'
。部署后,应用程序只会从这些表中进行选择(从不插入、更新或删除)。我开始思考,如果这些表只能从中读取,那么锁有什么意义呢?我认为获得锁定需要一些时间。即使那段时间被证明是微不足道的,在我自己测试差异之前,我的一部分也不会满意。
当我自己搜索答案时,我发现我可以将整个数据库标记为只读,并且可能会有一些好处。我想要这些好处,但要逐桌进行。我还阅读了有关禁用锁升级的信息,但如果我正确理解文档,那只会导致更多(尽管粒度更细)锁,这与我想要实现的相反。
我知道我可以更新每个使用该表的查询以获得NOLOCK
提示,但这会引入一个次要问题。将来当我教我的应用程序如何Colour
在运行时学习新的 s 时,我是否要更新每个使用该表的查询以删除NOLOCK
提示?这听起来很麻烦。
这个问题似乎收到了一些反对票,并且没有提供任何解释,我将假设这是因为这似乎是我要求的过早优化。正如一条现已删除的评论所指出的,过早的优化是万恶之源。我知道,我并没有过早地优化。这就是为什么。
我可以每秒轮询一次此 API 。它没有在链接页面上说明,但我在某处看到了规则(相信我)。无论如何,我的应用程序需要 100 毫秒到 800 毫秒才能发出 HTTP 请求、下载 gzip 压缩的文本文件并解压缩它。大部分时间都花在等待 API 响应上。这让我几乎没有时间将所有数据处理成漂亮、整洁、规范化的数据库表。如果我要有竞争力,我必须在 200 毫秒或更短的时间内处理所有数据。我非常接近实现我的目标,以至于我通过丢弃我可能不需要的数据来偷工减料,将所有数据一次性发送到一个大的丑陋的数据包中,等等。所以是的,我正在优化,但不是过早地(在我看来)。
我也认识到我所要求的可能没有性能优势。事实上,到目前为止提供的一种解决方案似乎根本不会影响性能。不过,在我问这个问题之前,我不可能知道这一点,现在任何想知道这是否对他们有帮助的未来访客都可以看到我执行的测试,并且知道这是不值得的。那不是很有用吗?
如果这不能解决反对者的担忧,请考虑发表评论,说出你认为我可以改进的问题。
您可以将单个文件组设置为只读,但除非最近的 SQL 服务器版本更改了主控,否则这不会带来将整个数据库设置为只读时发现的减少锁定的好处。
您可以尝试将只读配置保存在单独的数据库中,并使用跨数据库查询来访问它。使用同义词以便您可以引用这些对象,就好像它们仍然是本地表一样。在我脑海中,我不能说这是否会按预期运行(减少锁定),或者查询计划程序/运行程序最终是否会像对待只读文件组一样对待这种安排,但它可能作为一个选项值得测试。如果它确实有效,那么将对象迁移回普通数据库只需将数据复制到新表并更新同义词,或者完全执行同义词并直接为表命名(如果这是唯一的实例,我建议后者该数据库的前者,如果您有许多在给定时间可能处于不同版本的数据库,
注意:(正如 Rainbolt 在下面的评论中指出的那样)使用这样的跨数据库访问将阻止您定义外键约束,因此即使这确实通过锁定差异带来了性能优势,它仍然不会推荐的。因此,将上述答案视为“技术上你可以”而不是好的建议!您可以使用检查约束以一种方式实现约束,或者在通常具有 FK 约束的任何地方触发,但这是维护/调试和强制执行另一种方式的额外工作(如果它是,则不允许从引用的对象中删除行)被别处的行引用)是不可能的。