【发布时间】:2014-02-15 23:51:57
【问题描述】:
我正在添加一个数据类型为 varchar2(1000) 的列,该列将用于存储大量消息(大约(600 个字符)。它是否会影响具有大数据类型长度的查询的性能,如果是这样如何? 我偶尔会有一个查询选择该列。即使在某些地方该字段中的值 100 个字符,表是否会在此处消耗额外的内存?
【问题讨论】:
标签: oracle database-design oracle11g sql-tuning
我正在添加一个数据类型为 varchar2(1000) 的列,该列将用于存储大量消息(大约(600 个字符)。它是否会影响具有大数据类型长度的查询的性能,如果是这样如何? 我偶尔会有一个查询选择该列。即使在某些地方该字段中的值 100 个字符,表是否会在此处消耗额外的内存?
【问题讨论】:
标签: oracle database-design oracle11g sql-tuning
它会影响性能吗?视情况而定。
如果“添加列”意味着您有一个现有表,其中包含要添加新列的现有数据,您是否要为旧数据填充新列?如果是这样,根据您的 PCTFREE 设置和行的现有大小,将每行的大小平均增加 600 字节很可能会导致行迁移,这可能会增加查询需要的 I/O 量执行以获取一行。您可能希望使用新列创建一个新表,并将旧数据移动到新表中,同时填充新列(如果这是一个问题)。
如果您的查询涉及对表进行全表扫描,那么您所做的任何增加表大小的操作都会对这些查询的速度产生负面影响,因为它们现在必须读取更多数据。
当您增加行的大小时,您会减少每个块的行数。这往往会增加缓冲区缓存的压力,因此您要么从该表中缓存更少的行,要么更快地老化其他一些块。其中任何一个都可能导致单个查询执行更多的物理 I/O 而不是逻辑 I/O,因此运行时间更长。
VARCHAR2(1000) 只会使用实际需要的空间来存储特定值。如果某些行只需要 100 个字节,Oracle 将只在块内分配 100 个字节。如果其他行需要 900 字节,Oracle 将在块内分配 900 字节。
【讨论】:
VARCHAR2(1000) 非常适合任何类型的应用程序。如果您确实需要存储更少(或更多)不同的数据类型将是合适的。