我们在将数据自动加载到数据仓库时遇到了一些问题。加载是通过SQL Server代理作业计划的,但最近我们注意到一些奇怪的查询阻碍了进一步的加载。
示例查询:
SELECT DISTINCT
sum(dbo.FAC_WITNESS_QUEUE_ACTUALS.aabandons)
FROM
dbo.DIM_DIVISION
INNER JOIN
dbo.FAC_WITNESS_QUEUE_ACTUALS ON (dbo.FAC_WITNESS_QUEUE_ACTUALS.division_sk = dbo.DIM_DIVISION.division_sk)
请注意,没有WHERE
子句,这意味着查询加载的时间非常长(超过一小时)。当我们终止此过程时,我们会在SUM
字段中找到另一个具有相同结构但另一列的查询。
FROM
中提到的表上没有索引(也没有主键)。该过程以用户SSIS(用于启动作业,但没有使用此类查询运行作业)启动。
任何有关哪个方向的建议?
提前谢谢
答案 0 :(得分:0)
首先,我不确定关键的DISTINCT在这里是否真的有用: - )
在大型表上执行SUM或COUNT时,SQL LOCKS用于写入整个表,以确保在计算输出时不会更改它。默认情况下,在此期间不能执行插入或更新。
有一些方法可以改进查询或使其更快,但这需要某种带索引的时间戳列,或者您只需添加一个autoinc bigint字段列,这样您每天只能对新行进行SUM和将它添加到前一天的结果中< =这将是我最喜欢的方式!
您还可以查看各种LOCKING选项: http://technet.microsoft.com/en-us/library/cc546505.aspx 也许其中一个可以满足您的需求?
最后,JOIN可能非常大(意思是太大了!)你也许可以使用CURSOR或者这样可怕的东西来分解它,并在循环遍历值时添加一个WAITFOR DELAY让SQL呼吸一下......如果可能的话,还是在盒子里添加内存?