计算总记录与状态

时间:2015-05-08 16:48:10

标签: sql sql-server

我希望在完成该批次的所有作业后对批处理进行更新。为此,我想比较工作总数与完成总数。我正在使用下面的查询,但这是一个非常慢的查询。有什么建议可以改善吗?或者接近主要更新的其他方法?

SELECT DISTINCT j.BatchId, 
    j.JobStatusId,
    COUNT(j.BatchId) OVER(PARTITION BY j.BatchID, j.JobStatusID),
    COUNT(j.BatchId) OVER(PARTITION BY j.BatchID) 
FROM [Job] j 
ORDER BY j.BatchID

仅针对JobID(PK)的索引 Explain Plan

1 个答案:

答案 0 :(得分:1)

<<<<这不是测试>>>>

假设JobStatusId描述了这样的状态:

.wrapper {
    width: 300px;
}
.sidebar {
    float: left;
    width: 100px;
    height: 300px;
    background-color:#f9b25e;
}
.content {
    margin-left: 100px;
    background-color:#45ca5f;
}
.column-left {
    float: left;
    width: 100px;
    height: 100px;
    background-color: #448bcc;
}
.column-right {
    float: left;
    width: 100px;
    height: 200px;
    background-color: #dd4444;
}


/* Example 1*/
.clearfix:after{
    content: '';
    display: block;
    clear: both;
    height: 0;
    visibility: hidden;
}

/* Example 2*/
.clear { clear: both; }


/* Example 3*/
.ex-3 .content{
    overflow: hidden;
}

您可以尝试这两个查询,不知道哪个更快,只需尝试一下:

0 = completed
1 = running
2 = error

或者这个:

SELECT  DISTINCT j.BatchId AS CompletedJobs
FROM    Job j
WHERE   NOT EXISTS( --running jobs or jobs who ran into an error
            SELECT  TOP 1 1 
            FROM    Job j2 
            WHERE   j2.BatchId = j.BatchId
                    AND j2.JobStatusId IN (1,2))

您的原始查询必须订购很多(最终会导致性能不佳)。 在过去几年中,与数据库一起工作的经历向我展示了:只有2%的查询需要订购,其中我看到"顺序由"条款。甚至可能在1%; - )

DISTINCT,ORDER BY,COUNT OVER PARTITION,...永远不会是一个快速的操作 - 如果你把它们结合起来,你会看到结果是什么。