Имя: Пароль:
1C
 
Лишняя операция KeyLookUp при выполнении запроса на остатки регистра
,
0 Alex_MA
 
16.02.17
08:48
Доброго утра!

Есть обычный запрос на остатки по регистру накопления. Вот его sql представление.

exec sp_executesql N'SELECT
111111.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
T1.Fld2834Balance_
FROM
    (SELECT
        CAST(SUM(T2.Fld2834Balance_) AS NUMERIC(35, 8)) AS Fld2834Balance_
    FROM
        (SELECT
            ISNULL(CAST(CAST(SUM(T3._Fld2834) AS NUMERIC(29, 8)) AS NUMERIC(24, 3)),0.0) AS Fld2834Balance_
        FROM dbo._AccumRgT2843 T3
        WHERE
            T3._Period = P1 AND ((T3._Fld2829RRef = @P2)) AND (T3._Fld2834 <> @P3)
    UNION ALL
        SELECT
            CAST(ISNULL(CAST(CAST(SUM(CASE WHEN T4._RecordKind = 0.0 THEN -T4._Fld2834 ELSE T4._Fld2834 END) AS NUMERIC(23, 8)) AS NUMERIC(18, 3)),0.0) AS NUMERIC(24, 3)) AS Fld2834Balance_
        FROM dbo._AccumRg2828 T4
        WHERE
            T4._Period >= @P4 AND T4._Period < @P5 AND T4._Active = 0x01 AND ((T4._Fld2829RRef = @P6))) T2) T1',N'P1 datetime,@P2 varbinary(16),@P3 numeric(10),@P4 datetime,@P5 datetime,@P6 varbinary(16)','5999-11-01 00:00:00',0xA7F4002264A3800E11E12F7939F63C33,0,'4016-10-01 00:00:00','5999-11-01 00:00:00',0xA7F4002264A3800E11E12F7939F63C33

Параметры:            
'5999-11-01 00:00:00'
0xA7F4002264A3800E11E12F7939F63C33
0
'4016-10-01 00:00:00'
'5999-11-01 00:00:00'
0xA7F4002264A3800E11E12F7939F63C33

В результате обычного запроса на остатки соединяются UNION две таблицы. Из таблицы остатков _AccumRgT2843  и таблица движений _AccumRg2828.
В таблице движений выбирается поле _Active и Fld2834Balance_, но этих полей нет в индексе, по которому идет поиск в таблице движений -> В результате выполняется операция KeyLoolUp. (вытаскивание этих данных из кластерного индекса.)

Зачем идет объединение этих таблиц и лишняя выборка из таблицы движений? Ведь поля Fld2834Balance_ есть в таблице остатков?
Смириться с этим?

Спасибо.
1 toypaul
 
гуру
16.02.17
08:57
не объяснил почему "лишняя выборка из таблицы движений"
2 toypaul
 
гуру
16.02.17
08:58
"Ведь поля Fld2834Balance_ есть в таблице остатков? " ну и что что есть? ты на какую дату получаешь и на какую дату они там есть?
3 Alex_MA
 
16.02.17
08:58
(1)понял, видимо из-за того, что не рассчитаны итоги на 4016-10-01 00:00:00 и программа выполняет UNION, чтобы досчитать остатки налетц
4 toypaul
 
гуру
16.02.17
09:01
как раз на эту дату они посчитаны (точнее на ее начало), а ты получаешь на 5999-11-01 00:00:00
5 Alex_MA
 
16.02.17
09:02
(4)да так и есть. Спасибо.
Надо делать расчет итогов по периодам и выполнять запрос на соответствующую дату.

Вопрос наверно закрыт.