|
Лишняя операция 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)да так и есть. Спасибо.
Надо делать расчет итогов по периодам и выполнять запрос на соответствующую дату. Вопрос наверно закрыт. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |