Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Перекрестные индексы. Как лучше? / 25 сообщений из 63, страница 1 из 3
10.10.2018, 13:24
    #39715534
Jhonny-2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Добрый день.
Подскажите, есть ли какое-то влияние, если имеются перекрестные индексы.
Пример
1 индекс: a, b, c
2 индекс: b, d
3 индекс b, c, d

Или лучше всего создать индекс, включающий 4 этих поля?
...
Рейтинг: 0 / 0
10.10.2018, 13:26
    #39715537
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Лучше для каких запросов?
...
Рейтинг: 0 / 0
10.10.2018, 13:26
    #39715538
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Jhonny-2005,

Сферические индексы? Для чего лучше? Индексы создают не по традициям и обычаям
...
Рейтинг: 0 / 0
10.10.2018, 13:35
    #39715545
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Jhonny-2005есть ли какое-то влияние, если имеются перекрестные индексы.Отож... чем больше индексов, тем ниже скорость выполнения запросов, изменяющих данные (INSERT/UPDATE/DELETE).
...
Рейтинг: 0 / 0
10.10.2018, 13:35
    #39715546
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Jhonny-2005Добрый день.
Подскажите, есть ли какое-то влияние, если имеются перекрестные индексы.
Пример
1 индекс: a, b, c
2 индекс: b, d
3 индекс b, c, d

Или лучше всего создать индекс, включающий 4 этих поля?

Если совсем сферически, то лучше

1. a
2. b
3. c
4. d

есть шансы на index intersection.
...
Рейтинг: 0 / 0
10.10.2018, 13:57
    #39715566
Jhonny-2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Гавриленко Сергей АлексеевичЛучше для каких запросов?
Спасибо за аргументированный вопрос.
Хотелось бы понять, лучше для запросов insert/update будет иметь один покрывающий индекс по всем этим полям, или же иметь такой набор индексов без существенной потери скорости на таблице более 10млн записей.
...
Рейтинг: 0 / 0
10.10.2018, 14:00
    #39715569
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Jhonny-2005Гавриленко Сергей АлексеевичЛучше для каких запросов?
Спасибо за аргументированный вопрос.
Хотелось бы понять, лучше для запросов insert/update будет иметь один покрывающий индекс по всем этим полям, или же иметь такой набор индексов без существенной потери скорости на таблице более 10млн записей.Для сферических запросов insert лучше будет иметь индексы, которые нпозволят наиболее быстро проверить существующие ограничения (если такоевые есть). Для сферических же запросов update такие, которые позволят быстрее всего найти записи, которые надо изменять. Ну и не забываем еще сферические запросы на select.
...
Рейтинг: 0 / 0
10.10.2018, 16:23
    #39715646
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Jhonny-2005,

вам уже пояснили что количество индексов влияет на скорость изменения данных.

По вашему вопросу:

Если вы делаете такой запрос:
SELECT * FROM table WHERE a = 5
То нужно делать индекс на поле "a"

SELECT a,b,c,d FROM table WHERE a = 5
То нужно делать индекс на поле "a" c включёнными другими полями.

SELECT * FROM table WHERE a = 5 and b = 'x'
То нужно делать индекс по полям "a" и "b" и ставить первое поле индекса то, которое имеет большую селективность (то где больше различных значений).

Там ещё очень много разных вариантов, типа кластерных индексов и т.п.
...
Рейтинг: 0 / 0
10.10.2018, 19:22
    #39715743
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
SandalTreeSELECT * FROM table WHERE a = 5 and b = 'x'
То нужно делать индекс по полям "a" и "b" и ставить первое поле индекса то, которое имеет большую селективность (то где больше различных значений)Которое чаще используется в других запросах со знаком равенства. А скорость конкретно этого запроса никак не поменяется от того в каком порядке стоят "a" и "b" в индексе.
...
Рейтинг: 0 / 0
10.10.2018, 21:40
    #39715809
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Mind,

Я не собираюсь спорить, просто сравните различия в планах одного и того-же запроса, но с разницей в индексах.
Сами можете запустить и проверить.
Заранее спасибо.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE testindex (a INT, b CHAR(1))
GO
;WITH xx AS (SELECT * FROM 
	(VALUES (5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A')) AS x(a,b)
) 
INSERT INTO testindex(a,b) SELECT x1.*
FROM xx AS x1,xx AS x2,xx AS x3,xx AS x4,xx AS x5,xx AS x6,xx AS x7;
GO
INSERT INTO testindex(a,b) VALUES (5,'X')
GO
CREATE INDEX IX_testindex ON testindex(a,b)
GO
SELECT * FROM testindex WHERE a = 5 and b = 'X'
GO
DROP INDEX IX_testindex ON testindex;
GO
CREATE INDEX IX_testindex ON testindex(b,a)
GO
SELECT * FROM testindex WHERE a = 5 and b = 'X'
GO
...
Рейтинг: 0 / 0
10.10.2018, 21:44
    #39715812
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Mind,

Хотя, я с вашим замечанием согласен, если в 99% случаев у нас поле "b" в запросах не используется, то скорее всего по нему индекс и не нужен, но это уже нужно смотреть статистику запросов.

В общем-же случае правило такое: Первая колонка в индексе та, у которой наибольшая селективность.
...
Рейтинг: 0 / 0
10.10.2018, 22:29
    #39715831
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
SandalTreeВ общем-же случае правило такое: Первая колонка в индексе та, у которой наибольшая селективность.Видимо и на форуме, и в MS собрались одни идиоты...

https://technet.microsoft.com/en-us/library/jj835095(v=sql.110).aspx?f=255&MSPPError=-2147217396 Consider the order of the columns if the index will contain multiple columns. The column that is used in the WHERE clause in an equal to (=), greater than (>), less than (<), or BETWEEN search condition, or participates in a join, should be placed first. Additional columns should be ordered based on their level of distinctness, that is, from the most distinct to the least distinct.Попробуйте поразмышлять почему рекомендовано именно так.
...
Рейтинг: 0 / 0
11.10.2018, 00:50
    #39715867
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
SandalTreeЯ не собираюсь спорить, просто сравните различия в планах одного и того-же запроса, но с разницей в индексах.Вот бы в тестовых планах сравнивать estimate-фигню, ага.
SandalTreeи ставить первое поле индекса то, которое имеет большую селективность (то где больше различных значений).Где-же источник этого бреда, который несут уже который год на собеседованиях?...

UPD. Хотя, некая доля правды в утверждении "ставить первое левее поле в индексе то, которое имеет большую селективность (то где больше различных значений)" есть для случая с запросами вида "... and x > ... and y > ... и т.п.". Но и тут могут быть нюансы.
...
Рейтинг: 0 / 0
11.10.2018, 01:38
    #39715868
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
invm https://technet.microsoft.com/en-us/library/jj835095(v=sql.110).aspx?f=255&MSPPError=-2147217396 Consider the order of the columns if the index will contain multiple columns. The column that is used in the WHERE clause in an equal to (=), greater than (>), less than (<), or BETWEEN search condition, or participates in a join, should be placed first. Additional columns should be ordered based on their level of distinctness, that is, from the most distinct to the least distinct.Попробуйте поразмышлять почему рекомендовано именно так.Если честно я вообще не понимаю что именно они рекомендуют. Какие еще варианты могут быть запихать колонку в WHERE кроме как = > < или BETWEEN? С функциями что-ли? Additional columns это что? Все те что кроме first? Или те что все еще в WHERE но непонятно с какими условиями поиска или те что даже не в WHERE? А зачем они вообще в индексе нужны? А какая тогда разница на их distinctness? И вообще получается что только начиная со второй колонки есть смысл в каком порядке запихивать в индекс, а первую как выбрать если там несколько в WHERE?
Или они хотели сказать "Additionally, columns...". Такое ощущение что эти рекомендации переводили индусы основываясь на доисторических свитках Sybase.
...
Рейтинг: 0 / 0
11.10.2018, 02:08
    #39715869
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
SandalTreeMind,

Я не собираюсь споритьНе уверен о чем можно вообще спорить с человеком, который не знает в чем разница между статистикой и индексами и что при создании индекса автоматически создается статистика с FULLSCAN, а при автостатистике с успользованием сэмпла. Но при следующем же UPDATE STATISTICS или sp_updatestats все вернется в "норму".

SandalTreeВ общем-же случае правило такое: Первая колонка в индексе та, у которой наибольшая селективность.Есть хоть один аргумент почему надо делать именно так?
...
Рейтинг: 0 / 0
11.10.2018, 02:19
    #39715870
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Гавриленко Сергей АлексеевичUPD. Хотя, некая доля правды в утверждении "ставить первое левее поле в индексе то, которое имеет большую селективность (то где больше различных значений)" есть для случая с запросами вида "... and x > ... and y > ... и т.п.". Но и тут могут быть нюансы.Ну тут же явно уже другое правило. Все поля в индексе после поля с поиском по диапазону использоваться в запросе как seek predicate не будут и их смело можно пихать в INCLUDE. В таком случае есть смысл из всех полей с поиском на неравенство найти наиболее селективное и поставить его последним , после всех полей с равенством.
...
Рейтинг: 0 / 0
11.10.2018, 07:15
    #39715893
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Свои 5 копеек добавлю к сказанному выше.
Покажу на примере, алгоритм выбора индексов.
Тут только селекты, но это также применимо и к апдейтам.

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
use tempdb
go

drop table if exists dbo.table1 
go

create table dbo.table1 (
    a int not null
  , b varchar(10) not null
  , c int not null
  , d int not null
)

select a, b
from dbo.table1
where a = 5;
-- лучший индекс: create index IDX1 on dbo.table1 ( a ) include ( b )

select a, b, c, d
from dbo.table1
where a = 5;
-- лучший индекс: create index IDX2 on dbo.table1 ( a ) include ( b, c, d )

select *
from dbo.table1
where a = 5
  and b = 'x';
-- лучший индекс, в зависимости от селективности столбца: 
--   create index IDX3 on dbo.table1 ( a, b ) include ( c, d )
--   create index IDX3 on dbo.table1 ( b, a ) include ( c, d )

select *
from dbo.table1
where a = 5
  and c between 10 and 20
  and b = 'x';
-- лучший индекс, в зависимости от селективности столбца: 
--   create index IDX4 on dbo.table1 ( a, b, c ) include ( d )
--   create index IDX4 on dbo.table1 ( b, a, c ) include ( d )


это все хорошо, можно создать кучу этих индексов, которые будут идеальными для каждого из этих запросов.
но это повлияет на производительность запросов вставки и обновления, т.к. серверу придется поддерживать все эти индексы (вставлять и обновлять значения там).

проанализировав все эти запросы и варианты индексов можно сделать один универсальный,
который хорошо покроет все наши запросы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create index IDX 
on dbo.table1 ( a, b, c ) 
include ( d )

/*
первой идет "a" т.к. у нас есть запрос который делает выборку только по этому столбцу
второй идет "b", у нас есть запрос с фильтрацией по "а" и "b" столбцам
третий столбец "c", запрос где используются "а" и "b" и "c" с фильтрацией по диапазону

включенный столбец: "d" т.к. почти всегда он в резалтсете
*/


За все время разработки под sql server мне практически никогда не приходилось думать о селективности первого столбца в индексе
т.к. в большинстве случаев мы опираемся на то, какие запросы мы делаем к таблицам и с какими фильтрами, а также на ограничение в количестве индексов - много индексов это плохо.

ps: фильтрованые индексы я тут не использовал, чтобы не усложнять.
...
Рейтинг: 0 / 0
11.10.2018, 15:47
    #39716211
demind10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
SandalTreeВ общем-же случае правило такое: Первая колонка в индексе та, у которой наибольшая селективность.Есть хоть один аргумент почему надо делать именно так?[/quot]

Может быть дело в статистике ? Если нам все равно какой столбец из участвующих в where или join поставить самым левым, то почему бы не использовать с наибольшей селективностью ? Оптимизатор сможет точнее оценить число строк, которые будут возвращены и поэтому сможет построить более быстрый план ?
Это чисто мое предположение, не претендующее на истину.
...
Рейтинг: 0 / 0
11.10.2018, 15:57
    #39716214
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
invmSandalTreeВ общем-же случае правило такое: Первая колонка в индексе та, у которой наибольшая селективность.Видимо и на форуме, и в MS собрались одни идиоты...

https://technet.microsoft.com/en-us/library/jj835095(v=sql.110).aspx?f=255&MSPPError=-2147217396 Consider the order of the columns if the index will contain multiple columns. The column that is used in the WHERE clause in an equal to (=), greater than (>), less than (<), or BETWEEN search condition, or participates in a join, should be placed first. Additional columns should be ordered based on their level of distinctness, that is, from the most distinct to the least distinct.Попробуйте поразмышлять почему рекомендовано именно так.
Ну да, я идиот, а ещё и дурак, что пытаюсь высказать своё мнение тут, где все и так умные.
В этом тексте говорится что индексы нужны только для тех колонок, которые используются в WHERE или JOIN.
Однако он не говорит что "нужно создавать отдельные индексы для ВСЕХ полей использующихся в WHERE или JOIN"

Кстати, вы попытались меня обидеть, но так и не сказали в чём-же я не прав.
...
Рейтинг: 0 / 0
11.10.2018, 16:10
    #39716228
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Гавриленко Сергей АлексеевичSandalTreeЯ не собираюсь спорить, просто сравните различия в планах одного и того-же запроса, но с разницей в индексах.Вот бы в тестовых планах сравнивать estimate-фигню, ага.
SandalTreeи ставить первое поле индекса то, которое имеет большую селективность (то где больше различных значений).Где-же источник этого бреда, который несут уже который год на собеседованиях?...

UPD. Хотя, некая доля правды в утверждении "ставить первое левее поле в индексе то, которое имеет большую селективность (то где больше различных значений)" есть для случая с запросами вида "... and x > ... and y > ... и т.п.". Но и тут могут быть нюансы.

Вообще-то даже в этом простейшем запросе реальное IO различается на 30%
Если-бы мы взяли пример с джойном нескольких таблиц, то результаты могли-бы быть вообще ужасающие.

Нюансы есть у всех подходов и нельзя религиозно следовать какому-то особому правилу, как например этому.
Всегда нужен балланс скорости и количества качественных индексов.
...
Рейтинг: 0 / 0
11.10.2018, 16:16
    #39716234
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
MindSandalTreeMind,

Я не собираюсь споритьНе уверен о чем можно вообще спорить с человеком, который не знает в чем разница между статистикой и индексами и что при создании индекса автоматически создается статистика с FULLSCAN, а при автостатистике с успользованием сэмпла. Но при следующем же UPDATE STATISTICS или sp_updatestats все вернется в "норму" .

SandalTreeВ общем-же случае правило такое: Первая колонка в индексе та, у которой наибольшая селективность.Есть хоть один аргумент почему надо делать именно так?

Там всё горааааздо сложнее со статистиками. Кстати, что по вашему есть " норма "?

По поводу индексов: А какой аргумент вам нужен?
Постройте 2 разных индекса и посмотрите что сервер предпочтёт тот по которуму выше селективность в первой колонке.
Делов-то.
...
Рейтинг: 0 / 0
11.10.2018, 16:18
    #39716236
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
Mindinvmпропущено...
Попробуйте поразмышлять почему рекомендовано именно так.Если честно я вообще не понимаю что именно они рекомендуют. Какие еще варианты могут быть запихать колонку в WHERE кроме как = > < или BETWEEN? С функциями что-ли? Additional columns это что? Все те что кроме first? Или те что все еще в WHERE но непонятно с какими условиями поиска или те что даже не в WHERE? А зачем они вообще в индексе нужны? А какая тогда разница на их distinctness? И вообще получается что только начиная со второй колонки есть смысл в каком порядке запихивать в индекс, а первую как выбрать если там несколько в WHERE?
Или они хотели сказать "Additionally, columns...". Такое ощущение что эти рекомендации переводили индусы основываясь на доисторических свитках Sybase.
Это ещё что. Там следующий пассаж вообще атас.
...
Рейтинг: 0 / 0
11.10.2018, 16:48
    #39716262
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
SandalTreeВообще-то даже в этом простейшем запросе реальное IO различается на 30%Что за дичь вы тут втираете?


Код: 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.
28.
29.
30.
set nocount on
go
CREATE TABLE testindex (a INT, b CHAR(1))
GO
;WITH xx AS (SELECT * FROM 
	(VALUES (5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A')) AS x(a,b)
) 
INSERT INTO testindex(a,b) SELECT x1.*
FROM xx AS x1,xx AS x2,xx AS x3,xx AS x4,xx AS x5,xx AS x6,xx AS x7;
GO
INSERT INTO testindex(a,b) VALUES (5,'X')
GO
CREATE INDEX IX_testindex_1 ON testindex(a,b)
GO
CREATE INDEX IX_testindex_2 ON testindex(b,a)
go

go
set statistics io on
go
SELECT * FROM testindex with (index = IX_testindex_1 ) WHERE a = 5 and b = 'X'
GO
SELECT * FROM testindex with (index = IX_testindex_2 ) WHERE a = 5 and b = 'X'
GO
set statistics io off
go
--------------------------------------------------------------------------------------------------------------

Table 'testindex'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'testindex'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
...
Рейтинг: 0 / 0
11.10.2018, 17:30
    #39716302
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
SandalTreeпытаюсь высказать своё мнениеНе мнение, а утверждение.
SandalTreeВ этом тексте говорится что индексы нужны только для тех колонок, которые используются в WHERE или JOIN.В этом тексте говорится как определять порядок столбцов в индексе. И вашего утверждения в нем нет. Именно для этого он и был процитирован.
SandalTreeОднако он не говорит что "нужно создавать отдельные индексы для ВСЕХ полей использующихся в WHERE или JOIN"А кто говорит, что нужно именно так?
SandalTreeКстати, вы попытались меня обидеть, но так и не сказали в чём-же я не прав.Да? Предложением поразмышлять?

Касаемого вашего тестаБестолку анализировать запросы с уровнем оптимизации TRIVIAL
Поэтому немного изменим данные и запросы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
/*
Microsoft SQL Server 2017 (RTM-CU9-GDR) (KB4293805) - 14.0.3035.2 (X64)   Jul  6 2018 18:24:36   Copyright (C) 2017 Microsoft Corporation  Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 17134: ) (Hypervisor) 
*/

use tempdb;
go

CREATE TABLE testindex (a INT, b varchar(30), dummy char(100))
GO
;WITH xx AS (SELECT * FROM 
	(VALUES (5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A'),(5,'A')) AS x(a,b)
) 
INSERT INTO testindex(a,b,dummy) SELECT x1.*, 'a'
FROM xx AS x1,xx AS x2,xx AS x3,xx AS x4,xx AS x5,xx AS x6--,xx AS x7;
GO
INSERT INTO testindex(a,b,dummy) VALUES (5,'X','a')
GO

CREATE INDEX IX_testindex ON testindex(a,b)
GO


1.
Код: sql
1.
2.
3.
4.
5.
6.
set statistics profile on;
go
set statistics io on; SELECT a, b FROM testindex WHERE a = 5 and b = 'X' option (recompile); set statistics io off;
go
set statistics profile off;
go

RowsExecutesStmtTextStmtIdNodeIdParentPhysicalOpLogicalOpArgumentDefinedValuesEstimateRowsEstimateIOEstimateCPUAvgRowSizeTotalSubtreeCostOutputListWarningsTypeParallelEstimateExecutions11SELECT a, b FROM testindex WHERE a = 5 and b = 'X' option (recompile)110NULLNULLNULLNULL500000,5NULLNULLNULL1,604764NULLNULLSELECT0NULL11 |--Index Seek(OBJECT:([tempdb].[dbo].[testindex].[IX_testindex]), SEEK:([tempdb].[dbo].[testindex].[a]=(5) AND [tempdb].[dbo].[testindex].[b]='X') ORDERED FORWARD)121Index SeekIndex SeekOBJECT:([tempdb].[dbo].[testindex].[IX_testindex]), SEEK:([tempdb].[dbo].[testindex].[a]=(5) AND [tempdb].[dbo].[testindex].[b]='X') ORDERED FORWARD[tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b]500000,51,0546060,5501575161,604764[tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b]NULLPLAN_ROW01

Код: plaintext
1.
Table 'testindex'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

2.
Код: sql
1.
2.
3.
4.
5.
6.
set statistics profile on;
go
set statistics io on; SELECT a, b FROM testindex WHERE a = 5 and b = 'X'  option (recompile, querytraceon 9481/*turn on "old" Cardinality Estimator*/); set statistics io off;
go
set statistics profile off;
go

RowsExecutesStmtTextStmtIdNodeIdParentPhysicalOpLogicalOpArgumentDefinedValuesEstimateRowsEstimateIOEstimateCPUAvgRowSizeTotalSubtreeCostOutputListWarningsTypeParallelEstimateExecutions11SELECT a, b FROM testindex WHERE a = 5 and b = 'X' option (recompile, querytraceon 9481/*turn on "old" Cardinality Estimator*/)110NULLNULLNULLNULL1NULLNULLNULL0,0032831NULLNULLSELECT0NULL11 |--Index Seek(OBJECT:([tempdb].[dbo].[testindex].[IX_testindex]), SEEK:([tempdb].[dbo].[testindex].[a]=(5) AND [tempdb].[dbo].[testindex].[b]='X') ORDERED FORWARD)121Index SeekIndex SeekOBJECT:([tempdb].[dbo].[testindex].[IX_testindex]), SEEK:([tempdb].[dbo].[testindex].[a]=(5) AND [tempdb].[dbo].[testindex].[b]='X') ORDERED FORWARD[tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b]10,0031250,0001581160,0032831[tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b]NULLPLAN_ROW01
Код: plaintext
1.
Table 'testindex'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

3.
Код: sql
1.
2.
3.
4.
5.
6.
set statistics profile on;
go
set statistics io on; SELECT a, b, dummy FROM testindex WHERE a = 5 and b = 'X' option (recompile); set statistics io off;
go
set statistics profile off;
go

RowsExecutesStmtTextStmtIdNodeIdParentPhysicalOpLogicalOpArgumentDefinedValuesEstimateRowsEstimateIOEstimateCPUAvgRowSizeTotalSubtreeCostOutputListWarningsTypeParallelEstimateExecutions11SELECT a, b, dummy FROM testindex WHERE a = 5 and b = 'X' option (recompile)110NULLNULLNULLNULL500000,5NULLNULLNULL11,99588NULLNULLSELECT0NULL11 |--Table Scan(OBJECT:([tempdb].[dbo].[testindex]), WHERE:([tempdb].[dbo].[testindex].[a]=(5) AND [tempdb].[dbo].[testindex].[b]='X'))121Table ScanTable ScanOBJECT:([tempdb].[dbo].[testindex]), WHERE:([tempdb].[dbo].[testindex].[a]=(5) AND [tempdb].[dbo].[testindex].[b]='X')[tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b], [tempdb].[dbo].[testindex].[dummy]500000,510,895721,10015811611,99588[tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b], [tempdb].[dbo].[testindex].[dummy]NULLPLAN_ROW01
Код: plaintext
1.
Table 'testindex'. Scan count 1, logical reads 14706, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

4.
Код: sql
1.
2.
3.
4.
5.
6.
set statistics profile on;
go
set statistics io on; SELECT a, b, dummy FROM testindex WHERE a = 5 and b = 'X' option (recompile, querytraceon 9481/*turn on "old" Cardinality Estimator*/); set statistics io off;
go
set statistics profile off;
go

RowsExecutesStmtTextStmtIdNodeIdParentPhysicalOpLogicalOpArgumentDefinedValuesEstimateRowsEstimateIOEstimateCPUAvgRowSizeTotalSubtreeCostOutputListWarningsTypeParallelEstimateExecutions11SELECT a, b, dummy FROM testindex WHERE a = 5 and b = 'X' option (recompile, querytraceon 9481/*turn on "old" Cardinality Estimator*/)110NULLNULLNULLNULL1NULLNULLNULL0,00657038NULLNULLSELECT0NULL11 |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1000]) OPTIMIZED)121Nested LoopsInner JoinOUTER REFERENCES:([Bmk1000]) OPTIMIZEDNULL104,18E-061160,00657038[tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b], [tempdb].[dbo].[testindex].[dummy]NULLPLAN_ROW0100 |--Compute Scalar(DEFINE:([Expr1003]=BmkToPage([Bmk1000])))142Compute ScalarCompute ScalarDEFINE:([Expr1003]=BmkToPage([Bmk1000]))[Expr1003]=BmkToPage([Bmk1000])10,0031250,0001581240,0032831[Bmk1000], [tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b], [Expr1003]NULLPLAN_ROW0111 | |--Index Seek(OBJECT:([tempdb].[dbo].[testindex].[IX_testindex]), SEEK:([tempdb].[dbo].[testindex].[a]=(5) AND [tempdb].[dbo].[testindex].[b]='X') ORDERED FORWARD)154Index SeekIndex SeekOBJECT:([tempdb].[dbo].[testindex].[IX_testindex]), SEEK:([tempdb].[dbo].[testindex].[a]=(5) AND [tempdb].[dbo].[testindex].[b]='X') ORDERED FORWARD[Bmk1000], [tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b]10,0031250,0001581240,0032831[Bmk1000], [tempdb].[dbo].[testindex].[a], [tempdb].[dbo].[testindex].[b]NULLPLAN_ROW0111 |--RID Lookup(OBJECT:([tempdb].[dbo].[testindex]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD)172RID LookupRID LookupOBJECT:([tempdb].[dbo].[testindex]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD[tempdb].[dbo].[testindex].[dummy]10,0031250,00015811070,0032831[tempdb].[dbo].[testindex].[dummy]NULLPLAN_ROW01
Код: plaintext
1.
Table 'testindex'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
...
Рейтинг: 0 / 0
11.10.2018, 21:36
    #39716383
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перекрестные индексы. Как лучше?
SandalTreeТам всё горааааздо сложнее со статистиками. Кстати, что по вашему есть " норма "?Норма, в данном случае, это значит разницы в планах выполнения между этими двумя индексами не будет никакой, что вприницпе и должно быть.
SandalTreeПо поводу индексов: А какой аргумент вам нужен?
Постройте 2 разных индекса и посмотрите что сервер предпочтёт тот по которуму выше селективность в первой колонке.
Делов-то.Потому что им нужно было хоть какой то индекс выбрать, даже если стоимость одинаковая. С таким же успехом можно брать порядок колонок из Missing Index подсказок, и приводить это как аргумент.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Перекрестные индексы. Как лучше? / 25 сообщений из 63, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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