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

Откуда:
Сообщений: 2267
Скрипт

create table #t (f1 char(100) , dd datetime)

create unique index  idx_f1 on #t (f1) where dd > '20130101' with (IGNORE_DUP_KEY = OFF )

SET STATISTICS PROFILE ON 
select * from #t  where f1  = '1' 
SET STATISTICS PROFILE OFF

drop table #t


План показывает, что фильтрованный индекс не используется, те Table Scan (пробовал на табличке в 10000 записей), индекс без where ожидаемо отрабатывет Index Seek, собственно вопрос это такая особенность фильтрованного индекса (ткните в БОЛ) или же можно как-то заставить оптимизатор искать по нему, нучите "готовить"?
19 июн 13, 16:59    [14455371]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрованный индекс  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
create table #t (f1 char(100) , dd datetime)

create unique index  idx_f1 on #t (f1) where dd > '20130101' with (IGNORE_DUP_KEY = OFF )

SET STATISTICS PROFILE ON 
select * from #t  where f1  = '1' 
select f1 from #t  where dd > '20130101' and f1  = '1'  -- или инклудить все поля из select'листа, ибо поле, по которому фильтр, в индекс не включается
SET STATISTICS PROFILE OFF

drop table #t
19 июн 13, 17:01    [14455386]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрованный индекс  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Короче, не юзался сик, потому что:
  • не было явного предиката из условия фильтра индекса
  • в индекс не включены все выбираемые поля

    Сообщение было отредактировано: 19 июн 13, 17:03
  • 19 июн 13, 17:02    [14455391]     Ответить | Цитировать Сообщить модератору
     Re: Фильтрованный индекс  [new]
    PaulWist
    Member

    Откуда:
    Сообщений: 2267
    Мда-с, если изменить where запроса, то Table Scan,... получается, что поиск по фильтрованному индексу будет в том случае если where запроса совпадает с where индекса

    create table #t (f1 char(100) , dd datetime)
    
    create unique index  idx_f1 on #t (f1) where dd > '20130101' with (IGNORE_DUP_KEY = OFF )
    
    SET STATISTICS PROFILE ON 
    select * from #t  where f1  = '1' 
    select f1 from #t  where dd >= '20130101' and f1  = '1'  
    SET STATISTICS PROFILE OFF
    
    drop table #t
    
    19 июн 13, 17:06    [14455418]     Ответить | Цитировать Сообщить модератору
     Re: Фильтрованный индекс  [new]
    PaulWist
    Member

    Откуда:
    Сообщений: 2267
    Гавриленко Сергей Алексеевич
    Короче, не юзался сик, потому что:
  • не было явного предиката из условия фильтра индекса
  • в индекс не включены все выбираемые поля


  • чЁ то не выходит каменный цветок :)

    create table #t (f1 char(100) , dd datetime)
    
    create unique index  idx_f1 on #t (f1) [b] INCLUDE ( dd )[/b] where dd > '20130101' with (IGNORE_DUP_KEY = OFF )
    
    SET STATISTICS PROFILE ON 
    select * from #t  where  dd >= '20130101' and f1  = '1' 
    SET STATISTICS PROFILE OFF
    
    drop table #t
    


    или я не правильно понял Ваш коммент?
    19 июн 13, 17:09    [14455437]     Ответить | Цитировать Сообщить модератору
     Re: Фильтрованный индекс  [new]
    Гавриленко Сергей Алексеевич
    Member

    Откуда:
    Сообщений: 37254
    Знак ">" и знак ">=" - две разные вещи.
    19 июн 13, 17:10    [14455448]     Ответить | Цитировать Сообщить модератору
     Re: Фильтрованный индекс  [new]
    PaulWist
    Member

    Откуда:
    Сообщений: 2267
    Вот так, "жирные коды" не выделились :)

    create table #t (f1 char(100) , dd datetime)
    
    create unique index  idx_f1 on #t (f1)  INCLUDE ( dd ) where dd > '20130101' with (IGNORE_DUP_KEY = OFF )
    
    SET STATISTICS PROFILE ON 
    select * from #t  where  dd >= '20130101' and f1  = '1' 
    SET STATISTICS PROFILE OFF
    
    drop table #t
    
    19 июн 13, 17:10    [14455452]     Ответить | Цитировать Сообщить модератору
     Re: Фильтрованный индекс  [new]
    Мистер Хенки
    Member

    Откуда: канализация
    Сообщений: 6615
    PaulWist
    Гавриленко Сергей Алексеевич
    Короче, не юзался сик, потому что:
  • не было явного предиката из условия фильтра индекса
  • в индекс не включены все выбираемые поля


  • чЁ то не выходит каменный цветок :)

    create table #t (f1 char(100) , dd datetime)
    
    create unique index  idx_f1 on #t (f1) [b] INCLUDE ( dd )[/b] where dd > '20130101' with (IGNORE_DUP_KEY = OFF )
    
    SET STATISTICS PROFILE ON 
    select * from #t  where  dd >= '20130101' and f1  = '1' 
    SET STATISTICS PROFILE OFF
    
    drop table #t
    


    или я не правильно понял Ваш коммент?

    попробуй
     dd > '20130101' and f1  = '1' 
    
    19 июн 13, 17:11    [14455458]     Ответить | Цитировать Сообщить модератору
     Re: Фильтрованный индекс  [new]
    PaulWist
    Member

    Откуда:
    Сообщений: 2267
    Гавриленко Сергей Алексеевич
    Знак ">" и знак ">=" - две разные вещи.


    Согласен, но мы же рассматриваем "общий" случай решения задачи :)

    Т.е. я правильно понял, что бы индекс работал надо в запросе тождественно повторять условие фильтра?
    19 июн 13, 17:12    [14455469]     Ответить | Цитировать Сообщить модератору
     Re: Фильтрованный индекс  [new]
    Гавриленко Сергей Алексеевич
    Member

    Откуда:
    Сообщений: 37254
    PaulWist
    Гавриленко Сергей Алексеевич
    Знак ">" и знак ">=" - две разные вещи.


    Согласен, но мы же рассматриваем "общий" случай решения задачи :)

    Т.е. я правильно понял, что бы индекс работал надо в запросе тождественно повторять условие фильтра?
    Не тождественно. Условие в вашем where вылезает за пределы того, что сохранено в индексе. Наоборот работает:

    create table #t (f1 char(100) , dd datetime)
    
    create unique index  idx_f1 on #t (f1) INCLUDE ( dd ) where dd >= '20130101' with (IGNORE_DUP_KEY = OFF )
    
    SET STATISTICS PROFILE ON 
    select * from #t  where  dd > '20130101' and f1  = '1' 
    SET STATISTICS PROFILE OFF
    
    drop table #t
    
    19 июн 13, 17:14    [14455481]     Ответить | Цитировать Сообщить модератору
     Re: Фильтрованный индекс  [new]
    PaulWist
    Member

    Откуда:
    Сообщений: 2267
    Гавриленко Сергей Алексеевич
    Не тождественно. Условие в вашем where вылезает за пределы того, что сохранено в индексе. Наоборот работает:

    create table #t (f1 char(100) , dd datetime)
    
    create unique index  idx_f1 on #t (f1) INCLUDE ( dd ) where dd >= '20130101' with (IGNORE_DUP_KEY = OFF )
    
    SET STATISTICS PROFILE ON 
    select * from #t  where  dd > '20130101' and f1  = '1' 
    SET STATISTICS PROFILE OFF
    
    drop table #t
    


    ОК, значит для поиска придётся "городить" ещё один индекс, ... ладно.
    19 июн 13, 17:48    [14455720]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить