在 SSIS 中使用 NTEXT 字段的性能影响
Performance impact of using NTEXT field in SSIS
我们正在将源系统中的数据引入我们的数据仓库。
他们正在将一些列从 nvarchar(255) 更改为 nvarchar(max)。查看他们的数据,似乎 95% 的数据在 255 个字符以下,99%(可能是 100%)在 4000 个字符以下。我们必须更改我们的 SSIS 包元数据以使用 NTEXT 引入这些列(它们正在转换 4 个表中的 8 列)。
我不熟悉 SSIS 如何处理 nvarchar(max)(在 SQL 服务器中)/NTEXT(在 SSIS 中)以及会有什么性能影响(如果有的话)。 SSIS 是否以不同方式处理这些数据类型并且可能更慢?
我们基本上直接读取并转储到我们的暂存环境中,然后从那里继续。我知道 SQL 方面的限制,但不知道 SSIS 阶段的限制。
SQL 服务器 2012/SSIS 2012
在他们手上发生灾难之前立即阻止源系统的所有者。另见
- http://blogs.lobsterpot.com.au/2013/09/23/string-length-and-sargability/
- is there an advantage to varchar(500) over varchar(8000)?
- varchar(max) everywhere?
- http://sqlblogcasts.com/blogs/simons/archive/2009/07/11/String-concatenation-with-max-types-stops-plan-caching.aspx
这些文章和答案涵盖了一些 这会损害您的数据库的原因。
我们来谈谈 SSIS 和数据流任务。数据流任务基于缓冲区的概念。缓冲区是 N 行数据将适合的内存的预大小单元。这是 SSIS 对数据类型如此挑剔并始终检查它们的根本原因之一。我们可以将 1000 @ 100 字节缓冲区装入内存。但是随后您将源中所有列的大小加倍,突然之间,一次只有 500 个合适的行适合内存。这可能会降低总吞吐量。
Binary/Large对象data/stream数据不同。 SSIS 不t/can不知道该数据是否适合内存。您可能会躲过一颗子弹,并且执行引擎将能够将您的字符串放入缓冲区,虽然您可能会放慢速度,但可能并不明显。 但是,如果引擎确定这个真的是LOB数据怎么办?那你就完蛋了。当 SSIS 在您的 BLOBTempStoragePath
location 和可能 BufferTempStoragePath
中创建所有这些可爱的小文件时,您可以看到您的性能缓慢到爬行。缓冲区中没有数据(内存 = 快),而是缓冲区中有一个指针指向磁盘上的物理路径(磁盘 = 慢)。
而且您要为此付出很多的性能损失。想想看。您为 ETL 过程从 dbo.BadDecision
中提取所有数据。该数据可能并不全部在缓冲区缓存中,因此 SQL 服务器或您使用的任何主机数据库都必须从磁盘读取所有数据。磁盘很慢。也许您通过网络将其流式传输到 ETL 服务器。那些 fat 类型不能放入内存,因此它们被写回磁盘,甚至可能不是快速磁盘,因为您没有设置缓冲区路径。假设您没有填满 C: 并使服务器崩溃,您需要付费将刚刚从磁盘读取的数据写入单独的小文件,同时数据在管道中移动。那批记录现在已准备好写入目标表 - 你猜怎么着?我们需要从这些文件中读回数据以实际存储它。当然,目标系统随后将该数据重写到磁盘。
听起来很有趣,不是吗?
所以战斗,用你拥有的一切来战斗。这是一个糟糕的、懒惰的决定,会严重伤害公司,而不仅仅是你和你的团队。
不清楚引擎溢出到 LOB 磁盘的确切机制。 John Welch 的文章阐明:LOBs in the SSIS Dataflow
Because these data types have the potential to hold so much data, SSIS handles them a little differently than the standard data types. They are allocated separately from regular data in the buffers. When there is memory pressure, SSIS spools buffers to disk. The potential size of LOB data makes it very likely to be spooled, which can be a pretty major performance bottleneck.
我们正在将源系统中的数据引入我们的数据仓库。
他们正在将一些列从 nvarchar(255) 更改为 nvarchar(max)。查看他们的数据,似乎 95% 的数据在 255 个字符以下,99%(可能是 100%)在 4000 个字符以下。我们必须更改我们的 SSIS 包元数据以使用 NTEXT 引入这些列(它们正在转换 4 个表中的 8 列)。
我不熟悉 SSIS 如何处理 nvarchar(max)(在 SQL 服务器中)/NTEXT(在 SSIS 中)以及会有什么性能影响(如果有的话)。 SSIS 是否以不同方式处理这些数据类型并且可能更慢?
我们基本上直接读取并转储到我们的暂存环境中,然后从那里继续。我知道 SQL 方面的限制,但不知道 SSIS 阶段的限制。
SQL 服务器 2012/SSIS 2012
在他们手上发生灾难之前立即阻止源系统的所有者。另见
- http://blogs.lobsterpot.com.au/2013/09/23/string-length-and-sargability/
- is there an advantage to varchar(500) over varchar(8000)?
- varchar(max) everywhere?
- http://sqlblogcasts.com/blogs/simons/archive/2009/07/11/String-concatenation-with-max-types-stops-plan-caching.aspx
这些文章和答案涵盖了一些 这会损害您的数据库的原因。
我们来谈谈 SSIS 和数据流任务。数据流任务基于缓冲区的概念。缓冲区是 N 行数据将适合的内存的预大小单元。这是 SSIS 对数据类型如此挑剔并始终检查它们的根本原因之一。我们可以将 1000 @ 100 字节缓冲区装入内存。但是随后您将源中所有列的大小加倍,突然之间,一次只有 500 个合适的行适合内存。这可能会降低总吞吐量。
Binary/Large对象data/stream数据不同。 SSIS 不t/can不知道该数据是否适合内存。您可能会躲过一颗子弹,并且执行引擎将能够将您的字符串放入缓冲区,虽然您可能会放慢速度,但可能并不明显。 但是,如果引擎确定这个真的是LOB数据怎么办?那你就完蛋了。当 SSIS 在您的 BLOBTempStoragePath
location 和可能 BufferTempStoragePath
中创建所有这些可爱的小文件时,您可以看到您的性能缓慢到爬行。缓冲区中没有数据(内存 = 快),而是缓冲区中有一个指针指向磁盘上的物理路径(磁盘 = 慢)。
而且您要为此付出很多的性能损失。想想看。您为 ETL 过程从 dbo.BadDecision
中提取所有数据。该数据可能并不全部在缓冲区缓存中,因此 SQL 服务器或您使用的任何主机数据库都必须从磁盘读取所有数据。磁盘很慢。也许您通过网络将其流式传输到 ETL 服务器。那些 fat 类型不能放入内存,因此它们被写回磁盘,甚至可能不是快速磁盘,因为您没有设置缓冲区路径。假设您没有填满 C: 并使服务器崩溃,您需要付费将刚刚从磁盘读取的数据写入单独的小文件,同时数据在管道中移动。那批记录现在已准备好写入目标表 - 你猜怎么着?我们需要从这些文件中读回数据以实际存储它。当然,目标系统随后将该数据重写到磁盘。
听起来很有趣,不是吗?
所以战斗,用你拥有的一切来战斗。这是一个糟糕的、懒惰的决定,会严重伤害公司,而不仅仅是你和你的团队。
不清楚引擎溢出到 LOB 磁盘的确切机制。 John Welch 的文章阐明:LOBs in the SSIS Dataflow
Because these data types have the potential to hold so much data, SSIS handles them a little differently than the standard data types. They are allocated separately from regular data in the buffers. When there is memory pressure, SSIS spools buffers to disk. The potential size of LOB data makes it very likely to be spooled, which can be a pretty major performance bottleneck.