Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
Привет.

Есть вот такой запрос

 SELECT     rs.StoreCode,													
				rs.StoreName,
				rs.RetailerCode,														
				rs.RetailerName,
				d.ProductCategory,
				d.ProductLine,
				COUNT(sd.BarCode) as ItemsAmt			
		FROM @stores  rs  
			CROSS JOIN @Models d 
			LEFT JOIN Sales as sd WITH(NOLOCK)
			 ON [sd].[CompanyCode] = @CompanyCode AND [sd].[SaleDate] BETWEEN @StartDate AND @EndDate AND 
			    [sd].[StoreCode]  COLLATE SQL_Latin1_General_CP1_CI_AS = [rs].[StoreCode] AND
				[sd].[ModelId]  COLLATE SQL_Latin1_General_CP1_CI_AS = [d].[ModelId]
		WHERE sd.BarCode IS NOT NULL AND sd.BarCode  <> ''
		 GROUP BY  rs.StoreCode,													
				rs.StoreName,
				rs.RetailerCode,														
				rs.RetailerName,
				d.ProductCategory,
				d.ProductLine


В таблице Sales есть такие индексы
1. CompanyCode, SaleDateб StoreCode, UserId, ModelId
2. BarCode

Вопрос: почему в данном запросе срабытывает индекс 2, а не 1 ?
11 фев 13, 16:36    [13909859]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
дополнение.

индекс 1 - первичный ключ
индекс 2 - некластерный индекс, неуникальный
11 фев 13, 16:37    [13909871]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
iap
Member

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

у Вас фактически не LEFT JOIN, а INNER JOIN - из-за sd.BarCode IS NOT NULL AND sd.BarCode <> ''
Кстати, достаточно sd.BarCode <> ''

Так уберитре же слово LEFT - не обманывайте себя!
11 фев 13, 16:43    [13909915]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
AnaceH
Member

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

Насколько я помню, для эффективного использования индекса при выборке по диапазону ( в вашем случае [sd].[SaleDate] BETWEEN @StartDate AND @EndDate) поле должно быть последним в индексе. У вас же оно второе.
11 фев 13, 16:55    [13910003]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
iap
relief,

у Вас фактически не LEFT JOIN, а INNER JOIN - из-за sd.BarCode IS NOT NULL AND sd.BarCode <> ''
Кстати, достаточно sd.BarCode <> ''

Так уберитре же слово LEFT - не обманывайте себя!


LEFT мне нужен, т.к. надо показывать 0, если нет продаж.

Но даже с учетом изенений так же берется не тот индекс, что я ожидаю

SELECT     rs.StoreCode,													
				rs.StoreName,
				rs.RetailerCode,														
				rs.RetailerName,
				d.ProductCategory,
				d.ProductLine,
				COUNT(sd.BarCode) as ItemsAmt			
		FROM @stores  rs  
			CROSS JOIN @Models d 
			JOIN Sales as sd WITH(NOLOCK)
			 ON [sd].[CompanyCode] = @CompanyCode AND [sd].[SaleDate] BETWEEN @StartDate AND @EndDate AND 
			    [sd].[StoreCode]  COLLATE SQL_Latin1_General_CP1_CI_AS = [rs].[StoreCode] AND
				[sd].[ModelId]  COLLATE SQL_Latin1_General_CP1_CI_AS = [d].[ModelId]
		WHERE sd.BarCode  <> ''
		 GROUP BY  rs.StoreCode,													
				rs.StoreName,
				rs.RetailerCode,														
				rs.RetailerName,
				d.ProductCategory,
				d.ProductLine
11 фев 13, 16:55    [13910004]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
Но даже с учетом изенений так же берется не тот индекс, что я ожидаю

На чем основаны ваши ожидания ?
И какие они собственно ?
11 фев 13, 16:58    [13910019]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Но даже с учетом изенений так же берется не тот индекс, что я ожидаю

На чем основаны ваши ожидания ?
И какие они собственно ?


Ожидания основаны на основании выполнения "Display Etimated Execution Plan"
Ожидание, что будет браться индекс с первичным ключом (1. CompanyCode, SaleDateб StoreCode, UserId, ModelId)
11 фев 13, 17:05    [13910071]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
AnaceH
relief,

Насколько я помню, для эффективного использования индекса при выборке по диапазону ( в вашем случае [sd].[SaleDate] BETWEEN @StartDate AND @EndDate) поле должно быть последним в индексе. У вас же оно второе.
Странное утверждение.
Чтобы использовался индекс по второму полю,
он должен использоваться и для первого,
причём требуется условие точного равенства для первого поля.

relief, если хотите-таки LEFT JOIN, переносите условия из WHERE в ON для LEFT JOINа.
11 фев 13, 17:05    [13910081]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
Ожидания основаны на основании выполнения "Display Etimated Execution Plan"

Так эти ожидания сервера, а не ваши

relief
Ожидание, что будет браться индекс с первичным ключом (1. CompanyCode, SaleDateб StoreCode, UserId, ModelId)

И чем это лучше использования меньшего по размеру индекса ?
11 фев 13, 17:07    [13910100]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Ожидания основаны на основании выполнения "Display Etimated Execution Plan"

Так эти ожидания сервера, а не ваши

relief
Ожидание, что будет браться индекс с первичным ключом (1. CompanyCode, SaleDateб StoreCode, UserId, ModelId)

И чем это лучше использования меньшего по размеру индекса ?


1. Actual Execution Тоже самое выдал
2. Хотите сказать, что может отработать быстрей по индексу на который я не нацелен? Не задумывался над этим. А простой пример не покажите, или ссылку, когда такое может быть?

Спасибо
11 фев 13, 17:18    [13910166]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
1. Actual Execution Тоже самое выдал

Вы издеваетесь ?
Расскажите _свою_ точку зрения, почему использование одного индекса _по-вашему_ мнению лучше использования другого.
11 фев 13, 17:21    [13910183]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
1. Actual Execution Тоже самое выдал

Вы издеваетесь ?
Расскажите _свою_ точку зрения, почему использование одного индекса _по-вашему_ мнению лучше использования другого.


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

Плюс, если сработает второй индекс, который короче, то обрежется очень мало данных.
11 фев 13, 17:29    [13910233]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
Glory
Member

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

И как вы оценили IO ?
А как выбрали стратегию соединения ?
11 фев 13, 17:30    [13910241]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

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

И как вы оценили IO ?
А как выбрали стратегию соединения ?


IO - не знаю что это. Где можно почитать про это?
стратегию соединения - посмотрел на индекс и в таком порядке указал столбцы в джойне
11 фев 13, 17:35    [13910259]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
IO - не знаю что это. Где можно почитать про это?

IO - это InputOutput. Т.е. информация о том, сколько данных будет прочитано и записано.

relief
стратегию соединения - посмотрел на индекс и в таком порядке указал столбцы в джойне

Стратегия join - это не порядок полей. Это алоритм, по которому будет это соединение происходить.
Т.е. что сервер должен физически делать для получения результата
11 фев 13, 17:38    [13910271]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
IO - не знаю что это. Где можно почитать про это?

IO - это InputOutput. Т.е. информация о том, сколько данных будет прочитано и записано.

relief
стратегию соединения - посмотрел на индекс и в таком порядке указал столбцы в джойне

Стратегия join - это не порядок полей. Это алоритм, по которому будет это соединение происходить.
Т.е. что сервер должен физически делать для получения результата


Первое, насколько я понял, можно посмотреть в плане
А второе где можно узнать?
11 фев 13, 17:53    [13910327]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
Первое, насколько я понял, можно посмотреть в плане
А второе где можно узнать?

Тоже в плане.
11 фев 13, 17:54    [13910333]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
relief,
ИМХО первый индекс не сможет использоваться на поля [sd].[StoreCode] , [sd].[ModelId] (это поле еще не используется потому, что оно стоит после userId в индексе, а на userId критериев никаких нет)из за использования COLLATION при сравнении. userId тоже никак не фильтруется, поэтому это еще один - для использования индекса. Ну а sd].[CompanyCode] = @CompanyCode AND [sd].[SaleDate] BETWEEN @StartDate AND @EndDate наверное не самые селективные условия или статистика устарела.
11 фев 13, 17:57    [13910346]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Если я не прав, поправьте, но COLLATE говорит о том что индекс не будет использоваться, ну по крайней мере сика не будет.
11 фев 13, 18:00    [13910355]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Первое, насколько я понял, можно посмотреть в плане
А второе где можно узнать?

Тоже в плане.


а в каком поле смотреть?
11 фев 13, 18:06    [13910384]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
а в каком поле смотреть?

Смотреть вам надо пока в хелп
На статью Logical and Physical Operators Reference.
11 фев 13, 18:08    [13910396]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
AnaceH
relief,

Насколько я помню, для эффективного использования индекса при выборке по диапазону ( в вашем случае [sd].[SaleDate] BETWEEN @StartDate AND @EndDate) поле должно быть последним в индексе. У вас же оно второе.


Наоборот, поля фильтра должны быть лидирующими в индексе.
11 фев 13, 20:06    [13910847]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
relief
Glory
пропущено...

Вы издеваетесь ?
Расскажите _свою_ точку зрения, почему использование одного индекса _по-вашему_ мнению лучше использования другого.


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

Плюс, если сработает второй индекс, который короче, то обрежется очень мало данных.



Расскажи конкретно, сколько.
11 фев 13, 20:09    [13910856]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
relief
Member

Откуда:
Сообщений: 1197
MasterZiv
relief
пропущено...


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

Плюс, если сработает второй индекс, который короче, то обрежется очень мало данных.



Расскажи конкретно, сколько.



если вы про
автор
Плюс, если сработает второй индекс, который короче, то обрежется очень мало данных


то обрежется 5% из 30 млн

Glory,
спасибо
11 фев 13, 20:29    [13910911]     Ответить | Цитировать Сообщить модератору
 Re: Почему не срабатывает индекс  [new]
лолл
Member

Откуда:
Сообщений: 450
relief
В таблице Sales есть такие индексы
1. CompanyCode, SaleDateб StoreCode, UserId, ModelId
2. BarCode


мне кажется первый индекс вообще неудачный хотя бы по последовательности полей. скорее всего должно быть
CompanyCode, StoreCode, UserId, SaleDate, ModelId, но я бы вообще не пользовался в данном случае составным ключом, а добавил бы ключевое поле SaleId, ну а потом в зависимости от ваших запросов создал бы наиболее подходящие индексы, например: CompanyCode, StoreCode, SaleDate, ModelId
11 фев 13, 21:00    [13910995]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить