Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Избавиться от self-join в clustered index view  [new]
Dampty
Member

Откуда: г. Москва
Сообщений: 47
Коллеги, добрый день!

помогите избавиться от self-join для последующего создания на основании этого запроса clustered index view
SELECT
T9._RecorderTRef AS RecorderTRef,
T9._RecorderRRef AS RecorderRRef,
T9._LineNo AS _LineNo,
T9._Period AS Period,
T9._AccountDtRRef AS AccountRRef,
T9._Fld764DtRRef AS Fld764RRef,

T10._Value_TYPE AS Value1_TYPE,
T10._Value_RTRef AS Value1_RTRef,
T10._Value_RRRef AS Value1_RRRef,
T11._Value_TYPE AS Value2_TYPE,
T11._Value_RTRef AS Value2_RTRef,
T11._Value_RRRef AS Value2_RRRef

FROM dbo._AccRg761 T9 WITH(NOLOCK)

INNER JOIN dbo._AccRgED798 T10 WITH(NOLOCK)
ON T10._RecorderTRef = T9._RecorderTRef
	AND T10._RecorderRRef = T9._RecorderRRef
	AND T10._LineNo = T9._LineNo
	AND T10._Period = T9._Period

INNER JOIN dbo._AccRgED798 T11 WITH(NOLOCK)
ON T11._RecorderTRef = T9._RecorderTRef
	AND T11._RecorderRRef = T9._RecorderRRef
	AND T11._LineNo = T9._LineNo
	AND T11._Period = T9._Period
28 сен 16, 15:35    [19718845]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Dampty,

так одно и тоже ж ведь, или я плохо вижу :)
28 сен 16, 15:51    [19718977]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
так и селф-джойна нету
28 сен 16, 15:52    [19718985]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
Dampty
Member

Откуда: г. Москва
Сообщений: 47
Когда делаю вьюху все ок, а вот когда начинаю индекс по ней строить вываливается ошибка.

Невозможно создать индекс для представления. Представление содержит самосоединение для "_AccRgED798".

В мануалах пишут, что в текущих релизах MSSQL, два соединения с одной и той же таблицей трактуются как self-join.

В результате поисков нашел статью http://jmkehayias.blogspot.ru/2008/12/creating-indexed-view-with-self-join.html
но не могу ее применить.
28 сен 16, 16:08    [19719116]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Dampty,

INNER JOIN dbo._AccRgED798 T10 WITH(NOLOCK)
ON T10._RecorderTRef = T9._RecorderTRef
	AND T10._RecorderRRef = T9._RecorderRRef
	AND T10._LineNo = T9._LineNo
	AND T10._Period = T9._Period

INNER JOIN dbo._AccRgED798 T11 WITH(NOLOCK)
ON T11._RecorderTRef = T9._RecorderTRef
	AND T11._RecorderRRef = T9._RecorderRRef
	AND T11._LineNo = T9._LineNo
	AND T11._Period = T9._Period

покажите отличия???
ну и какой индекс то создаёте
28 сен 16, 16:11    [19719140]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
Dampty
Member

Откуда: г. Москва
Сообщений: 47
Отличия в условиях подзапросов, индекс по представлению кластерный уникальный, по всем полям представления

INNER JOIN dbo._AccRgED798 T10 --WITH(NOLOCK)
ON T10._RecorderTRef = T9._RecorderTRef
	AND T10._RecorderRRef = T9._RecorderRRef
	AND T10._LineNo = T9._LineNo
	AND T10._Period = T9._Period
	AND T10._Correspond = 0
	AND T10._KindRRef = 0xB5BEC72D2C1AC9714487AECE7C698FE5

INNER JOIN dbo._AccRgED798 T11 --WITH(NOLOCK)
ON T11._RecorderTRef = T9._RecorderTRef
	AND T11._RecorderRRef = T9._RecorderRRef
	AND T11._LineNo = T9._LineNo
	AND T11._Period = T9._Period
	AND T11._Correspond = 0
	AND T11._KindRRef = 0xB1CCCF7913896204431152BB6A6ADA17
28 сен 16, 16:15    [19719158]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
Dampty
Member

Откуда: г. Москва
Сообщений: 47
На кластерные индексы для представления накладывается довольно много ограничений (про самосоединения в мануале так же указано), решается задача в рамках попытки оптимизации скорости выполнения

https://msdn.microsoft.com/ru-ru/library/ms191432.aspx
28 сен 16, 16:21    [19719187]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Dampty,

а что не ясно в решении приведённой вами ссылки?
28 сен 16, 16:22    [19719198]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
Dampty
Member

Откуда: г. Москва
Сообщений: 47
Не соображу как case when... расписать для полей

T10._Value_TYPE AS Value1_TYPE,
T10._Value_RTRef AS Value1_RTRef,
T10._Value_RRRef AS Value1_RRRef,
T11._Value_TYPE AS Value2_TYPE,
T11._Value_RTRef AS Value2_RTRef,
T11._Value_RRRef AS Value2_RRRef


и как переписать условие соединения с доп. таблицей, определяющей номер итерации по _AccRgED798
28 сен 16, 16:28    [19719238]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Dampty,

ну вы понимаете, что в результате вам надо создать 2 представления 1-ое собирание в длину, второе - разворот. Оно того стоит? :) почему не воспользоваться "обычным" ?
28 сен 16, 16:37    [19719301]     Ответить | Цитировать Сообщить модератору
 Re: Избавиться от self-join в clustered index view  [new]
Dampty
Member

Откуда: г. Москва
Сообщений: 47
Это же 1С, а у них просто ничего не делается ;( идея была подсунуть оптимизатору уже "рассчитанное" индексное представление, чтобы данные их него брать, а не соединять каждый раз, в теории казалось хорошей задумкой
28 сен 16, 17:08    [19719619]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить