Имя: Пароль:
IT
 
Помогите понять индексы 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 ляму записей?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.