Доброго утра!
Есть обычный запрос на остатки по регистру накопления. Вот его 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_ есть в таблице остатков?
Смириться с этим?
Спасибо.