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

Откуда: Питер
Сообщений: 1938
Здравствуйте!
27 авг 13, 12:26    [14759796]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Shurgenz
Здравствуйте!

И вам не хворать. А вопрос будет?
27 авг 13, 12:26    [14759799]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
кириллk
Member

Откуда:
Сообщений: 1062
Shurgenz,

Может что нить со статистикой?
27 авг 13, 12:27    [14759804]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
andy st
Member

Откуда:
Сообщений: 838
Shurgenz,
или условия для merge join не подходящие, или ожидания ошибочны...
27 авг 13, 12:30    [14759833]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
Вот млин... случайно отправилось....

Суть вопроса...

Есть немаленькая табличка... на ней уникальный кластерный индекс по трем полям. (Primary key clustered)

кроме кластерного еще куча индексов. Задача удаления некоторого количества записей.

Сделал темп таблицу при помощи SELECT INTO c полями кластерного индекса, создал кластерный уникальный индекс на темп таблице.

Далее смотрю план удаления записей из основной таблицы джойня темп таблицу по полям индекса... Тут я ожидаю MERGE соединение. А вижу NESTED LOOPS. Если ставлю хинт MERGE, то получаю соритировку по кластерному индексу.

И вроде записей немало отобралось по условию для удаления... ну процентов 10, не меньше
27 авг 13, 12:34    [14759861]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
параллелизм
Guest
Shurgenz
то получаю сортировку по кластерному индексу.

параллелизм?

зы
а вообще лучше приложить план и запрос
27 авг 13, 12:36    [14759872]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
параллелизм
Shurgenz
то получаю сортировку по кластерному индексу.

параллелизм?

зы
а вообще лучше приложить план и запрос


К сообщению приложен файл (plan.sqlplan - 20Kb) cкачать
27 авг 13, 12:38    [14759886]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Shurgenz
Вот млин... случайно отправилось....

Суть вопроса...

Есть немаленькая табличка... на ней уникальный кластерный индекс по трем полям. (Primary key clustered)

кроме кластерного еще куча индексов. Задача удаления некоторого количества записей.

Сделал темп таблицу при помощи SELECT INTO c полями кластерного индекса, создал кластерный уникальный индекс на темп таблице.

Далее смотрю план удаления записей из основной таблицы джойня темп таблицу по полям индекса... Тут я ожидаю MERGE соединение. А вижу NESTED LOOPS. Если ставлю хинт MERGE, то получаю соритировку по кластерному индексу.

И вроде записей немало отобралось по условию для удаления... ну процентов 10, не меньше

А в чем смысле этих операций с временной таблицей? Зачем дополнительный JOIN при удалении записей, да ещё и с хинтом?
Условие выборки записей для удаления у вас идёт по индексированным полям? И да, лучше бы увидеть план.
27 авг 13, 12:40    [14759896]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
Сергей Викт.
А в чем смысле этих операций с временной таблицей? Зачем дополнительный JOIN при удалении записей, да ещё и с хинтом?
Условие выборки записей для удаления у вас идёт по индексированным полям? И да, лучше бы увидеть план.


Слишком долго... ищу способы облегчить

План выборки записей на удаление не очень легкий... вот, приложил. Потому и сливаю в темп таблицу

К сообщению приложен файл (plan orig.sqlplan - 36Kb) cкачать
27 авг 13, 12:43    [14759919]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Shurgenz
параллелизм
пропущено...

параллелизм?

зы
а вообще лучше приложить план и запрос

Вас удивляет SORT в плане запроса?

Посмотрите тут:
Оператор Merge Join требует наличия двух входных значений, отсортированных в соответствующих столбцах, что можно сделать с помощью вставки явных операций сортировки в план запроса. Соединение слиянием особенно эффективно в случаях, когда явной сортировки не требуется, например, когда в базе данных имеется подходящий индекс сбалансированного дерева или когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со свертыванием
27 авг 13, 12:44    [14759926]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Shurgenz
Сергей Викт.
А в чем смысле этих операций с временной таблицей? Зачем дополнительный JOIN при удалении записей, да ещё и с хинтом?
Условие выборки записей для удаления у вас идёт по индексированным полям? И да, лучше бы увидеть план.


Слишком долго... ищу способы облегчить

План выборки записей на удаление не очень легкий... вот, приложил. Потому и сливаю в темп таблицу

Мало того, что вы
1. сначала должны выбрать эти записи,
2. вы должные ещё их потом залить в темп таблицу,
3. потом создаёте на ней индекс,
4. соединяете с основной таблицей
5. и только потом удаляете записи из основной таблице, которые уже были отобраны в первом шаге.

Вы точно уверены, что это будет быстрее чем: Шаг 1+Шаг5??
27 авг 13, 12:47    [14759948]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
не параллелизм
Guest
Shurgenz

1. вы же удалять собирались, а план на select
2. скрипт таблицы и их индексов не помешал бы
27 авг 13, 12:47    [14759949]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
Сергей Викт.
Shurgenz
пропущено...

Вас удивляет SORT в плане запроса?

Посмотрите тут:
Оператор Merge Join требует наличия двух входных значений, отсортированных в соответствующих столбцах, что можно сделать с помощью вставки явных операций сортировки в план запроса. Соединение слиянием особенно эффективно в случаях, когда явной сортировки не требуется, например, когда в базе данных имеется подходящий индекс сбалансированного дерева или когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со свертыванием


Вот именно, удивляет... с одной стороны у меня кластерный PK, это основная таблица, с другой темп таблица тоже с кластерным PK. Так вот, темп таблица не сортируется в плане, а основная таблица сортируется... Это и удивляет
27 авг 13, 12:48    [14759969]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
не параллелизм
Guest
Сергей Викт.
Shurgenz
пропущено...

Вас удивляет SORT в плане запроса?

Посмотрите тут:
Оператор Merge Join требует наличия двух входных значений, отсортированных в соответствующих столбцах, что можно сделать с помощью вставки явных операций сортировки в план запроса. Соединение слиянием особенно эффективно в случаях, когда явной сортировки не требуется, например, когда в базе данных имеется подходящий индекс сбалансированного дерева или когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со свертыванием

вообще ТС уверяет что у него кластерный индекс имеет тот же ключ что и временная таблица, и как движок может выбрать данные уже отсортированными.
27 авг 13, 12:49    [14759978]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
не параллелизм
Shurgenz

1. вы же удалять собирались, а план на select
2. скрипт таблицы и их индексов не помешал бы


ну вот план... оптимизатор для удаления вообще другой индекс подобрал... ну и HASH JOIN... что тоже не айс на мой взгляд

К сообщению приложен файл (delete plan.sqlplan - 134Kb) cкачать
27 авг 13, 12:52    [14760011]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
не параллелизм
Guest
Shurgenz
Сергей Викт.
пропущено...

Вас удивляет SORT в плане запроса?

Посмотрите тут:
Оператор Merge Join требует наличия двух входных значений, отсортированных в соответствующих столбцах, что можно сделать с помощью вставки явных операций сортировки в план запроса. Соединение слиянием особенно эффективно в случаях, когда явной сортировки не требуется, например, когда в базе данных имеется подходящий индекс сбалансированного дерева или когда порядок сортировки может использоваться для нескольких операций вроде соединения слиянием или группирования со свертыванием


Вот именно, удивляет... с одной стороны у меня кластерный PK, это основная таблица, с другой темп таблица тоже с кластерным PK. Так вот, темп таблица не сортируется в плане, а основная таблица сортируется... Это и удивляет


если верить плану, то во времянки 13 тысяч записей, в таком случае вполне возможно план с nested loop-ми будет быстрее.
а если вы очень хотите прочитать все записи из основной таблицы, то вполне вероятно запрос типа
select T.* FROM #T1 
    INNER hash JOIN Ticket T B ON B.TicketID=T.TopTicketID and B.TicketFirmID=T.TicketFirmID and B.AuthorFirmID=T.AuthorFirmID;
    option(maxdop ...)

будет быстрее
27 авг 13, 12:53    [14760022]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Shurgenz
не параллелизм
пропущено...

1. вы же удалять собирались, а план на select
2. скрипт таблицы и их индексов не помешал бы


ну вот план... оптимизатор для удаления вообще другой индекс подобрал... ну и HASH JOIN... что тоже не айс на мой взгляд

А выложите, пожалуйста, план для
DELETE FROM Ticket WHERE ...
27 авг 13, 12:54    [14760030]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Shurgenz,

Покажите скрипт создания основной таблицы.
У вас в запросе
select T.* FROM Ticket T WITH (ROWLOCK)
    INNER MERGE JOIN #T1 B ON B.TicketID=T.TopTicketID and B.TicketFirmID=T.TicketFirmID and B.AuthorFirmID=T.AuthorFirmID;

Однако, в основной таблице присутсвует еще поле TicketID.
Есть подозрение, что в таблице Ticket кластерный индекс на самом деле (TicketID, TicketFirmID, AuthorFirmID), а не (TopTicketID, TicketFirmID, AuthorFirmID).
Если это не так, и реальный индекс (TopTicketID, TicketFirmID, AuthorFirmID), то это интересно.
27 авг 13, 12:54    [14760031]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Сергей Викт.
Shurgenz
пропущено...


ну вот план... оптимизатор для удаления вообще другой индекс подобрал... ну и HASH JOIN... что тоже не айс на мой взгляд

А выложите, пожалуйста, план для
DELETE FROM Ticket WHERE ...

Ну без джоинов с временной таблицей. Просто в лоб.
27 авг 13, 12:55    [14760043]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
SomewhereSomehow
Shurgenz,

Покажите скрипт создания основной таблицы.
У вас в запросе
select T.* FROM Ticket T WITH (ROWLOCK)
    INNER MERGE JOIN #T1 B ON B.TicketID=T.TopTicketID and B.TicketFirmID=T.TicketFirmID and B.AuthorFirmID=T.AuthorFirmID;

Однако, в основной таблице присутсвует еще поле TicketID.
Есть подозрение, что в таблице Ticket кластерный индекс на самом деле (TicketID, TicketFirmID, AuthorFirmID), а не (TopTicketID, TicketFirmID, AuthorFirmID).
Если это не так, и реальный индекс (TopTicketID, TicketFirmID, AuthorFirmID), то это интересно.


Действительно... сорри ... получил merge. Спасибо!... А то глаз замылился
27 авг 13, 12:57    [14760059]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
не параллелизм
Guest
Shurgenz
не параллелизм
пропущено...

1. вы же удалять собирались, а план на select
2. скрипт таблицы и их индексов не помешал бы


ну вот план... оптимизатор для удаления вообще другой индекс подобрал... ну и HASH JOIN... что тоже не айс на мой взгляд


чем вас пугает HASH JOIN?
хеш таблица будет строиться только по данным из #T.

я
2. скрипт таблицы и их индексов не помешал бы


у вас ограничен параллелизм на сервере?
зачем (rowlock)?
27 авг 13, 12:59    [14760069]     Ответить | Цитировать Сообщить модератору
 Re: Странно как то с кластерными индексами - merge join не работает как ожидается  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Shurgenz
Сергей Викт.
А в чем смысле этих операций с временной таблицей? Зачем дополнительный JOIN при удалении записей, да ещё и с хинтом?
Условие выборки записей для удаления у вас идёт по индексированным полям? И да, лучше бы увидеть план.


Слишком долго... ищу способы облегчить

План выборки записей на удаление не очень легкий... вот, приложил. Потому и сливаю в темп таблицу

так а почему бы не сделать так
;with forDelete as(
select id
from table
)
delete from forDelete


?
27 авг 13, 14:08    [14760561]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить