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

Откуда:
Сообщений: 4887
Добрый день. Интересует вопрос как заставить запрос сделать поиск по одному полю и сортировку по другому без лишних команд в плане запросов?
+ скрипт пример

With cte (a) as (
Select 1 union all
Select a+1 from cte
Where a < 10000)
Select a, a%44 b into #t from cte option (maxrecursion 0)

Create index i1 on #t (a,b)
Create index i2 on #t (b,a)
Create index i3 on #t (b,a) where a>5000
Go

Select * from #t with (index=i1) where a>5000 order by b
Select * from #t with (index=i2) where a>5000 order by b
Select * from #t with (index=i3) where a>5000 order by b


Здесь очевидно лучший индекс - фильтрованный. Но задачи подобные встают для параметризированные запросов - where a>@a. И в общем этом случае фильтрованный индекс не работает. Чета я понять не могу какой индекс лучше для подобного запроса в общем случае (не привязываясь к данным)?
14 мар 16, 21:36    [18930848]     Ответить | Цитировать Сообщить модератору
 Re: как выбрать индекс?  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
Оптимизатор выбирает или фул скан всех строк или сик с сортировкой. Че нельзя добиться сик со сканом?
14 мар 16, 21:45    [18930886]     Ответить | Цитировать Сообщить модератору
 Re: как выбрать индекс?  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
zasandator
Че нельзя добиться сик со сканом?
И как вы себе это представляете?
14 мар 16, 22:28    [18931056]     Ответить | Цитировать Сообщить модератору
 Re: как выбрать индекс?  [new]
Дед-Папыхтет
Member [заблокирован]

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

Ну да... похоже никак... частичный сик со сканом работает типа

Select * from #t where a>5000 order by a,b

Но это уже резалтсет другой...
14 мар 16, 22:35    [18931091]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить