2015-04-01 5 views
0

У меня есть индексный вид:индексированный вид юзабилить

CREATE VIEW ptv.vw_mokiniai_2 
WITH SCHEMABINDING 
AS 
    SELECT 
    T1.year_name, 
    T2.person_id, 
    T2.year, 
    T2.person_position, 
    COUNT_BIG(*) AS [aggregated number] 
    FROM Table1 AS T1 
    INNER JOIN Table2 AS T2 
    ON T1.year = T2.year 
    GROUP BY T1.year_name, 
    T2.person_id, 
    T2.year, 
    T2.person_position 

С уникальным кластерным индексом на колонках

T1.year_name, T2.person_id, T2.year, T2.person_position 

Мне нужна оптимизатор запросов использовать это индексированное представление по запросу

SELECT 
    T1.year_name, 
    COUNT_BIG(DISTINCT T3.person_id) AS [persons_per_year] 
FROM Table1 AS T1 
INNER JOIN (
      SELECT 
       T2.person_id, 
       T2.year, 
       T2.person_position 
      FROM Table2 AS T2 
      GROUP BY T2.person_id, T2.year, T2.person_position 
      ) AS T3 
    ON T1.year = T3.year 
GROUP BY T1.year_name 

Запрос должен быть с производной таблицей, потому что COGNOS генерирует этот запрос, и я не хочу редактировать multimimensiona л модели. У кого-то есть идея, как это можно сделать? Возможно, единственный способ оптимизировать запрос - удалить производную таблицу (значит, мне нужно редактировать многомерную модель)? Любые предложения (просмотр редактирования и окончательное редактирование запросов) будут оценены.

+0

Вы считаете создание индексированного представления только для производного запроса таблицы? –

+0

Я пробовал это .. не работает – ramas

+0

Вы используете Enterprise Edition? –

ответ

0

В приведенном ниже примере используется индексированный вид в моем тесте. Если это не работает в вашей среде, возможно, в коде, который вы опубликовали, есть разница.

CREATE TABLE dbo.Table1 
    (
     year varchar(10) 
    , year_name varchar(10) 
    ); 

CREATE TABLE dbo.Table2 
    (
     year varchar(10) 
    , person_id varchar(10) 
    , person_position varchar(10) 
    ); 
GO 

CREATE VIEW dbo.vw_mokiniai_2 
WITH SCHEMABINDING 
AS 
    SELECT T2.person_id 
      , T2.year 
      , T2.person_position 
      , COUNT_BIG(*) AS [aggregated number] 
    FROM dbo.Table2 AS T2 
    GROUP BY T2.person_id 
      , T2.year 
      , T2.person_position 
GO 
CREATE UNIQUE CLUSTERED INDEX cdx ON vw_mokiniai_2(year, person_id, person_position) 
GO 

SELECT 
    T1.year_name, 
    COUNT_BIG(DISTINCT T3.person_id) AS [persons_per_year] 
FROM Table1 AS T1 
INNER JOIN (
      SELECT 
       T2.person_id, 
       T2.year, 
       T2.person_position 
      FROM Table2 AS T2 
      GROUP BY T2.person_id, T2.year, T2.person_position 
      ) AS T3 
    ON T1.year = T3.year 
GROUP BY T1.year_name 
GO 
+0

Да, я ошибся при создании удобного индексированного представления. Это работает, спасибо. – ramas

Смежные вопросы