【发布时间】:2009-09-12 15:55:38
【问题描述】:
有一个具有以下设置和要求的新项目:-
我的客户在他们的办公室有一台 MSSQL 2005 服务器 (A)。他们的供应商在世界的另一个地方有一个 MSSQL 2005 服务器 (B),其中包含实时事务数据。我的客户希望在非办公时间每天将数据从 (B) 加载到 (A)。他们对 (B) 有数据读取器访问权限,但仅此而已,供应商不会进行复制、日志传送等,我的客户全权负责获取他们自己的数据,以便他们可以运行自己的报告/多维数据集。
我使用的脚本如下使用分布式TSQL和链接服务器到(B):-
DECLARE @sqlCommand VARCHAR(2000)
DECLARE @LastProcessedDate DATETIME
-- run the following code for Table 1 to Table XX
SELECT @LastProcessedDate = LastProcessedDate
FROM [ProcessControl]
WHERE TableName = 'table_1'
SET @sqlCommand = 'INSERT INTO Table1
SELECT *
FROM OPENQUERY(VendorsLinkedServerName,
''SELECT *
FROM Table1
WHERE LastModified >= '''' + @LastProcessedDate + '''')'
EXEC @sqlCommand
我对 10 个最大的表进行了 1 天数据的初步试验,花了 1 小时,这太长了。同样对于测试,我已经删除了除了表的主键(包括 1-4 BIGINT 列)之外的所有索引和约束。关于如何加快加载时间或加载数据的任何建议?
edit:只是补充一下,如果你想知道为什么select语句是这样写的,在上面的例子中(A)中的Table1在一个ETL数据库中,随后将比较数据以确定插入/更新/删除在 (A) 中的实际报告数据库中
【问题讨论】:
-
这是一个建议,所以我将其作为评论:您是否尝试过 SQL 数据比较? (red-gate.com/products/SQL_Data_Compare/index.htm)
-
转机时间可以接受多长时间?
-
在您提供一些相关信息之前,没有人能够帮助您:1) 数据连接的实际吞吐量是多少?不是您的查询,而是连接?如果你不知道这一点,你只是随风吐痰。 2) 您的平均记录大小是多少,3) 每晚要传输的平均记录数,4) 源的表定义是什么,包括任何键和索引?一旦我们掌握了这些信息,那么某人就有机会为您提供帮助。
-
郑重声明:完全有可能,甚至很可能,实际问题既不是网络延迟,也不是您网站上的插入时间,而是缺少索引(最好是聚集索引)在源表的 LastModified 列上,强制您的查询每晚重新扫描整个表。提供我上面指出的信息将更容易确定这三个中的哪一个是罪魁祸首,并就您可以采取的措施提出建议。
标签: sql sql-server sql-server-2005 tsql etl