Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сканирование кластерного индекса на секц. таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
Доброго времени суток!
SQL 2005
Имеется секционированная таблица с кластерным индексом по ID, Date
В плане запросов типа:
select id from table_partition	where ID = 1


update table_partition	
            set .....
		where ID = 1


идет сканирование этого кластерного индекса.
Объясните, пож-та, почему не seek ?
26 сен 12, 11:12    [13223684]     Ответить | Цитировать Сообщить модератору
 Re: Сканирование кластерного индекса на секц. таблице  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Volodya
с кластерным индексом по { ID, Date }
Хм, а может у вас пол таблицы ID = 1.
Но вид индекса или название полей эпический.
26 сен 12, 11:48    [13224042]     Ответить | Цитировать Сообщить модератору
 Re: Сканирование кластерного индекса на секц. таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
Дополнительно поясню как я пришел к этому вопросу.
Имеется таблица table1 с кластерным индексом по ID. В планах вышеуазанных запросов по ней всегда один пункт - Clustered Index Seek
Таблицу потребовалось секционировать, я сделал новую table_partittion с кластерным индексом по ID, Date. Перелил все данные из table1 в table_partittion и теперь в планах тех же запросов получаю Index Scan.
Вопрос: это особенность технологии секционирования?
26 сен 12, 11:59    [13224127]     Ответить | Цитировать Сообщить модератору
 Re: Сканирование кластерного индекса на секц. таблице  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Volodya,

А так?
select id from table_partition	where ID = 1 and Date >'19000101'
26 сен 12, 12:06    [13224196]     Ответить | Цитировать Сообщить модератору
 Re: Сканирование кластерного индекса на секц. таблице  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Volodya
Таблицу потребовалось секционировать, я сделал новую table_partittion с кластерным индексом по { ID, Date }
Ну а почему так разбили? И как вы контролируете уникальность ID?

Решение мне кажется неудачным. Да и вообще:
- Надо секционировать!
- Давайте по дате.
- Ну пришлось изменять кластер, давайте так.

Зачем? или Почему так? - для каждого пункта.

Почему-то вспоминается комикс Scott-а Adams-а про пьяных мартышек.
26 сен 12, 12:34    [13224474]     Ответить | Цитировать Сообщить модератору
 Re: Сканирование кластерного индекса на секц. таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
Так в плане появляется seek...

Выполнил оба запроса так:
select id from table_partition	where ID = 1 
select id from table_partition	where ID = 1 and Date >'19000101'


и выяснил, что время выполнения одинаково.
Спасибо!
26 сен 12, 12:36    [13224495]     Ответить | Цитировать Сообщить модератору
 Re: Сканирование кластерного индекса на секц. таблице  [new]
Volodya
Member

Откуда:
Сообщений: 450
Уверен, что многим пригодится, поэтому пишу.
Выяснил, что, при запросе по секционированной таблице без указания в where ключа секционирования, поиск данных ведется в каждой из секций, то есть запрос выполнится столько раз, сколько указано секций в функции секционирования. Поэтому идет скан по индексу.
Чтобы этого избежать нужно указывать (если, конечно, это известно) в запросе в какой секции(секциях) осуществлять поиск. В моем примере таблица разбита по дате, в каждой секции данные за одни сутки. Мне нужно апдейтить запись, которая точно добавилась в текущие сутки, поэтому запрос вида:
select id from table_partition	where ID = 1 and Date between getdate()-0.001 and getdate()+0.001

выполняется с использованием index seek

Кстати, в этом запросе поиск пойдет по всем имеющимся секциям и будет скан:
select id from table_partition	where ID = 1 and Date >'19000101'
27 сен 12, 10:13    [13229966]     Ответить | Цитировать Сообщить модератору
 Re: Сканирование кластерного индекса на секц. таблице  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Volodya,

select id from table_partition where ID = 1 
AND $PARTITION.partition_function_name(Date) = 5 ; -- номер секции
27 сен 12, 10:24    [13230009]     Ответить | Цитировать Сообщить модератору
 Re: Сканирование кластерного индекса на секц. таблице  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Volodya
Выяснил, что, при запросе по секционированной таблице без указания в where ключа секционирования, поиск данных ведется в каждой из секций, то есть запрос выполнится столько раз, сколько указано секций в функции секционирования. Поэтому идет скан по индексу.
Врёте вы всё.
Там Seek, ровно столько раз, сколько секций.

Может вы банально не умеете читать планы.
27 сен 12, 13:35    [13231766]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить