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

Откуда: Тольятти
Сообщений: 464
Добрый день!
Столкнулся с проблемой выбора индекса при оптимизации запроса:
У таблицы есть индекс:
Индекс1 (поле1, поле2) INCLUDE (поле3, поле4, поле5)

В ходе оптимизации запроса Engine Tuning Advisor предложил создать дополнительный индекс:
Индекс2 (поле1, поле2)

Время выполнения запросов одинаковое. При использовании второго индекса чуть меньше логического чтения и "стоимость" выполнения запроса 8%, против 12%, индекс используется совсем другой.

Почему предлагает создать практически такой же индекс? Почему сразу не используется Индекс1?

PS. поле1 - smallint, поле2 - varchar(255)
7 июн 13, 11:10    [14404679]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
При использовании второго индекса чуть меньше логического чтения и "стоимость" выполнения запроса 8%, против 12%, индекс используется совсем другой.

Так используется Индекс2 или не используется ?
7 июн 13, 11:15    [14404720]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
saszay
Добрый день!
Столкнулся с проблемой выбора индекса при оптимизации запроса:
У таблицы есть индекс:
Индекс1 (поле1, поле2) INCLUDE (поле3, поле4, поле5)

В ходе оптимизации запроса Engine Tuning Advisor предложил создать дополнительный индекс:
Индекс2 (поле1, поле2)

Время выполнения запросов одинаковое. При использовании второго индекса чуть меньше логического чтения и "стоимость" выполнения запроса 8%, против 12%, индекс используется совсем другой.

Почему предлагает создать практически такой же индекс? Почему сразу не используется Индекс1?

PS. поле1 - smallint, поле2 - varchar(255)

Покажите, пожалуйста, план запроса с индексом 1 и после создания индекса 2.
И сам запрос тоже.
7 июн 13, 11:16    [14404727]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
запрос, планы запросов с индексами, статистика выполнения, скрипт создания всех обьектов используемых в запросе?
7 июн 13, 11:16    [14404731]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
saszay
Engine Tuning Advisor

Этот "товарисчь" много чего предлагает. Если следовать всем его указаниям, таблицы быстро обрастут кучей "полезных" индексов типа — пять ключевых столбцов + 15 include-столбцов.
7 июн 13, 11:20    [14404769]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Glory
saszay
При использовании второго индекса чуть меньше логического чтения и "стоимость" выполнения запроса 8%, против 12%, индекс используется совсем другой.

Так используется Индекс2 или не используется ?


Индекс2 используется. Индекс1 не используется.
7 июн 13, 11:41    [14405048]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
Индекс2 используется. Индекс1 не используется.

И что тогда непонятно, если "При использовании второго индекса чуть меньше логического чтения и "стоимость" выполнения запроса 8%, против 12%" ?
7 июн 13, 11:42    [14405059]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Сергей Викт.
Member

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

Так используется Индекс2 или не используется ?


Индекс2 используется. Индекс1 не используется.

Ну значит у вас в запросе селективность идёт по одному из двух полей или по обоим и в результирующий набор включены только они и поля из INCLUDE просто не нужны. Второй индекс легче и оптимизатор доволен его использованием. Мне видится так.
7 июн 13, 11:42    [14405064]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Запрос
declare @pgID money
set @pgID=629.4
    
SELECT source.fiiID, fiName
FROM (
SELECT Tovars.fiiID
        FROM Tovars WITH (NOLOCK)
        WHERE Tovars.pgID = @pgID
UNION
SELECT Tovars_Sup.fiiID
        FROM Tovars_Sup WITH (NOLOCK)
        WHERE Tovars_Sup.pgID = @pgID
UNION
SELECT 0
) As source
INNER JOIN Firm WITH(noLock) ON source.fiiID = Firm.fiiID
ORDER BY fiName
7 июн 13, 11:44    [14405085]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
saszay
Запрос
declare @pgID money
set @pgID=629.4
    
SELECT source.fiiID, fiName
FROM (
SELECT Tovars.fiiID
        FROM Tovars WITH (NOLOCK)
        WHERE Tovars.pgID = @pgID
UNION
SELECT Tovars_Sup.fiiID
        FROM Tovars_Sup WITH (NOLOCK)
        WHERE Tovars_Sup.pgID = @pgID
UNION
SELECT 0
) As source
INNER JOIN Firm WITH(noLock) ON source.fiiID = Firm.fiiID
ORDER BY fiName

а план выполнения? Про какую из таблиц с 2мя индексами вы говорили?
7 июн 13, 11:46    [14405108]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3795
Glory
saszay
Индекс2 используется. Индекс1 не используется.

И что тогда непонятно, если "При использовании второго индекса чуть меньше логического чтения и "стоимость" выполнения запроса 8%, против 12%" ?

В добавок к этому - первый на вставке медленнее. И апдейты полей 3,4,5 тоже с ним медленнее.
Короче если поля 3,4,5 не выбираются... или наоборот - кроме них еще поля выбираются - то индекс2 лучше.
7 июн 13, 11:46    [14405110]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
[quot Сергей Викт[/quot]
а план выполнения? Про какую из таблиц с 2мя индексами вы говорили?[/quot]

Как план выполнения поместить?
Проблема с таблицей Firm.
7 июн 13, 11:50    [14405139]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
saszay
[quot Сергей Викт

а план выполнения? Про какую из таблиц с 2мя индексами вы говорили?[/quot]

Как план выполнения поместить?
Проблема с таблицей Firm.[/quot]
Ну и что непонятного?
У вас из таблицы Firm используется fiiID для поиска. В индексе 2 он есть и весит меньше. А второе поле в индексе2 fiName? Или это поле получается через RID Lookup?
7 июн 13, 11:52    [14405165]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Ivan Durak
Glory
пропущено...

И что тогда непонятно, если "При использовании второго индекса чуть меньше логического чтения и "стоимость" выполнения запроса 8%, против 12%" ?

В добавок к этому - первый на вставке медленнее. И апдейты полей 3,4,5 тоже с ним медленнее.
Короче если поля 3,4,5 не выбираются... или наоборот - кроме них еще поля выбираются - то индекс2 лучше.


Индекс2 может и лучше, но он занимает место и операции обновления будут идти дольше.
7 июн 13, 11:58    [14405210]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
Индекс2 может и лучше, но он занимает место и операции обновления будут идти дольше.

ну так удалите Индекс1
7 июн 13, 11:58    [14405214]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Glory
saszay
Индекс2 может и лучше, но он занимает место и операции обновления будут идти дольше.

ну так удалите Индекс1

SELECT 
        DatabaseName = DB_NAME()
        ,TableName = OBJECT_NAME(s.[object_id])
        ,IndexName = i.name
        ,user_seeks
        ,user_lookups
        ,user_scans
        ,user_updates    
        ,system_updates 
FROM   sys.dm_db_index_usage_stats s 
INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 
    AND s.index_id = i.index_id 
WHERE  s.database_id = DB_ID()
    AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
    AND (i.name LIKE 'Индекс1' OR i.name LIKE 'Индекс2')

Посмотрите статистику использования индекса 1. Если по нему нет поисков и сканов, а только апдейты, то удалите его нахрен)
7 июн 13, 12:00    [14405227]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
Гость333
saszay
Engine Tuning Advisor

Этот "товарисчь" много чего предлагает. Если следовать всем его указаниям, таблицы быстро обрастут кучей "полезных" индексов типа — пять ключевых столбцов + 15 include-столбцов.


Да, как в сказках..
Направо пройдет— сам умрешь, конь останется, налево пойдешь— коня потеряешь, сам жив останешься... Может быть...

А идти-то тебе...
7 июн 13, 12:37    [14405565]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Сергей Викт.
Glory
ну так удалите Индекс1


Посмотрите статистику использования индекса 1. Если по нему нет поисков и сканов, а только апдейты, то удалите его нахрен)


Удалить не получится - он используется в других запросах...
7 июн 13, 13:34    [14406009]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
Удалить не получится - он используется в других запросах...

Вы хотите, чтобы на основании одного запроса Engine Tuning Advisor вам посоветовал индекс для всех остальных запросов ?
7 июн 13, 13:39    [14406046]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Glory
saszay
Удалить не получится - он используется в других запросах...

Вы хотите, чтобы на основании одного запроса Engine Tuning Advisor вам посоветовал индекс для всех остальных запросов ?


Нет, я хочу понять: почему не используется индекс, который уже есть в базе, но чуть больше в нём полей, чем нужно для этого запроса. А используется другой индекс, в котором только одно поле есть (нужное для этого запроса). В таблице активно используются только эти два поля (ID и название фирмы) и индексом1, думал я, закрою все проблемы с этой таблицей. А оказалось что нет так.
7 июн 13, 13:56    [14406195]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
Нет, я хочу понять: почему не используется индекс, который уже есть в базе,

используется тот индекс, который сочтет нужным использовать оптимизатор.
7 июн 13, 13:59    [14406223]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
saszay,

Выложи ещё create table для этих таблиц и create index для, всех индексов.
7 июн 13, 16:13    [14407294]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3795
saszay
Glory
пропущено...

Вы хотите, чтобы на основании одного запроса Engine Tuning Advisor вам посоветовал индекс для всех остальных запросов ?


Нет, я хочу понять: почему не используется индекс, который уже есть в базе, но чуть больше в нём полей, чем нужно для этого запроса. А используется другой индекс, в котором только одно поле есть (нужное для этого запроса). В таблице активно используются только эти два поля (ID и название фирмы) и индексом1, думал я, закрою все проблемы с этой таблицей. А оказалось что нет так.

индекс 1 тяжелее - больше страниц занимает, индекс2 меньше i/o даст. При наличии их обоих, ты бы на месте оптимизатора какой бы сканил?
7 июн 13, 16:58    [14407591]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Ivan Durak
saszay
пропущено...


Нет, я хочу понять: почему не используется индекс, который уже есть в базе, но чуть больше в нём полей, чем нужно для этого запроса. А используется другой индекс, в котором только одно поле есть (нужное для этого запроса). В таблице активно используются только эти два поля (ID и название фирмы) и индексом1, думал я, закрою все проблемы с этой таблицей. А оказалось что нет так.

индекс 1 тяжелее - больше страниц занимает, индекс2 меньше i/o даст. При наличии их обоих, ты бы на месте оптимизатора какой бы сканил?


Индекс2 в базе не было. Вместо него SQL подставляло другой индекс:
CREATE UNIQUE NONCLUSTERED INDEX [IX_Firm_fiName_unique] ON [dbo].[Firm] 
(
	[fiName] ASC
)
INCLUDE ( [fiUrl],
[usiID],
[fiiID])
7 июн 13, 17:13    [14407702]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса и индексы  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
Индекс2 в базе не было. Вместо него SQL подставляло другой индекс:

Что значит "SQL подставлял" ?
Простое наличие индекса не обязывает оптимизатор использовать его в каждом запросе.
7 июн 13, 17:16    [14407725]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить