AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 15510
Accepted
Franz Kafka
Franz Kafka
Asked: 2012-03-25 08:07:03 +0800 CST2012-03-25 08:07:03 +0800 CST 2012-03-25 08:07:03 +0800 CST

了解块大小

  • 772

我的问题针对 Postgres,但来自任何数据库背景的答案可能就足够了。

我的假设是否正确:

  • 磁盘有固定的块大小?
  • RAID 控制器可以有不同的块大小?一个 RAID 块是否会拆分为多个真实磁盘块?
  • 文件系统也有一个独立的块大小,它又被分割成 RAID 块大小?
  • Postgres 使用固定的 8k 块。到文件系统块大小的映射如何在这里发生?Postgres 8k 块是否由文件系统批处理在一起?

设置系统时最好将所有块都设置为 8k?还是设置不重要?我还想知道一些“错误”的块大小设置是否会在崩溃时危及数据完整性?也许如果必须将 Postgres 8k 块拆分为多个磁盘块?

或者没有任何东西被批处理在一起,因此我会因为定义的块大小之间的每一次不匹配而失去磁盘空间?

disk-space disk-structures
  • 1 1 个回答
  • 16810 Views

1 个回答

  • Voted
  1. Best Answer
    ConcernedOfTunbridgeWells
    2012-03-25T09:58:00+08:002012-03-25T09:58:00+08:00

    磁盘扇区

    磁盘具有固定的扇区大小,在某些现代磁盘上通常为 512 字节或 4096 字节;这些磁盘还将具有模拟 512 字节扇区的模式。磁盘将具有不同数量的扇区的磁道;靠近磁盘外部的磁道具有更多扇区,因为它们有更多空间容纳给定的位密度。这样可以更有效地使用磁盘空间;通常,一个磁道在现代磁盘上会有 1,000 个 512 字节的扇区。

    一些格式化结构还可以在 sectrs 中包含纠错信息,这体现在磁盘被低级格式化为 520 或 528 字节扇区。在这种情况下,该扇区仍有 512 字节的用户数据。尽管 i5OS (IBM iSeries) 和各种 SAN 控制器支持,但 Windows 和 Linux 都不直接支持这一点。

    通常扇区/磁头/磁道被翻译成逻辑块地址;由于向后兼容性的历史问题,操作系统(特别是在 IDE 和 SATA 磁盘上)看到的几何形状(磁头 x 扇区 x 磁道)通常与其物理结构无关。

    RAID 条带大小

    RAID 控制器可以为使用条带化的阵列设置条带大小(例如 RAID-5 或 RAID-10)。如果阵列有(例如)一个 128k 的条带,则每个磁盘有 128k 的连续数据,然后下一组数据在下一个磁盘上。通常,您可以期望磁盘每转一圈获得大约一个条带,因此条带大小可能会影响某些工作负载的性能。

    分区对齐

    磁盘分区可能与 RAID 条带完全对齐,也可能不完全对齐,如果未对齐,可能会因拆分读取而导致性能下降。某些系统(例如 Windows 2008 服务器)会自动配置分区以与磁盘卷条带大小对齐。有些(例如 Windows 2003 服务器)不会,您必须使用支持条带对齐的分区实用程序来确保它们支持。

    文件系统块大小

    文件系统将以一定大小的块分配存储块。通常这是可配置的——例如 NTFS 将支持从 (IIRC) 4K 到 64K 的分配单元。分区和文件系统块与 RAID 条带未对齐可能会导致单个文件系统块读取产生多个磁盘访问,如果文件系统块与 RAID 条带正确对齐,则只需要一次访问。

    数据库块大小

    数据库将以给定的块大小在表或索引中分配空间。对于 SQL Server,这是 8K,而 8K 是许多系统的默认值。在某些系统(例如 Oracle)上,这是可配置的,而在 PostgreSQL 上,它是构建时选项。在大多数系统上,对表的空间分配通常是在较大的块中完成的,块在这些块中分配。

    文件系统和数据分配块的未对齐可能会为单个块写入生成多个 I/O,这可能会导致性能下降。

    I/O 分块

    通常,DBMS 实际上会以多于一个块的块的形式执行其 I/O。例如,在 SQL Server 上,所有 I/O 都以 8 个块的块完成,总共 64k)。在 Oracle 上,这是可配置的。对 PostgreSQL 文档的随意检查并没有揭示 PostgreSQL 是否这样做的具体描述,所以我不确定它在这个平台上是如何工作的。

    当 I/O 块大于文件系统块大小或与 RAID 条带边界未对齐时,从 DB 写入磁盘可能会导致多个磁盘写入,从而产生性能损失。

    磁盘空间使用

    不会浪费磁盘空间 - 数据库 I/O 将使用磁盘上的一个或多个物理 I/O 操作来完成 - 但不正确地调整 I/O 会导致效率低下,从而降低数据库速度。必须对齐的主要内容是:

    • RAID 条带和分区 - 分区应从 RAID 条带边界开始。

    • 文件系统 I/O 分配和 RAID 条带/分区边界 - RAID 条带边界必须与文件系统分配单元对齐,并且应该是文件系统分配单元大小的倍数。

    • 磁盘写入大小和文件系统分配单元大小。数据库 I/O 操作和文件系统 I/O 操作之间应该存在 1:1 的关系。

    与其他情况相比,错位不会产生更大的数据完整性问题。数据库和文件系统有适当的机制来确保文件系统操作是原子的。通常,磁盘崩溃会导致数据丢失,但不会导致数据完整性问题。

    • 17

相关问题

  • PostgreSQL:查询全局表空间的位置?

  • SQL 磁盘设置建议 - TempDB、Log DB、数据文件放置问题

  • 为什么一个表的数据空间可能会占用原始数据大小的 4 倍?

  • 未知的 Db 文件格式 - 找出的最佳方法?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve