我正在运行一个ETL进程,该进程正在将大约200万行写入Server数据库。
我试图优化纯插入所需的时间(我想更新是另一回事)。
我想知道,基本插入到SQL数据库的最大瓶颈是什么,或者是减少时间的最佳方法。
我是说,第一件事,可能是数据的大小,对吧?每列中的行数、列数和数据大小。其中一些可能无法最小化,每一行的KB/足迹是一件可以优化的事情,对吗?
还有什么是可以优化的,还是最大的因素?是传播媒介吗?我的意思是,写入同一台计算机上的数据库与跨web连接(健壮、快速并具有1ms的ping?)之间有多大的差别?
最后-到数据库的多个并行连接似乎在一定程度上加快了进程的速度?我的意思是,当我有20个连接的插入循环风格,它大约比一个连接写所有数据快6-7倍。我很好奇这是为什么。
现在我有220万行,总计2.7GB。这是1.23kb/行。
现在,使用14个连接插入1000行(1.23MB)需要6.7秒。这是一个蜗牛节奏10.66行每秒。即使假设1连接的速度(不是),最多也是150行/秒,这也不完全是“快”的。我正在编写一个超高速、健壮的web连接b/c,我们不能让ETL进程与数据仓库在同一个空间上。
所以..。我怎么才能在这里优化速度?
一次1000行的原因是因为数据来自1000页,但优化解析目前是另一个问题。
我相信我有一个主要的指数,但没有太贵的东西。现在,我只是在做蒙特卡罗测试(尝试一下,看看什么有效),但我需要更专注的东西。
发布于 2015-10-19 16:29:01
你需要读一读:
你必须读每一个链接。真的。简而言之,高效加载必须使用大容量插入并实现最小的日志记录。到目前为止,SSIS是更好的工具,但您也可以通过编程实现这一点。OleDB是最好的,但SqlClient (C#)也可以,如果需要的话。像行大小、网络速度之类的东西不太可能是你关心的问题,但是你应该一直测量(链接的文章会教你怎么做)。负载性能应该与现有DB大小完全正交,如果加载速度随着DB大小的增加而降低,您肯定做错了什么。
最后-到数据库的多个并行连接似乎在一定程度上加快了进程的速度?我的意思是,当我有20个连接的插入循环风格,它大约比一个连接写所有数据快6-7倍。我很好奇这是为什么。
我会猜测,因为没有任何调查和测量。但是,很可能您现在被提交刷新速率所阻塞:每次提交SQL时都必须停止并等待日志被写入磁盘。如果没有显式开始事务,那么每个语句都必须停止等待。添加更多的加载器会导致更好的日志利用率,同时为20个作者提交日志。读什么是:日志序列号?。
https://dba.stackexchange.com/questions/118479
复制相似问题