为什么关系数据库在列上没有只读索引?

Mic*_*son 5 index

在许多编程语言的实现中,如果编译器知道一个变量在其初始赋值后不会改变,它就会开启某些优化。这不会延伸到持久数据吗?如果数据库知道某个列在创建记录后不会更新,难道它不能改变数据的存储或缓存方式以提高性能吗?

Bre*_*zar 4

当然,某些数据库平台确实以不同的方式处理只读或主要读取的数据。

例如,在Oracle中,您可以选择启用结果缓存,这使数据库引擎可以保存查询结果,并在看到相同的查询再次出现时重用它们。这对于很少改变的数据非常有用。但是,在您知道数据会发生变化的情况下,您不想费心启用该功能。

另一个例子:在SQL Server中,如果将整个数据库设置为只读,SQL Server以不同的方式处理锁定。当你无法修改数据时,它不需要担心事务。

我知道您在想什么:“为什么数据库引擎无法弄清楚?” 因为数据访问模式可能很复杂。例如,您可能有一个每天晚上从头开始加载的数据仓库,然后整天都是只读的。您不希望引擎在加载过程中尝试在夜间缓存 ETL 查询结果,因此您需要在夜间关闭此类功能以最大限度地提高加载速度。