将数据从暂存 table 转换为最终 table
Convert data from staging table to final table
我正在将数据文件加载到暂存器 table,它工作得很好,但之后我需要为最终的 table 转换为多种数据类型,并且插入语句对于大数据变得不可行table秒。
这些语句是由我的工具创建的,我想优化这部分。
插入语句看起来像那样,但在这些转换中有更多的列、有效性检查和一些需要的替换。
INSERT INTO foo
SELECT
convert(decimal(10,2),col1),
convert(date, col2),
convert(decimal(10,2),col3),
convert(int, col4),
convert(decimal(10,2),col5)
...
from foo_staging
在小的 table 上,这工作得非常快,但是随着 table 变大,性能变得非常非常差。任何想法如何提高转换的性能?
EDIT: I'm using Bulkinsert into the staging table and the files are really big.
一些快速的想法,因为这里没有正确答案:
- 将数据加载到暂存区
- Clean/Convert 通过复制到使用定义的第二个分段 table
所需的数据类型。好的数据复制过来,坏的数据留下
- 将数据从"clean"table复制到"live"table
要将数据从 table 复制到 table,也许最快的选择是使用 table 分区。这可能会变得复杂,您需要仔细阅读概念并确定它是否适用于您的数据。 (另外,您需要 SQL 服务器企业版。)
另一种方法是 "chunkify" 复制数据,方法是将其分成(比如说)10,000 行或类似的任意数量的集合,然后循环直到完成。这可以使用 TOP N
语法来完成,根据正在加载的数据计算出日期或键范围,甚至可能使用 row_number()
.
技巧
(再次注意,这些功能的可用性取决于您使用的 version/edition 或 SQL。)
我正在将数据文件加载到暂存器 table,它工作得很好,但之后我需要为最终的 table 转换为多种数据类型,并且插入语句对于大数据变得不可行table秒。 这些语句是由我的工具创建的,我想优化这部分。 插入语句看起来像那样,但在这些转换中有更多的列、有效性检查和一些需要的替换。
INSERT INTO foo
SELECT
convert(decimal(10,2),col1),
convert(date, col2),
convert(decimal(10,2),col3),
convert(int, col4),
convert(decimal(10,2),col5)
...
from foo_staging
在小的 table 上,这工作得非常快,但是随着 table 变大,性能变得非常非常差。任何想法如何提高转换的性能?
EDIT: I'm using Bulkinsert into the staging table and the files are really big.
一些快速的想法,因为这里没有正确答案:
- 将数据加载到暂存区
- Clean/Convert 通过复制到使用定义的第二个分段 table 所需的数据类型。好的数据复制过来,坏的数据留下
- 将数据从"clean"table复制到"live"table
要将数据从 table 复制到 table,也许最快的选择是使用 table 分区。这可能会变得复杂,您需要仔细阅读概念并确定它是否适用于您的数据。 (另外,您需要 SQL 服务器企业版。)
另一种方法是 "chunkify" 复制数据,方法是将其分成(比如说)10,000 行或类似的任意数量的集合,然后循环直到完成。这可以使用 TOP N
语法来完成,根据正在加载的数据计算出日期或键范围,甚至可能使用 row_number()
.
(再次注意,这些功能的可用性取决于您使用的 version/edition 或 SQL。)