Помогите понять индексы MS SQL #621322


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

В этой группе 1С