【发布时间】:2015-03-03 16:51:36
【问题描述】:
我正在读取 CSV 文件并将其解析到 SQL Server 2008 数据库中。此过程对所有文件使用通用 CSV 解析器。
CSV 解析器将已解析的字段放入通用字段导入表 (F001 VARCHAR(MAX) NULL, F002 VARCHAR(MAX) NULL, Fnnn ...),然后另一个进程使用知道的 SQL 代码将其移动到实际表中哪个解析的字段(Fnnn)转到目标表中的哪个字段。所以一旦在表中,只有被复制的字段被引用。有些文件可能会变得非常大(一百万行)。
问题是:表中的字段数量是否会显着影响性能或内存使用?即使大部分字段都没有被引用。对字段导入表执行的唯一操作是一个 INSERT 然后一个 SELECT 将数据移动到另一个表中,字段数据上没有任何 JOIN 或 WHERE。
目前,我有三个字段导入表,一个有 20 个字段,一个有 50 个字段,一个有 100 个字段(这是我迄今为止遇到的最大字段数)。目前有使用尽可能小的文件的逻辑。
我想让这个过程更通用,并有一个包含 1000 个字段的表(我知道 1024 列的限制)。是的,一些要处理的计划文件(来自第 3 方)将在 900-1000 字段范围内。
对于大多数文件,字段少于 50 个。
此时,处理现有的三个字段导入表(加上更多字段的计划表(200,500,1000?))正在成为代码中的逻辑噩梦,处理单个表将解决很多问题,只要我不放弃太多性能。
【问题讨论】:
-
“有一个包含 1000 个字段的表” - 糟糕的设计。
-
一次导入需要多长时间?您对性能提升的期望是什么?
-
可能需要几秒钟到几分钟,具体取决于文件。将文本导入数据库不是问题,问题是与许多未使用字段相关的性能损失(取决于文件宽度)。我想在不影响性能的情况下摆脱代码的复杂性。
-
@Mitch - 设计取决于上下文。在将通用 CSV 解析为数据库的上下文中,具有 1000 个原始字段的表不一定是糟糕的设计。 SQL Server 无法处理包含这么多字段(其中包含数据)的行这一事实是一个限制。
-
IMO - 这是一个糟糕的设计,表明可能有更好的方法来解决“将通用 CSV 解析为数据库”的问题
标签: sql-server sql-server-2008