|
|
1
1
根据您使用的RDBMS,可能会有一些变化,但一般来说:
只有存储在
我想应该是这样的
如果更新一条记录以使其需要更多空间,则会向下移动同一分配块中的记录,如果记录不再适合该块,则会分配另一个块,并在这些块之间分布记录。这意味着记录在分配块内是连续的,但这些块不必在磁盘上是连续的。 |
|
|
2
1
它当然不会分配比需要更多的空间,这将击败使用可变长度类型的点。 在您提到的情况下,我认为下面的行必须在页面上向下移动,也许这是以某种方式优化的。我真的不知道确切的细节,也许其他人可以进一步评论。 |
|
|
3
1
这可能严重依赖于数据库。 但有几点: MVCC 观察数据库实际上并不更新磁盘或内存缓存中的数据。它们插入一个包含更新数据的新行,并将旧行标记为已从上的某个事务中删除。一段时间后,删除的行对任何事务都不可见,并且被回收。
对于空间存储问题,它通常是
在chars的情况下,数据被填充以达到足够的长度。对于varchar或text,头部存储后面的数据长度。 |
|
4
1
编辑 出于某种原因,我认为它被标记为Microsoft SQL Server。不过,我认为答案还是有意义的 这就是为什么 official recommendation 是
在设计表结构时,需要考虑这种权衡。在这个计算中,您可能也需要考虑更新和读取的频率。
值得注意的是
|
|
|
5
1
考虑到问题标题中的varchar2,我认为您的问题集中在Oracle上。在Oracle中,可以使用pctfree子句为数据块内的行扩展保留空间。这有助于减轻更新使行变长的影响。 但是,如果Oracle在块中没有足够的可用空间来写回行,那么它所做的操作称为行迁移;它将原始地址单独留在磁盘上(因此不必更新索引),但它不会将数据存储在原始位置,而是存储指向该行新地址的指针。 在索引大量访问表(如果迁移了大量行)的情况下,这可能会导致性能问题,因为它添加了额外的I/O来满足查询。 |
|
|
developer · 带外键的SQL表设计 1 年前 |
|
|
relatively_random · 确保两个表之间一致的共同参考 1 年前 |
|
|
b126 · 在两种不同的Oracle模式上执行相同查询的速度差异很大 2 年前 |
|
|
robertspierre · 在多对多关系中自动删除未引用的行 2 年前 |
|
|
Michael Samuel · MYSQL在以下情况下自动创建索引 8 年前 |