找回密码
 FreeOZ用户注册
查看: 3071|回复: 8
打印 上一主题 下一主题

[数据库] SSIS 学习笔记

[复制链接]
跳转到指定楼层
1#
发表于 16-3-2010 15:58:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除, 无法发言

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
这个视频不错,以SQL 2008为例,介绍了一个简单的数据导出到Excel的例子。
http://www.youtube.com/watch?v=hJjH42P427o&feature=related

SSIS 2008 和 SSIS 2005 的界面还是有一些区别的,需要看一下。
2008中Data Flow 从Work Flow中单独提了出来,整体感觉层次结构更加清晰。
2008中DataReader Source不见了,而增加了ADO.NET Source。
这篇文章具体说明了都有哪些改进:
http://blogs.msdn.com/b/mattm/ar ... -ssis-part-one.aspx

视频讲了 Name Convention,我觉得写代码都用该使用Naming Convention,这是一个好习惯,比如一个关于 Employees的Data Flow,应该叫做 dfEmployees

视频笔记:

1 建立SSIS项目
2 建立一个新的SSIS Package
3 拖拽一个Data Flow控件到 Work Flow中,改名叫做dfEmployees
4 进入Data Flow面板
5 添加一个 ADO.NET 数据源到Connection Manager
6 添加数据源的时候选择local server,可以输入一个 . 点好,代表localhost
7 选择Advantureworks 数据库
8 修改这个ADO Connect的名字为 adoAdvantureworks

9 在Data Flow中添加一个 DataReader Source 或者 ADO.NET Source (根据你的版本而定)
10 在Connection Manager选择 adoAdvantureworks 数据源
11 在Data access mode中选择 SQL command
12 在SQL command text 中输入 select 语句,读取数据

13 在Data Flow中拖入一个Excel Destination
14 拖拽一个绿色的Connection 连接 Source 和 Destination
15 在 Excel Destination中的Connection Manager中点击New,制定一个新的excel文件的文件名和路径,即时建立一个excel文件
16 在 Excel Destination中的 Excel Sheet中点击NEW,即时建立一个Sheet的SELECT语句,制定Sheet名
17 检查 Excel Destination的Mapping

可惜我在64bit的Server上没有做成功,提示到处到excel不支持64bit!
回复  

使用道具 举报

2#
 楼主| 发表于 14-8-2010 19:37:48 | 只看该作者

SSIS的效率

提示: 作者被禁止或删除, 无法发言
我写了我的第一个SSIS包,具体操作如下:

truncate table TableNameA
insert into TableNameA select Column1, Column2, Column3 from TableNameB

也就是一个更新A表的操作,一共19K记录,SSIS的执行时间是20秒,我用控制台直接执行SQL语句的时间是不到1秒。谁能给解释一下啊?
回复  

使用道具 举报

3#
发表于 14-8-2010 21:12:09 | 只看该作者
控制台直接操作数据库当然快,SSIS用dtshost运行,启动执行都要时间。应该参考执行结果里,data flow里copy数据的时间,而不是整个ssis job的运行时间。

评分

参与人数 1威望 +49 收起 理由
xblues + 49 谢谢分享!

查看全部评分

回复  

使用道具 举报

4#
 楼主| 发表于 14-8-2010 21:41:09 | 只看该作者

回复 #2 xblues 的帖子

提示: 作者被禁止或删除, 无法发言
第一个SSIS包,当然是不懂,我是用了 Data Flow, 使用OLEDB 连接,然后用OLE Common执行更新命令。如果用OLE Commond 执行Update就更费时间了,我用这个在19K数据里面更新几百条数据,耗费了2分钟。

修改了一下把这个Update的流程写在 Execute SQL Task 里面,并采用ADO.NET连接,超级快了。

我想,如果不能用ADO.NET的时候只能用ODBC之类的连接,这样数据操作会慢,我就直接复制表,同构复制,等MS SQL中有了我要的数据以后,使用Execute SQL Task调用ADO.NET执行整理数据的操作。
回复  

使用道具 举报

5#
 楼主| 发表于 14-8-2010 21:56:18 | 只看该作者

这个视频看了好几遍还是没看懂是啥意思

提示: 作者被禁止或删除, 无法发言
有哪位大侠看懂了,帮我解释一下好么?

http://www.youtube.com/watch?v=iDqmtQOTXqo&feature=fvw
[youtube]iDqmtQOTXqo[/youtube]


又想了一下,好像有点明白啦!

问题:采用OLEDB连接,对一个表进行更新操作如下

Update TableA
Set C1 = V1, C2 = V2, C3 = V3
Where Cn = condition1

作者说这种更新的效率很低下,我也做了一个这样更新的实验,的确,扫描19K记录,需要将近20分钟!这如果在SQL控制台上几秒钟的事情。

解决方法:采用临时表。

建立一个同构临时表
清空临时表
Source 选择符合更新条件的记录
Derived Column 在这里写更新条件,进行列更新
Destination 然后写入临时表
然后再利用Execute SQL Task 用临时表更新原表

这样就避开了在OLEDB Commond 中使用Update操作。

本教程学习了如何使用 Derived Column 派生列功能,这个相当于Update语句了,不过好处是把Update中的更新部分分解到界面中,看起来更加清晰明了。
回复  

使用道具 举报

6#
 楼主| 发表于 14-8-2010 22:40:11 | 只看该作者

如何调用SP

提示: 作者被禁止或删除, 无法发言
利用 OLEDB Command 直接输入 exec sp_Name

我觉得存储过程也可以直接被计划执行,不过存储过程主要是支持SQL语句,更加广泛的功能只有SSIS才支持,比如发送邮件,交互执行,写日志之类的操作。所以可以采用用SSIS包装SP的方式,扩展SP的功能。
回复  

使用道具 举报

7#
 楼主| 发表于 14-8-2010 22:51:17 | 只看该作者

SSIS 支持这么多种数据源,应该用哪一个呢?

提示: 作者被禁止或删除, 无法发言
主要支持的有三种 ADO.NET, OLE DB, ODBC

有些异构数据库仅仅支持其中的一种连接,所以也没有什么好选择的了,支持哪一种就用那一种了。
都支持的情况下,还有32位版本和64位版本的问题,有些驱动仅仅支持32位的版本,还是能用那个用那个。
当然考虑到ADO.NET是最后出来的,所以界面上的支持,肯定是ADO.NET更用户友好。

如果有多个选择的情况下请看这里:
http://social.msdn.microsoft.com ... -913b-123ecf248a9c/

上文据说OLE DB的执行效率比ADO.NET高一点点,不过还是case by case 的问题,不可一概而论
比如 MS OLE DB for Oracle就比Oracle原厂的驱动(估计是通过ODBC吧?)性能好,不过MS的驱动却不支持新版Oracle的一些特性。
回复  

使用道具 举报

8#
 楼主| 发表于 14-8-2010 23:09:26 | 只看该作者

如何为SSIS添加日志文件?

提示: 作者被禁止或删除, 无法发言
http://www.youtube.com/watch?v=1Ei5Gh5NJMM&feature=related

这个印度人的视频讲的非常详细,可以看一下。
可以选择添加日志到文本文件(目前)或者添加到系统日志,或者是添加到SQL的日志表中。
回复  

使用道具 举报

9#
发表于 16-8-2010 22:34:38 | 只看该作者
虫子是做BI相关的东西的?似乎总是整AS、IS什么
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 1-11-2024 22:36 , Processed in 0.041353 second(s), 26 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表