|
Помогите понять индексы MS SQL | ☑ | ||
---|---|---|---|---|
0
H A D G E H O G s
20.07.12
✎
12:55
|
Позорище на мою голову.
Есть РС "Контактная информация". Ну будем считать - просто табличка. Делаю запрос вида SELECT _Fld14845_RRRef, _Fld14846RRef FROM _InfoRg14844 T1 WITH(NOLOCK) WHERE (T1._Fld14846RRef = 0x94A0FD27BDAD5C8041F122244CD904B6) SQL использует индекс _InfoR14844_ByDims20173_RRS (в котором эти 2 поля, первое _Fld14846RRef), что правильно и логично. Делаю запрос вида SELECT _Fld14848, _Fld14846RRef FROM _InfoRg14844 T1 WITH(NOLOCK) WHERE (T1._Fld14846RRef = 0x94A0FD27BDAD5C8041F122244CD904B6) Поле _Fld14848 не входит ни в один индекс. SQL делает TableScan! Почему??? Моя не понимать. Статистику обновлял update statistics _InfoRg14844 WITH FULLSCAN, ALL |
|||
1
H A D G E H O G s
20.07.12
✎
13:01
|
Что то не густо.
|
|||
2
rs_trade
20.07.12
✎
13:09
|
(1) можно терминами 1С? если это типовой регистр КС.
|
|||
3
H A D G E H O G s
20.07.12
✎
13:11
|
(2)
Выбрать всю контактную информацию с типом "Адрес" |
|||
4
Fragster
гуру
20.07.12
✎
13:12
|
поле составного типа и индекс по нему, соответственно, тоже?
|
|||
5
ДенисЧ
20.07.12
✎
13:13
|
"Поле _Fld14848 не входит ни в один индекс"
Поэтому и... Хотя... По идее должен быть index seek, а потом выборка... |
|||
6
H A D G E H O G s
20.07.12
✎
13:14
|
(4) Поле не составного типа. Индекс - составного типа (это поле и другие поля в составе сложных измерений регистра).
p.s. Там есть индексы на все случаи жизни |
|||
7
Fragster
гуру
20.07.12
✎
13:14
|
(6) выбери до кучи _Fld14845_RRRef,
|
|||
8
H A D G E H O G s
20.07.12
✎
13:14
|
(5) Что "потому и"?
Я же не ищу по полю _Fld14848 |
|||
9
Господин ПЖ
20.07.12
✎
13:14
|
оптимизатор зачастую живет своей жизнью... понять и простить
|
|||
10
H A D G E H O G s
20.07.12
✎
13:15
|
(9) Сделать возможными хинты в запросах 1С. А не понять и простить.
|
|||
11
Господин ПЖ
20.07.12
✎
13:15
|
>Я же не ищу по полю _Fld14848
пофих... оно первое по выборке >Хотя... По идее должен быть index seek, а потом выборка... смотря например какого размера таблица |
|||
12
H A D G E H O G s
20.07.12
✎
13:15
|
(7) Тоесть?
|
|||
13
Ёпрст
20.07.12
✎
13:16
|
(0) а селективность индекса какая хоть ?
|
|||
14
H A D G E H O G s
20.07.12
✎
13:16
|
(11) Большая таблица. Об этом говорит IndexSeek в первом случае.
|
|||
15
Господин ПЖ
20.07.12
✎
13:16
|
(10) >Сделать возможными хинты в запросах 1С
кое-какие у тебя и так есть... |
|||
16
H A D G E H O G s
20.07.12
✎
13:17
|
(13) Момент.
|
|||
17
Ёпрст
20.07.12
✎
13:17
|
если у тебя.. 100 уникальных значений на 200 тыщ записей, то скан и будет
:) |
|||
18
H A D G E H O G s
20.07.12
✎
13:18
|
(17) 31,72%
|
|||
19
H A D G E H O G s
20.07.12
✎
13:19
|
(17) Я могу подумать почему, но лучше ты скажи сразу.
|
|||
20
H A D G E H O G s
20.07.12
✎
13:20
|
Селективность то причем тут? Результат запроса по количеству строк одинаков. Разные только - включена в выборку неиндексированная колонка или нет.
|
|||
21
Ёпрст
20.07.12
✎
13:24
|
(19) это предположение, хотя странно
|
|||
22
Господин ПЖ
20.07.12
✎
13:25
|
>Разные только - включена в выборку неиндексированная колонка или нет.
она не просто включена, а стоит первой |
|||
23
BigHarry
20.07.12
✎
13:25
|
А в T-SQL у MS строковые условия не обязательно обрамлять кавычками?
|
|||
24
H A D G E H O G s
20.07.12
✎
13:26
|
(22) Поменял. Все так же.
|
|||
25
H A D G E H O G s
20.07.12
✎
13:27
|
(22) И какая разница то?
|
|||
26
H A D G E H O G s
20.07.12
✎
13:30
|
(23) Это не строки. Это бинарные данные.
|
|||
27
rs_trade
20.07.12
✎
13:30
|
Индексируй остальные колонки, которые в селекте присутствуют
|
|||
28
H A D G E H O G s
20.07.12
✎
13:32
|
(27) Индексировать ресурс Представление неограниченной длины, в котором может крыться Война и Мир, дабы преодолеть звуковой барьер (900 байт:)
Интересно. |
|||
29
rs_trade
20.07.12
✎
13:33
|
(28) я про измерения говорил
|
|||
30
H A D G E H O G s
20.07.12
✎
13:34
|
(29) Измерения все проиндексированны. 1С создала для них туеву хучу индексов в разной последовательности полей. Тут все хорошо?...
Я выбираю ресурс Представление, и сразу TableScan. Почему??? |
|||
31
Ёпрст
20.07.12
✎
13:36
|
а если руками индекс в запросе выбрать, через With(Index())
|
|||
32
Ёпрст
20.07.12
✎
13:36
|
?
|
|||
33
H A D G E H O G s
20.07.12
✎
13:40
|
(31) Конечно сработает.
Nested Loops -> IndexSeek-> RID Lookup |
|||
34
H A D G E H O G s
20.07.12
✎
13:40
|
(32) Смотрит в табличку по RowID
|
|||
35
H A D G E H O G s
20.07.12
✎
13:46
|
Бугага
Взял другое строковое поле, тоже не входящее в индекс, но уже ограниченной длины SELECT _Fld14849, _Fld14846RRef FROM _InfoRg14844 T1 WHERE (T1._Fld14846RRef = 0x94A0FD27BDAD5C8041F122244CD904B6) Тот же TableScan, но план запроса мне подсказывает внести его в индекс. Missing index (impact 79.6567)..... |
|||
36
Serginio1
20.07.12
✎
13:48
|
18 + В первом случае не надо прыгать от индекса к записи так как в первом все данные лежат в индексе.
Во второс случае проще пройтись по таблице это будет быстрее, т.к. данные все равно считываются страницами |
|||
37
H A D G E H O G s
20.07.12
✎
13:49
|
(36) Насчет первого случая я уже понял.
|
|||
38
H A D G E H O G s
20.07.12
✎
13:50
|
(36) В каком случае будет выгодней прыгать от индекса к записи? Когда в выборке будет мало записей?
|
|||
39
H A D G E H O G s
20.07.12
✎
13:51
|
Я не занудствую. Я пытаюсь понять.
|
|||
40
H A D G E H O G s
20.07.12
✎
13:52
|
(36) Ок. Если я счаст добавлю кластерный индекс на поле Fld14846RRef - он мне по кластерному индексу пройдется и RID Lookup, или все равно выгодней TableScan?
|
|||
41
H A D G E H O G s
20.07.12
✎
13:53
|
(40) Хотя нет, какой RID Lookup, мы и так уже на нужной записи при кластерном.
|
|||
42
H A D G E H O G s
20.07.12
✎
13:54
|
Ураааа. ClusteredIndexSeek
|
|||
43
H A D G E H O G s
20.07.12
✎
13:55
|
Хоть тут разобрался.
Остался вопрос - когда выгоднее nonclustered index seek и RID lookup, нежели TableScan |
|||
44
Serginio1
20.07.12
✎
13:58
|
(38) Да судя по 18 у тебя треть записей соответствует индексу и получается очень накладно прыгать. Поэтому по моему в MS SQL 2005 ввели индексы с данными, что бы не прыгать.
|
|||
45
Serginio1
20.07.12
✎
14:03
|
44+ INCLUDE
CREATE INDEX IXPostalCode_inc ON Employees(PostalCode) INCLUDE(LastName) 42 ну да все данные и хранятся в клястерном индексе |
|||
46
H A D G E H O G s
20.07.12
✎
14:03
|
(44) Немного не понимаю, кстати, КАК можно накладно прыгать. Если у тебя есть ROWID - это как адрес в памяти, либо смещение файла, доступ почти мгновенен. Или я не понимаю чего?
|
|||
47
H A D G E H O G s
20.07.12
✎
14:05
|
(44) Сделать выборку, чтобы выбралось 20-30 записей из 3500?
|
|||
48
Serginio1
20.07.12
✎
14:06
|
(46) http://rsdn.ru/article/db/yukonnew.xml#EXCAC
Не совсем мгновенен. При скане все данные хранятся в кэше процессора, а прыгать приходится либо к медленной памяти если страница с данными подгружена, либо эту страницу с диска подгружать |
|||
49
H A D G E H O G s
20.07.12
✎
14:06
|
(46) Или это из за того, что надо прочитать 8 кбайт страницы все равно?
|
|||
50
Serginio1
20.07.12
✎
14:07
|
(47) Но у тебя то в (18) 31%
|
|||
51
H A D G E H O G s
20.07.12
✎
14:08
|
ФУУУУУХ
|
|||
52
Serginio1
20.07.12
✎
14:09
|
(48) Плюс даже когда последовательно читаешь данные сказывается эффект использования DDR с двойным чтением
|
|||
53
H A D G E H O G s
20.07.12
✎
14:09
|
Изменил условие на
WHERE (T1._Fld14846RRef = 0xAF80FC923034C1ED41A83A7B79C1C3E0) В выборке 31 запись IndexSeek и RID УРААААА |
|||
54
Serginio1
20.07.12
✎
14:10
|
52 + а там разница может достигать 10 раз При последовательном чтении и скачкообразным
|
|||
55
H A D G E H O G s
20.07.12
✎
14:10
|
Мир вновь заиграл красками. Пойду поем.
|
|||
56
H A D G E H O G s
20.07.12
✎
14:11
|
(54) Спасибо тебе.
|
|||
57
H A D G E H O G s
20.07.12
✎
14:11
|
За (36) пост.
|
|||
58
Serginio1
20.07.12
✎
14:12
|
На здоровье!
|
|||
59
crazy_killer
20.07.12
✎
14:44
|
*закладка*
|
|||
60
rs_trade
20.07.12
✎
14:46
|
(43) TableScan выгоднее для небольших таблиц. Использующих одну или несколько страниц данных. Для таких таблиц индексы лучше вообще не создавать
|
|||
61
H A D G E H O G s
20.07.12
✎
14:48
|
(60) 3500 записей на РС Контактная информация - это как?
|
|||
62
rs_trade
20.07.12
✎
14:53
|
(61) хз. надо страницами считать. складываем длинну всех колонок, умножаем на кол-во записей. и делим на 4096. получаем кол-во страниц. 3500 для КИ это много. в 1С маленькая таблица, это что то типа справочника организации, валюты и прочее
|
|||
63
Fragster
гуру
20.07.12
✎
14:54
|
(61) гыгыгыгы... у меня 1,5 ляма
|
|||
64
rs_trade
20.07.12
✎
14:57
|
(62) вру. для взрослых версий 8К размер страницы. 4К это в экспрессе
|
|||
65
rs_trade
20.07.12
✎
15:13
|
(64) можно еще так посмотреть DBCC SHOWCONTIG ('dbo._InfoRg14844')
|
|||
66
Serginio1
20.07.12
✎
17:08
|
(63) Гы гы у меня было 60 лямов, а одновременно обновлялись по 4 ляма на прямых запросах с Merge
|
|||
67
H A D G E H O G s
20.07.12
✎
17:10
|
Дайте кто нибудь большую табличку!!
|
|||
68
Господин ПЖ
20.07.12
✎
17:12
|
>3500 записей
это и была "большая таблица"?? |
|||
69
Serginio1
20.07.12
✎
17:14
|
(67) А что нагенерить Гуидов и случайных чисел проблема?
|
|||
70
H A D G E H O G s
20.07.12
✎
17:15
|
(69) Некошерно. Надо будет думать, как генерить, чтобы правдоподобно было.
|
|||
71
Fragster
гуру
20.07.12
✎
17:16
|
(70) рандом по КЛАДРу
|
|||
72
Serginio1
20.07.12
✎
17:20
|
(70) Ну ушел я с той работы, а так зиповские файлы десятками МБ исчислялись.
|
|||
73
rs_trade
20.07.12
✎
18:26
|
(63) у тебя тоже табле скан по 1.5 ляму записей?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |