数据类型和索引
Data Types and Indexes
当您使用 TEXT 数据类型时,插入、更新或删除数据是否存在某种性能差异?
我去 here 发现了这个:
Tip: There is no performance difference among these three types, apart
from increased storage space when using the blank-padded type, and a
few extra CPU cycles to check the length when storing into a
length-constrained column. While character(n) has performance
advantages in some other database systems, there is no such advantage
in PostgreSQL; in fact character(n) is usually the slowest of the
three because of its additional storage costs. In most situations text
or character varying should be used instead.
这让我相信应该没有性能差异,但我的朋友比我更有经验,他说插入、更新和删除对于 TEXT 数据类型来说更慢。
我有一个 table,它使用触发器和函数进行分区,并且索引非常多,但插入并没有那么慢。
现在我有另一个 table,还有 5 个列,所有这些都是文本数据类型,完全相同的触发器和函数,没有索引,但是插入速度非常慢。
根据我的经验,我认为他是正确的,但是你们怎么看?
编辑 #1:
我正在上传完全相同的数据,只是第二个版本多了 5 列。
编辑#2:
"Slow" 我的意思是在第一种情况下,我每秒可以插入 500 行或更多行,但现在我每秒只能插入 20 行。
编辑 #3:我没有像第一种情况那样将索引添加到第二种情况,因为根据我的理解,索引应该减慢插入、更新和删除的速度。
编辑 #4:我保证这是完全相同的数据,因为我是上传者。唯一的区别是,第二种情况有 5 个额外的列,都是文本数据类型。
编辑 #5:即使我删除了场景 2 中的所有索引并将它们全部留在场景 1 中,场景 2 中的插入速度仍然较慢。
编辑 #6:两种情况都有完全相同的触发器和功能。
编辑 #7:
我正在使用 ETL 工具 Pentaho 来插入数据,因此我无法向您展示用于插入数据的代码。
我想我可能在 ETL 工具中有太多的转换步骤。当我尝试在与实际转换数据的步骤相同的转换中插入数据时,速度非常慢,但是当我简单地插入已经转换为空 table 的数据,然后从这个 [=46] 中插入数据时=] 到我正在使用的实际 table 中,插入速度比方案 1 快得多,每秒 4000 行。
场景 1 和场景 2 之间的唯一区别,除了场景 2 中列的增加之外,是 ETL 中的步骤数 transformation.Scenario两者在 ETL 转换中大约有 20 个或更多步骤。在某些情况下,还有 50 个。
我想我可以通过减少转换步骤的数量来解决我的问题,或者将转换后的数据放入一个空的table,然后将这个table中的数据插入实际的table我正在使用。
PostgreSQL text
和 character varying
是相同的,除了后者的(可选)长度限制。它们的性能相同。
选择 character varying
的唯一原因是
您想施加长度限制
您想符合SQL标准
当您使用 TEXT 数据类型时,插入、更新或删除数据是否存在某种性能差异?
我去 here 发现了这个:
Tip: There is no performance difference among these three types, apart from increased storage space when using the blank-padded type, and a few extra CPU cycles to check the length when storing into a length-constrained column. While character(n) has performance advantages in some other database systems, there is no such advantage in PostgreSQL; in fact character(n) is usually the slowest of the three because of its additional storage costs. In most situations text or character varying should be used instead.
这让我相信应该没有性能差异,但我的朋友比我更有经验,他说插入、更新和删除对于 TEXT 数据类型来说更慢。
我有一个 table,它使用触发器和函数进行分区,并且索引非常多,但插入并没有那么慢。
现在我有另一个 table,还有 5 个列,所有这些都是文本数据类型,完全相同的触发器和函数,没有索引,但是插入速度非常慢。
根据我的经验,我认为他是正确的,但是你们怎么看?
编辑 #1: 我正在上传完全相同的数据,只是第二个版本多了 5 列。
编辑#2: "Slow" 我的意思是在第一种情况下,我每秒可以插入 500 行或更多行,但现在我每秒只能插入 20 行。
编辑 #3:我没有像第一种情况那样将索引添加到第二种情况,因为根据我的理解,索引应该减慢插入、更新和删除的速度。
编辑 #4:我保证这是完全相同的数据,因为我是上传者。唯一的区别是,第二种情况有 5 个额外的列,都是文本数据类型。
编辑 #5:即使我删除了场景 2 中的所有索引并将它们全部留在场景 1 中,场景 2 中的插入速度仍然较慢。
编辑 #6:两种情况都有完全相同的触发器和功能。
编辑 #7: 我正在使用 ETL 工具 Pentaho 来插入数据,因此我无法向您展示用于插入数据的代码。
我想我可能在 ETL 工具中有太多的转换步骤。当我尝试在与实际转换数据的步骤相同的转换中插入数据时,速度非常慢,但是当我简单地插入已经转换为空 table 的数据,然后从这个 [=46] 中插入数据时=] 到我正在使用的实际 table 中,插入速度比方案 1 快得多,每秒 4000 行。
场景 1 和场景 2 之间的唯一区别,除了场景 2 中列的增加之外,是 ETL 中的步骤数 transformation.Scenario两者在 ETL 转换中大约有 20 个或更多步骤。在某些情况下,还有 50 个。
我想我可以通过减少转换步骤的数量来解决我的问题,或者将转换后的数据放入一个空的table,然后将这个table中的数据插入实际的table我正在使用。
PostgreSQL text
和 character varying
是相同的,除了后者的(可选)长度限制。它们的性能相同。
选择 character varying
的唯一原因是
您想施加长度限制
您想符合SQL标准