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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

пропущено...
Это вы так сливаетесь?
да, мне плевать на все ситуации которые вы сейчас предложите, в контекста вопроса правильно писать РАВНО
...
Рейтинг: 0 / 0
вопрос по составномым индексам
    #39684433
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKГавриленко Сергей Алексеевичпропущено...
Это вы так сливаетесь?
да, мне плевать на все ситуации которые вы сейчас предложите, в контекста вопроса правильно писать РАВНОЯ так понимаю, есть какие-то другие, ранее не озвученные, критерии правильности, кроме "индекс толком ничего не даст"? Например "мне так больше нравится"?
...
Рейтинг: 0 / 0
вопрос по составномым индексам
    #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
вопрос по составномым индексам
    #39684443
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Затуливетер,

Речь шла про обычный индекс. То, что не будет использоваться фильтрованный индекс, и ежу понятно. Однако почему при этом обычный индекс будет бесполезен, осталось невыясненным.
...
Рейтинг: 0 / 0
вопрос по составномым индексам
    #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
вопрос по составномым индексам
    #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
вопрос по составномым индексам
    #39684723
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mind,

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


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