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

Откуда:
Сообщений: 137
скажите пожалуйста, есть ли смысл создавать составной индекс с полями с малой уникальностью (например битовыми полями)
Тобиш
создать составной индекс на
id,
parentid,
ischecked
где id и parentid это поля с высокой уникальностью , а ischecked может быть 0 или 1.
Но при этом во многих запросах идет в условии проверка поля ischecked (например ischecked=1)

Вообщем:
1) есть ли смысл включать поле ischecked в составной индекс ?
2) намного ли увеличится индекс с этим полем?
3) значительно ли ускорятся запросы где используеься ischecked?
4) насколько замедлятся запросы где не используется ischecked?

Какие будут соображения Товарищи? :)
7 авг 18, 15:58    [21633080]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
примеры запросов приведите, чтобы видно какие условия накладываются
7 авг 18, 16:09    [21633097]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
kolyady
Member

Откуда:
Сообщений: 137
Konst_One,
к примеру
select *
from table1 t1
join table2 t2 on id=t1.id=t2.parentid
join table3 t3 on t1.parentid=t3.id
where t1.ischecked<>1
7 авг 18, 16:38    [21633138]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
kolyady
Member

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

сор ошибочка
select *
from table1 t1
join table2 t2 on t1.id=t2.parentid
join table3 t3 on t1.parentid=t3.id
where t1.ischecked<>1
7 авг 18, 16:40    [21633141]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
плохие запросы и плохое условие отбора

можете попобовать создать индекс по id+parentid+include(ischecked)

ps
и звёздочки * замените на конкретные поля из таблиц в своих запросах

ps ps
и проверьте на своих данных с актуальными планами выполнения
7 авг 18, 16:48    [21633152]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
kolyady,

- Бывает достаточно выгодно создавать фильтрованный индекс или 2
- <> 1 + индекс толком ничего не даст. Пишите = 0
7 авг 18, 16:56    [21633160]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
kolyady
1) есть ли смысл включать поле ischecked в составной индекс ?

Да есть, не будет дполнительного лукапа на другой индекс в некоторых случаях.

kolyady
2) намного ли увеличится индекс с этим полем?

Нет на намного, в среднем на один байт (не бит) на каждую строку.
Поэкспериментируйте, создайте два индекса и сравните размеры.

kolyady
3) значительно ли ускорятся запросы где используеься ischecked?

Зависит от запроса

kolyady
4) насколько замедлятся запросы где не используется ischecked?

Непонятно, ничего не замедлится кроме модификации строк таблицы, я бы не заморачивался, замедление должно быть незначительным.
7 авг 18, 17:10    [21633183]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
TaPaK
- <> 1 + индекс толком ничего не даст. Пишите = 0

Да используйте знак равенства, иначе нет толка от индекса.
7 авг 18, 17:11    [21633184]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
kolyady
Member

Откуда:
Сообщений: 137
Всем спасибо , вроде услышал что хотел. :)
7 авг 18, 17:15    [21633188]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
TaPaK
- <> 1 + индекс толком ничего не даст. Пишите = 0
Сервер уже давно умеет разворачивать "<>" в такое:

К сообщению приложен файл. Размер - 56Kb


Сообщение было отредактировано: 7 авг 18, 17:21
7 авг 18, 17:21    [21633197]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гавриленко Сергей Алексеевич
TaPaK
- <> 1 + индекс толком ничего не даст. Пишите = 0
Сервер уже давно умеет разворачивать "<>" в такое:

индекс он тоже научился разворачивать?
7 авг 18, 17:28    [21633207]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
TaPaK
Гавриленко Сергей Алексеевич
пропущено...
Сервер уже давно умеет разворачивать "<>" в такое:

индекс он тоже научился разворачивать?
Каким образом надо развернуть индекс, чтобы выполнить по нему поиск с условием ">" или с условием "<"?
7 авг 18, 17:31    [21633211]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гавриленко Сергей Алексеевич
TaPaK
пропущено...

индекс он тоже научился разворачивать?
Каким образом надо развернуть индекс, чтобы выполнить по нему поиск с условием ">" или с условием "<"?

я так и написал: пишите = 0
7 авг 18, 17:32    [21633212]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
TaPaK
Гавриленко Сергей Алексеевич
пропущено...
Каким образом надо развернуть индекс, чтобы выполнить по нему поиск с условием ">" или с условием "<"?

я так и написал: пишите = 0
Вы написали, что "<> 1 + индекс толком ничего не даст", что является толком неверным утверждением. В обоих случаях будет использован поиск по индексу. С равенством будет быстрее только на один спуск по дереву, потому что для "<>" будет выполнен поиск по двум предикатам.

Сообщение было отредактировано: 7 авг 18, 17:44
7 авг 18, 17:42    [21633218]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гавриленко Сергей Алексеевич
TaPaK
пропущено...

я так и написал: пишите = 0
Вы написали, что "<> 1 + индекс толком ничего не даст", что толком является неверным утверждением. В обоих случаях будет использован поиск по индексу. С равенством будет быстрее только на один спуск по дереву, потому что для "<>" будет выполнен поиск по двум предикатам.

автор
- <> 1 + индекс толком ничего не даст. Пишите = 0
7 авг 18, 17:44    [21633222]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
TaPaK
Гавриленко Сергей Алексеевич
пропущено...
Вы написали, что "<> 1 + индекс толком ничего не даст", что толком является неверным утверждением. В обоих случаях будет использован поиск по индексу. С равенством будет быстрее только на один спуск по дереву, потому что для "<>" будет выполнен поиск по двум предикатам.

автор
- <> 1 + индекс толком ничего не даст. Пишите = 0
Приведите, пожалуйста, пример, когда простая эквивалентная замена "<> 1" на "= 0" при наличии индекса даст выигрыш хотя бы в два раза. Чтобы, так сказать, убедиться, что именно условие "<> 1" не позволяет "толком" использовать индекс.

UPD: так же, я правильно понимаю, вы будете утвержать, что выгоднее заменять "<> N" на in ( 1, 2, ... все, кроме N) для остальных типов данных?

Сообщение было отредактировано: 7 авг 18, 17:51
7 авг 18, 17:49    [21633236]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гавриленко Сергей Алексеевич
TaPaK
пропущено...

пропущено...
Приведите, пожалуйста, пример, когда простая эквивалентная замена "<> 1" на "= 0" при наличии индекса даст выигрыш хотя бы в два раза. Чтобы, так сказать, убедиться, что именно условие "<> 1" не позволяет "толком" использовать индекс.

UPD: так же, я правильно понимаю, вы будете утвержать, что выгоднее заменять "<> N" на in ( 1, 2, ... все, кроме N) для остальных типов данных?

автор
ischecked может быть 0 или 1.
7 авг 18, 17:52    [21633248]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
TaPaK
Гавриленко Сергей Алексеевич
пропущено...
Приведите, пожалуйста, пример, когда простая эквивалентная замена "<> 1" на "= 0" при наличии индекса даст выигрыш хотя бы в два раза. Чтобы, так сказать, убедиться, что именно условие "<> 1" не позволяет "толком" использовать индекс.

UPD: так же, я правильно понимаю, вы будете утвержать, что выгоднее заменять "<> N" на in ( 1, 2, ... все, кроме N) для остальных типов данных?

автор
ischecked может быть 0 или 1.
Это вы так сливаетесь?
7 авг 18, 17:56    [21633253]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гавриленко Сергей Алексеевич
TaPaK
пропущено...

пропущено...
Это вы так сливаетесь?

да, мне плевать на все ситуации которые вы сейчас предложите, в контекста вопроса правильно писать РАВНО
7 авг 18, 17:58    [21633256]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
TaPaK
Гавриленко Сергей Алексеевич
пропущено...
Это вы так сливаетесь?

да, мне плевать на все ситуации которые вы сейчас предложите, в контекста вопроса правильно писать РАВНО
Я так понимаю, есть какие-то другие, ранее не озвученные, критерии правильности, кроме "индекс толком ничего не даст"? Например "мне так больше нравится"?

Сообщение было отредактировано: 7 авг 18, 18:01
7 авг 18, 18:00    [21633264]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Гавриленко Сергей Алексеевич
Приведите, пожалуйста, пример, когда простая эквивалентная замена "<> 1" на "= 0" при наличии индекса даст выигрыш хотя бы в два раза. Чтобы, так сказать, убедиться, что именно условие "<> 1" не позволяет "толком" использовать индекс.


use tempdb
go
		
create table dbo.Table123 (
	Id int identity primary key,
	Data char(128),
	IsDeleted bit not null,
	index IDX_Table_NonDeletedRows ( Id ) where ( IsDeleted = 0 ) 
)
go

insert into dbo.Table123 ( Data, IsDeleted )
values ( 'data1', 1 ) ,
	   ( 'data2', 0 ) ,
	   ( 'data3', 0 ) ,
	   ( 'data4', 0 ) ,
	   ( 'data5', 1 ) 
go 1000


select id
from dbo.Table123
where IsDeleted = 0

select id
from dbo.Table123
where IsDeleted <> 1
7 авг 18, 18:25    [21633311]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
Владимир Затуливетер,

Речь шла про обычный индекс. То, что не будет использоваться фильтрованный индекс, и ежу понятно. Однако почему при этом обычный индекс будет бесполезен, осталось невыясненным.
7 авг 18, 18:27    [21633316]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Пример конечно вы подобрали бодрый, parent-child hierarchy. В сторону hierarchyid смотрели?

Я так понимаю условие isСhecked <> 1 возвращает очень маленькое кол-во строк относительно всех записей в таблице, иначе бы ваш индекс вообще не использовался в данном запросе, ну точнее index scan, если он покрывающий. Но в таком случае уж лучше тогда сделать по id include (parentID, isChecked), хотя очень вероятно что обычный кластерный индекс по id будет справляться не сильно хуже, т.к. как правило такие деревья не широкие.

В вашем запросе таблица запрашивается 3 раза, и для каждого из этих 3 раз нужно 3 разных индекса (опять же только при условии что
isСhecked <> 1 вернет вам условно < 1% записей в таблице)
7 авг 18, 21:14    [21633496]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Гавриленко Сергей Алексеевич
TaPaK
пропущено...

пропущено...
Приведите, пожалуйста, пример, когда простая эквивалентная замена "<> 1" на "= 0" при наличии индекса даст выигрыш хотя бы в два раза. Чтобы, так сказать, убедиться, что именно условие "<> 1" не позволяет "толком" использовать индекс.
Не уверен насчет в два раза, но что если ischecked нужен в середине индекса, потому что скан диапазона желательно оставить для другого поля? Типа:type+ischecked+date
Второй вариант таки должен быть побыстрее первого.

WHERE type = @type
AND ischecked <> 1
AND date BETWEEN @start AND @end

WHERE type = @type
AND ischecked = 0
AND date BETWEEN @start AND @end
8 авг 18, 02:38    [21633680]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по составномым индексам  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36889
Mind,

Да, при таком индексе в случае с "<> 1" условие по дате переезжает из Seek-предиката в предикат.
8 авг 18, 12:01    [21634098]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить