Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А откуда серверу взять значения поля PERIODCODE=@P3 ? |
||
16 янв 14, 14:39 [15424932] Ответить | Цитировать Сообщить модератору |
STsarionov Member Откуда: Сообщений: 105 |
похоже пора в отпуск. спасибо за подсказку, список объектов лукапа в плане исполнения пуст и на это поле не обратил внимания. |
16 янв 14, 14:45 [15424983] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34657 |
Некластерный индекс по (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] Ответить | Цитировать Сообщить модератору |
ROLpogo Member Откуда: Реутов Сообщений: 219 |
Некластерный индекс будет брать из кластерного только RECID. DATAAREAID он в слоте дублировать не станет. |
||
17 янв 14, 23:58 [15432630] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
А так они мельтешат и скрывают те, которые реально имеют смысл, в итоге чтение формулы превращатся в ад. |
||
18 янв 14, 03:06 [15432920] Ответить | Цитировать Сообщить модератору |
Artny
Guest |
Судя по DATAAREAID это аксапта или навижн. Это её построитель запросов сует скобки с неистовой силою во все места. |
20 янв 14, 11:52 [15439486] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |