列的数据类型会影响查询性能吗?

tai*_*ail 8 postgresql database-design optimization query-performance

假设我有这张表:

Table "public.orders"
         Column      |     Type      | Collation | Nullable | Default 
    -----------------+---------------+-----------+----------+---------
     o_orderkey      | integer       |           | not null | 
     o_custkey       | integer       |           |          | 
     o_orderstatus   | character(1)  |           |          | 
     o_totalprice    | numeric(12,2) |           |          | 
     o_orderdate     | date          |           |          | 
     o_orderpriority | character(15) |           |          | 
     o_clerk         | character(15) |           |          | 
     o_shippriority  | integer       |           |          | 
     o_comment       | character(79) |           |          |
Run Code Online (Sandbox Code Playgroud)

如果我有涉及o_orderstatuso_orderpriority或列的查询,我可以将数据类型更改为 以改进它们吗o_clerko_commentchar(n)text

Erw*_*ter 13

是的。而且可能很多

使用(alias )永远不会获得性能。你根本不会获得任何东西,因为这种类型已经过时,大多无用,并且令人沮丧。有关的:character(n)char(n)

但是您在手册的引用中看到了这样的内容:

除了使用空白填充类型时增加存储空间外

char(n)是空白填充类型。诸如此类的列名comment大多表示空白填充的浪费。text或者varchar消除臃肿,你桌子周围的一切都会变得更快,因为你的平均速度。行大小可能会缩小到一半以下。每个数据页的元组越多意味着每个查询要读取和处理的页数就越少,这是影响性能的最重要因素。

在进行此操作时,请对列进行有利的排序以提高效率,但是:

   Column      |     Type      | Collation | Nullable | Default 
---------------+---------------+-----------+----------+---------
 orderkey      | integer       |           | not null | 
 custkey       | integer       |           |          | 
 orderdate     | date          |           |          | 
 shippriority  | integer       |           |          | 
 totalprice    | numeric(12,2) |           |          | 
 orderstatus   | varchar(1)    |           |          | 
 orderpriority | varchar(15)   |           |          | 
 clerk         | varchar(15)   |           |          | 
 comment       | varchar(79)   |           |          |
Run Code Online (Sandbox Code Playgroud)

为什么?

我保留了长度限制varchar(n),但如果这些限制是任意的,请text改用。还快一点点。(并且减少了极端情况的麻烦。)请参阅: