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

Откуда:
Сообщений: 105
Добрый день.
Имеется таблица c полями:
DATAAREAID nvarchar(10)
RECID bigint
TRANSDATE date
PERIODCODE nvarchar(10)

кластерный индекс: DATAAREAID,RECID
некластерный индекс: DATAAREAID, TRANSDATE

запрос
SELECT TOP 1 RECID FROM Table WHERE ((DATAAREAID=@P1) AND ((TRANSDATE=@P2) AND (PERIODCODE=@P3)))

что происходит: идет поиск по некластерному индексу с лукапом из кластерного.
Вопрос: почему так? ведь на уровне листьев некластерного индекса так же лежат и значения кластерного(по ним ведь идет лукап)
сервер мне предлагает сделать include поля RECID
16 янв 14, 14:31    [15424891]     Ответить | Цитировать Сообщить модератору
 Re: странный вопрос про индексы  [new]
Glory
Member

Откуда:
Сообщений: 104760
STsarionov
Вопрос: почему так? ведь на уровне листьев некластерного индекса так же лежат и значения кластерного(по ним ведь идет лукап)

А откуда серверу взять значения поля PERIODCODE=@P3 ?
16 янв 14, 14:39    [15424932]     Ответить | Цитировать Сообщить модератору
 Re: странный вопрос про индексы  [new]
STsarionov
Member

Откуда:
Сообщений: 105
похоже пора в отпуск.
спасибо за подсказку, список объектов лукапа в плане исполнения пуст и на это поле не обратил внимания.
16 янв 14, 14:45    [15424983]     Ответить | Цитировать Сообщить модератору
 Re: странный вопрос про индексы  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34657
STsarionov
Добрый день.
Имеется таблица c полями:
DATAAREAID nvarchar(10)
RECID bigint
TRANSDATE date
PERIODCODE nvarchar(10)

кластерный индекс: DATAAREAID,RECID
некластерный индекс: DATAAREAID, TRANSDATE

запрос
SELECT TOP 1 RECID FROM Table WHERE ((DATAAREAID=@P1) AND ((TRANSDATE=@P2) AND (PERIODCODE=@P3)))

что происходит: идет поиск по некластерному индексу с лукапом из кластерного.
Вопрос: почему так? ведь на уровне листьев некластерного индекса так же лежат и значения кластерного(по ним ведь идет лукап)
сервер мне предлагает сделать include поля RECID



Некластерный индекс по (DATAAREAID, TRANSDATE) содержит поля: (DATAAREAID, TRANSDATE) [(DATAAREAID),RECID]

ПРи запросе сначала по индексу производится позиционирование по значениям полей (DATAAREAID=@P1 AND TRANSDATE=@P2)
Затем остаётся проверить ещё одно условие -- PERIODCODE=@P3. Поля PERIODCODE нет ни в одном из индексов, его нужно прочитать из таблицы, поэтому берутся значения полей (DATAAREAID,RECID) из первого индекса по (DATAAREAID, TRANSDATE)
и по их значениям производится позиционирование в кластерном индексе по DATAAREAID,RECID, из его листовых страниц берутся уже данные самой таблицы (запись таблицы) и там есть поле PERIODCODE.


З.Ы. Никогда не ставь в запросах лишние скобки. В твоём запросе например все скобки лишние. Они только путают.
Скобки нужно ставить вокруг термов OR, которые соединяются по AND. Только тогда нужно брать термы OR в скобки, потому что у OR приоритет ниже, чем у AND.
17 янв 14, 15:03    [15430573]     Ответить | Цитировать Сообщить модератору
 Re: странный вопрос про индексы  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
автор
Некластерный индекс по (DATAAREAID, TRANSDATE) содержит поля: (DATAAREAID, TRANSDATE) [(DATAAREAID),RECID]

Некластерный индекс будет брать из кластерного только RECID. DATAAREAID он в слоте дублировать не станет.
17 янв 14, 23:58    [15432630]     Ответить | Цитировать Сообщить модератору
 Re: странный вопрос про индексы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
MasterZiv
З.Ы. Никогда не ставь в запросах лишние скобки. В твоём запросе например все скобки лишние. Они только путают.
Скобки нужно ставить вокруг термов OR, которые соединяются по AND. Только тогда нужно брать термы OR в скобки, потому что у OR приоритет ниже, чем у AND.
+100500 независимо от языка программирования.
А так они мельтешат и скрывают те, которые реально имеют смысл, в итоге чтение формулы превращатся в ад.
18 янв 14, 03:06    [15432920]     Ответить | Цитировать Сообщить модератору
 Re: странный вопрос про индексы  [new]
Artny
Guest
Судя по DATAAREAID это аксапта или навижн.
Это её построитель запросов сует скобки с неистовой силою во все места.
20 янв 14, 11:52    [15439486]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить