Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Mssql не хочет использовать индекс. Как подсказать оптимизатору и сохранить план запроса?  [new]
risten
Guest
создал табличку
create table t1 (
id int,
name varchar(10),
descr varchar(100),
period date
)
вставил две строки:
insert into t1 values (1,'tratata','The first row in my table',SYSDATETIME())
go
insert into t1 values (2,'aaa','The second row in my table',SYSDATETIME())
go

Я не очень понимаю разницу между:
CREATE INDEX missing_index_t1
ON [MyTestDB].[dbo].[t1] ([name])
 INCLUDE ([descr], [period])
и
 create index t1_name_indx
 on [MyTestDB].[dbo].[t1] ([name])
 go


в доке указано:
INCLUDE (column [ ,... n ] )
автор
Указывает неключевые столбцы, добавляемые на конечный уровень некластеризованного индекса. Некластеризованный индекс может быть уникальным или не уникальным.

как я понимаю созданные мной два индекса некластеризованные.
В первом случае, столбцы descr и period добавляются на конечный уровень некластеризованного индекса.
Не понимаю смысла...что это даёт?

автор
Добавление неключевых столбцов позволяет создавать некластеризованные индексы, покрывающие больше запросов. Это обусловлено следующими преимуществами неключевых столбцов.
Они могут содержать типы данных, не разрешенные для ключевых столбцов индекса.
Они не учитываются компонентом Компонент Database Engine при расчете числа ключевых столбцов индекса и размера ключа индекса.

Какие типы данных не пригодны для создания индекса?
автор
Можно добавить неключевые столбцы на конечный уровень некластеризованного индекса и обойти существующее ограничение на ключи индексов (900 байт и 16 ключевых столбцов) и выполнять полностью индексированные запросы.

не совсем понял. 16 ключевых столбцов - имеется ввиду, что на таблицу можно лишь 16 индексов создать, которые будут ссылаться на ключ кластеризованного индекса?

не получилось смоделировать:
 create table big_table (
 id int,
 c1 int,
 c2 int,
 c3 int,
 c4 int,
 c5 int,
 c6 int,
 c7 int,
 c8 int,
 c9 int,
 c10 int,
 c11 int,
 c12 int,
 c13 int,
 c14 int,
 c15 int,
 c16 int,
 period1 date,
 period2 date,
 descr varchar(100),
 )

create clustered index big_table_primary_key_indx on big_table(id)
 go

create index big_table_index_01 on big_table (c1)
 go
 create index big_table_index_02 on big_table (c2)
 go
 create index big_table_index_03 on big_table (c3)
 go
 create index big_table_index_04 on big_table (c4)
 go
 create index big_table_index_05 on big_table (c5)
 go
 create index big_table_index_06 on big_table (c6)
 go
 create index big_table_index_07 on big_table (c7)
 go
 create index big_table_index_08 on big_table (c8)
 go
 create index big_table_index_09 on big_table (c9)
 go
 create index big_table_index_010 on big_table (c10)
 go
 create index big_table_index_011 on big_table (c11)
 go
 create index big_table_index_012 on big_table (c12)
 go
 create index big_table_index_013 on big_table (c13)
 go
 create index big_table_index_014 on big_table (c14)
 go
 create index big_table_index_015 on big_table (c15)
 go
 create index big_table_index_016 on big_table (c16)
 go
 create index big_table_index_017 on big_table (period1)
 go
 create index big_table_index_018 on big_table (period2)
 go

всё создалось...наверное я что-то не так понял про это ограничение...

и почему когда я выполняю запрос:
select * from t1 where name ='aaa'
go


в плане ни тот, ни другой индексы не используются?

 <TableScan Ordered="false" ForcedIndex="false" NoExpandHint="false">
                <DefinedValues>
                  <DefinedValue>
                    <ColumnReference Database="[MyTestDB]" Schema="[dbo]" Table="[t1]" Column="id" />
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Database="[MyTestDB]" Schema="[dbo]" Table="[t1]" Column="name" />
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Database="[MyTestDB]" Schema="[dbo]" Table="[t1]" Column="descr" />
                  </DefinedValue>
                  <DefinedValue>
                    <ColumnReference Database="[MyTestDB]" Schema="[dbo]" Table="[t1]" Column="period" />
                  </DefinedValue>
                </DefinedValues>
                <Object Database="[MyTestDB]" Schema="[dbo]" Table="[t1]" IndexKind="Heap" />
                <Predicate>
                  <ScalarOperator ScalarString="[MyTestDB].[dbo].[t1].[name]='aaa'">
                    <Compare CompareOp="EQ">
                      <ScalarOperator>
                        <Identifier>
                          <ColumnReference Database="[MyTestDB]" Schema="[dbo]" Table="[t1]" Column="name" />
                        </Identifier>
                      </ScalarOperator>
                      <ScalarOperator>
                        <Const ConstValue="'aaa'" />
                      </ScalarOperator>
                    </Compare>
                  </ScalarOperator>
                </Predicate>
              </TableScan>
            </RelOp>
            <ParameterList>
              <ColumnReference Column="@1" ParameterCompiledValue="'aaa'" />
            </ParameterList>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>
5 дек 13, 18:22    [15248656]     Ответить | Цитировать Сообщить модератору
 Re: Mssql не хочет использовать индекс. Как подсказать оптимизатору и сохранить план запроса?  [new]
o-o
Guest
risten,

потому что "вставил две строки".
вставьте больше, не стесняйтесь :)
5 дек 13, 18:37    [15248738]     Ответить | Цитировать Сообщить модератору
 Re: Mssql не хочет использовать индекс. Как подсказать оптимизатору и сохранить план запроса?  [new]
NickAlex66
Member

Откуда:
Сообщений: 319
risten,

Создайте кластерный индекс по id и missing_index_t1 будет вам счастье :)
5 дек 13, 18:37    [15248743]     Ответить | Цитировать Сообщить модератору
 Re: Mssql не хочет использовать индекс. Как подсказать оптимизатору и сохранить план запроса?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
risten
В первом случае, столбцы descr и period добавляются на конечный уровень некластеризованного индекса.
Не понимаю смысла...что это даёт?
Это выгодно, когда нужно использовать эти поля в запросе, но не нужно по ним искать.
risten
16 ключевых столбцов - имеется ввиду, что на таблицу можно лишь 16 индексов создать
Нет, в одном индексе не больше 16 полей, по которым можно искать одновременно.
risten
и почему когда я выполняю запрос:
select * from t1 where name ='aaa'
go

в плане ни тот, ни другой индексы не используются?
Видимо, мало строк, проще сделать скан этой одной строки, чем читать сначала индексы, а потом уже одну строку.
5 дек 13, 19:47    [15249007]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить