Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос по составномым индексам / 25 сообщений из 25, страница 1 из 1
07.08.2018, 15:58
    #39684348
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
скажите пожалуйста, есть ли смысл создавать составной индекс с полями с малой уникальностью (например битовыми полями)
Тобиш
создать составной индекс на
id,
parentid,
ischecked
где id и parentid это поля с высокой уникальностью , а ischecked может быть 0 или 1.
Но при этом во многих запросах идет в условии проверка поля ischecked (например ischecked=1)

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

Какие будут соображения Товарищи? :)
...
Рейтинг: 0 / 0
07.08.2018, 16:09
    #39684356
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
примеры запросов приведите, чтобы видно какие условия накладываются
...
Рейтинг: 0 / 0
07.08.2018, 16:38
    #39684369
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
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
...
Рейтинг: 0 / 0
07.08.2018, 16:40
    #39684371
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
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
...
Рейтинг: 0 / 0
07.08.2018, 16:48
    #39684376
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
плохие запросы и плохое условие отбора

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

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

ps ps
и проверьте на своих данных с актуальными планами выполнения
...
Рейтинг: 0 / 0
07.08.2018, 16:56
    #39684382
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
kolyady,

- Бывает достаточно выгодно создавать фильтрованный индекс или 2
- <> 1 + индекс толком ничего не даст. Пишите = 0
...
Рейтинг: 0 / 0
07.08.2018, 17:10
    #39684396
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
kolyady1) есть ли смысл включать поле ischecked в составной индекс ?

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

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

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

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

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

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

Непонятно, ничего не замедлится кроме модификации строк таблицы, я бы не заморачивался, замедление должно быть незначительным.
...
Рейтинг: 0 / 0
07.08.2018, 17:11
    #39684397
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
TaPaK- <> 1 + индекс толком ничего не даст. Пишите = 0
Да используйте знак равенства, иначе нет толка от индекса.
...
Рейтинг: 0 / 0
07.08.2018, 17:15
    #39684400
kolyady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Всем спасибо , вроде услышал что хотел. :)
...
Рейтинг: 0 / 0
07.08.2018, 17:21
    #39684404
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
TaPaK- <> 1 + индекс толком ничего не даст. Пишите = 0Сервер уже давно умеет разворачивать "<>" в такое:
...
Рейтинг: 0 / 0
07.08.2018, 17:28
    #39684408
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Гавриленко Сергей АлексеевичTaPaK- <> 1 + индекс толком ничего не даст. Пишите = 0Сервер уже давно умеет разворачивать "<>" в такое:
индекс он тоже научился разворачивать?
...
Рейтинг: 0 / 0
07.08.2018, 17:31
    #39684410
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
TaPaKГавриленко Сергей Алексеевичпропущено...
Сервер уже давно умеет разворачивать "<>" в такое:
индекс он тоже научился разворачивать?Каким образом надо развернуть индекс, чтобы выполнить по нему поиск с условием ">" или с условием "<"?
...
Рейтинг: 0 / 0
07.08.2018, 17:32
    #39684411
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Гавриленко Сергей АлексеевичTaPaKпропущено...

индекс он тоже научился разворачивать?Каким образом надо развернуть индекс, чтобы выполнить по нему поиск с условием ">" или с условием "<"?
я так и написал: пишите = 0
...
Рейтинг: 0 / 0
07.08.2018, 17:42
    #39684414
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
TaPaKГавриленко Сергей Алексеевичпропущено...
Каким образом надо развернуть индекс, чтобы выполнить по нему поиск с условием ">" или с условием "<"?
я так и написал: пишите = 0Вы написали, что "<> 1 + индекс толком ничего не даст", что является толком неверным утверждением. В обоих случаях будет использован поиск по индексу. С равенством будет быстрее только на один спуск по дереву, потому что для "<>" будет выполнен поиск по двум предикатам.
...
Рейтинг: 0 / 0
07.08.2018, 17:44
    #39684416
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Гавриленко Сергей АлексеевичTaPaKпропущено...

я так и написал: пишите = 0Вы написали, что "<> 1 + индекс толком ничего не даст", что толком является неверным утверждением. В обоих случаях будет использован поиск по индексу. С равенством будет быстрее только на один спуск по дереву, потому что для "<>" будет выполнен поиск по двум предикатам.
автор- <> 1 + индекс толком ничего не даст. Пишите = 0
...
Рейтинг: 0 / 0
07.08.2018, 17:49
    #39684421
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
TaPaKГавриленко Сергей Алексеевичпропущено...
Вы написали, что "<> 1 + индекс толком ничего не даст", что толком является неверным утверждением. В обоих случаях будет использован поиск по индексу. С равенством будет быстрее только на один спуск по дереву, потому что для "<>" будет выполнен поиск по двум предикатам.
автор- <> 1 + индекс толком ничего не даст. Пишите = 0Приведите, пожалуйста, пример, когда простая эквивалентная замена "<> 1" на "= 0" при наличии индекса даст выигрыш хотя бы в два раза. Чтобы, так сказать, убедиться, что именно условие "<> 1" не позволяет "толком" использовать индекс.

UPD: так же, я правильно понимаю, вы будете утвержать, что выгоднее заменять "<> N" на in ( 1, 2, ... все, кроме N) для остальных типов данных?
...
Рейтинг: 0 / 0
07.08.2018, 17:52
    #39684425
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Гавриленко Сергей АлексеевичTaPaKпропущено...

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

UPD: так же, я правильно понимаю, вы будете утвержать, что выгоднее заменять "<> N" на in ( 1, 2, ... все, кроме N) для остальных типов данных?
авторischecked может быть 0 или 1.
...
Рейтинг: 0 / 0
07.08.2018, 17:56
    #39684426
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
TaPaKГавриленко Сергей Алексеевичпропущено...
Приведите, пожалуйста, пример, когда простая эквивалентная замена "<> 1" на "= 0" при наличии индекса даст выигрыш хотя бы в два раза. Чтобы, так сказать, убедиться, что именно условие "<> 1" не позволяет "толком" использовать индекс.

UPD: так же, я правильно понимаю, вы будете утвержать, что выгоднее заменять "<> N" на in ( 1, 2, ... все, кроме N) для остальных типов данных?
авторischecked может быть 0 или 1.Это вы так сливаетесь?
...
Рейтинг: 0 / 0
07.08.2018, 17:58
    #39684428
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Гавриленко Сергей АлексеевичTaPaKпропущено...

пропущено...
Это вы так сливаетесь?
да, мне плевать на все ситуации которые вы сейчас предложите, в контекста вопроса правильно писать РАВНО
...
Рейтинг: 0 / 0
07.08.2018, 18:00
    #39684433
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
TaPaKГавриленко Сергей Алексеевичпропущено...
Это вы так сливаетесь?
да, мне плевать на все ситуации которые вы сейчас предложите, в контекста вопроса правильно писать РАВНОЯ так понимаю, есть какие-то другие, ранее не озвученные, критерии правильности, кроме "индекс толком ничего не даст"? Например "мне так больше нравится"?
...
Рейтинг: 0 / 0
07.08.2018, 18:25
    #39684441
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Гавриленко Сергей АлексеевичПриведите, пожалуйста, пример, когда простая эквивалентная замена "<> 1" на "= 0" при наличии индекса даст выигрыш хотя бы в два раза. Чтобы, так сказать, убедиться, что именно условие "<> 1" не позволяет "толком" использовать индекс.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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
...
Рейтинг: 0 / 0
07.08.2018, 18:27
    #39684443
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Владимир Затуливетер,

Речь шла про обычный индекс. То, что не будет использоваться фильтрованный индекс, и ежу понятно. Однако почему при этом обычный индекс будет бесполезен, осталось невыясненным.
...
Рейтинг: 0 / 0
07.08.2018, 21:14
    #39684513
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Пример конечно вы подобрали бодрый, parent-child hierarchy. В сторону hierarchyid смотрели?

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

В вашем запросе таблица запрашивается 3 раза, и для каждого из этих 3 раз нужно 3 разных индекса (опять же только при условии что
isСhecked <> 1 вернет вам условно < 1% записей в таблице)
...
Рейтинг: 0 / 0
08.08.2018, 02:38
    #39684554
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Гавриленко Сергей АлексеевичTaPaKпропущено...

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
WHERE type = @type
AND ischecked <> 1
AND date BETWEEN @start AND @end

WHERE type = @type
AND ischecked = 0
AND date BETWEEN @start AND @end
...
Рейтинг: 0 / 0
08.08.2018, 12:01
    #39684723
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по составномым индексам
Mind,

Да, при таком индексе в случае с "<> 1" условие по дате переезжает из Seek-предиката в предикат.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос по составномым индексам / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]