0

我们在将数据自动加载到数据仓库时遇到了一些问题。加载是通过 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 启动(用于启动作业,但没有使用此类查询运行作业)。

有人建议看哪个方向吗?

提前谢谢

4

1 回答 1

0

首先,我不确定关键 DISTINCT 在这里是否真的有用:-)

当您对大型表执行 SUM 或 COUNT 时,SQL LOCKS 用于写入整个表以确保在计算输出时不会更改它。默认情况下,在此期间不能执行任何插入或更新。

有一些方法可以改进查询或使其更快,但这需要某种带有索引的时间戳列,或者您可以添加一个 autoinc bigint 字段列,以便您每天只能对新行求和并将其添加到前一天的结果 <= 那将是我最喜欢的方式!

您还可以查看各种 LOCKING 选项: http://technet.microsoft.com/en-us/library/cc546505.aspx 也许其中一个可以满足您的需要?

最后,JOIN 可能非常大(意味着太大!),您可以使用 CURSOR 或其他可怕的东西将其分解,并在循环遍历这些值时添加 WAITFOR DELAY 以让 SQL 呼吸一点......或者添加如果可能的话,内存到你的盒子吗?

于 2013-07-18T07:46:43.523 回答