Многоэтажные суммирования

YarmakIN
Дата: 22.06.2011 07:45:02
Доброго времени суток!

Разбираюсь с базой, пытаюсь оптимизировать некоторые узкие места. Наталкиваюсь всюду на конструкцию вида:
SELECT
    t.[Field],
    SUM(t.[SUM1]) AS [SUM1],
    SUM(t.[SUM2]) AS [SUM2]
FROM (
  SELECT
      t1.Field1 AS [Field],
      SUM(t1.Field2) AS [SUM1],
      0 AS [SUM2]
  FROM Table1 t1
  GROUP BY t1.Field1
  UNION ALL
  SELECT
      t2.Field12 AS [Field],
      0 AS [SUM1],
      SUM(t2.Field22) AS [SUM2]
  FROM Table2 t2
  GROUP BY t2.Field12
) t
GROUP BY t.[Field]

Т.е. из нескольких таблиц берутся некие агрегированные показатели, и из них составляется новая таблица. Насколько это грамотно сделано, нельзя ли постороить нечто подобное более оптимальным способом (избавится от агрегации на вернем этаже, например)?

Заранее спасибо!
tpg
Дата: 22.06.2011 07:49:04
А с чего вы решили, что это будет оптимизация?
Критерий оптимизации - максимальная скорость выполнения.
Вы планы анализировали?
YarmakIN
Дата: 22.06.2011 07:56:37
Я абсолютно не уверен, что от этого будет оптимизация. Интересуюсь, нет ли приемов, которые будут более правильны и красивы в таком случае. Планы смотрел конечно, "верхний этаж" добавляет около 3% времени к итогу.
Dima T
Дата: 22.06.2011 09:14:48
Можно попробовать FULL JOIN сделать. Как-то так:
select isnull(t1.Field1, t2.Field12) as [Field], SUM(isnull(t1.Field2, 0)) AS [SUM1], SUM(isnull(t2.Field22, 0)) AS [SUM2]
   from t1 full join t2 on t1.Field1 = t2.Field12
   group by nvl(t1.Field1, t2.Field12)
Dima T
Дата: 22.06.2011 09:22:19
С фоксом перепутал немного - вместо NVL() надо ISNULL()