AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 77932
Accepted
SQLBen
SQLBen
Asked: 2014-09-30 03:57:34 +0800 CST2014-09-30 03:57:34 +0800 CST 2014-09-30 03:57:34 +0800 CST

使用 SQL 命令加载 SSIS

  • 772

我正在尝试使用 SSIS 插入以下查询。我这样做只是因为目标表中已经存在一些重叠的 ID。我尝试使用以下方法获取两个表的最小和最大 ID,以便仅插入不存在的行:

/*
--SourceTable
 MinID  MaxID
select 552596452-633166940

--destination table
MinID        MaxID
450485204  596693972
*/

然后我现在用它来实现使用 SSIS 包的插入。我无法让这个包运行。有什么我做错了吗?是否有任何其他 SSIS 数据流可用于解决此问题?我选择使用 SSIS 是因为记录大约有 3000 万行,在 SQL 上运行需要很长时间,而且它也会很快填满日志空间,这会影响服务器的性能。

INSERT INTO dbo.destinationtable          
           ([id]      
           ,[userId]      
           ,[serviceId]      
           ,[keyId]      
           ,[wappush]      
           ,[builturl]      
           ,[datestamp]      
           ,[pocessingTime]      
           ,[UserAgent]      
           ,[Referer]      
           ,[fallBack]      
           ,[Error]
           ,[ClientIP]
           ,[AdvertUrl])  


SELECT  id, userId, serviceId, keyId, wappush, builturl, datestamp, pocessingTime, 
          UserAgent, Referer, fallBack, Error, ClientIP, AdvertUrl
FROM  sourcetable a (nolock)
WHERE (datestamp < DATEADD(d, 0, DATEDIFF(d, 0, GETDATE() - 60))) 
AND id > 596693972 and id <= 633166940
ORDER BY id
ssis
  • 1 1 个回答
  • 1496 Views

1 个回答

  • Voted
  1. Best Answer
    billinkc
    2014-09-30T07:03:29+08:002014-09-30T07:03:29+08:00

    如果你打算使用 SSIS,我可以建议你使用它吗?;)

    我相信您正在尝试做的是插入一些目标中尚不存在的数据。您已经使用最小/最大逻辑确定了需要哪些数据,并尝试对目标执行类似的操作。

    对于初学者来说,这OLE DB Command是你应该谨慎使用的东西。它执行单例操作,因此您希望这个东西处理的行数应该是几十,也许是几百。绝对不是8000万。

    您的数据流应该是这样的

    在此处输入图像描述

    我有一个 OLE DB 源(可以使用 ADO.NET,但如果您需要参数化查询,它会稍微复杂一些)。您可以使用现有的查询,或者如果您需要将其分块,因为您有活动的系统,就这样吧。

    查找组件LKP RM_DimEmplo...是此操作的关键。当包启动时,它将在该组件中运行源查询并缓存所有值。这听起来很贵,所以不要让它成为现实。不要只选择dbo.destinationTable. 编写查询以仅返回进行匹配所需的键。应该是那些ID。那将非常狭窄,不应该那么糟糕。这里的想法是您将拥有源行,并根据这些键将它们与目标表的缓存进行比较。由于您不担心检测差异,因此您知道任何不匹配的内容都需要删除,因此在“常规”选项卡上,将“指定如何处理没有匹配条目的行”更改为使用Redirect rows to no match output.否则,当它不匹配时,它会爆炸。

    如果您发现它仍然对您的系统有影响,那么您需要采用更高级的方法,即在查找组件上使用表达式来过滤数据范围以匹配传入的 ID。因此,您已确定源范围为 100到 200。没有必要在目标中提取完整的 0 到 1000 范围的键,您只需让查找缓存在操作范围内的键。除非您的机器上没有可用的 RAM,否则 80M 应该不会太重。

    执行OLE DB Command单例、一次性操作。OLE DB Destination可以执行单例插入(默认为 2005 - )Table or view或基于集合/批处理的更新(Table or View - fast load),这可以快速尖叫猎豹车轮。由于您正在加载大量数据,除非您希望您的管理员讨厌您,否则将 Max insert commit size 更改为默认值 2147483647 以外的其他值。这基本上是说在全部插入之前不要提交任何内容。这可能会导致您的事务日志匆忙变大。

    你的问题的好处是你可以随心所欲地运行它。假设 1M 行被加载并且发生了一些不好的事情。只需重新启动。不管提交了多少,当它重新启动时,它可能会提取相同的源数据,但您的查找将具有来自目标的最新键集,因此结果将不会对这些键执行任何操作。我知道,你会认为每个人都喜欢他们的目标系统中的重复项,但出于某种原因,这在某些地方并不适用......

    包起来

    我不能足够推荐集成服务系列的阶梯。专门针对这个问题,Level 3

    • 2

相关问题

  • Microsoft BI 中的 BI 开发

  • 数据仓库设计:组合日期时间维度与单独的日期和时间维度和时区

  • 我可以降级 SSIS 包以在旧版本的 SQL 上运行吗

  • 在 Microsoft BI 中查找改进材料

  • 约束 SSIS 执行进程任务的最简单方法

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve