Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
saszay Member Откуда: Тольятти Сообщений: 458 |
Добрый день! Столкнулся с проблемой выбора индекса при оптимизации запроса: У таблицы есть индекс: Индекс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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Так используется Индекс2 или не используется ? |
||
7 июн 13, 11:15 [14404720] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
Покажите, пожалуйста, план запроса с индексом 1 и после создания индекса 2. И сам запрос тоже. |
||
7 июн 13, 11:16 [14404727] Ответить | Цитировать Сообщить модератору |
Мистер Хенки Member Откуда: канализация Сообщений: 6615 |
запрос, планы запросов с индексами, статистика выполнения, скрипт создания всех обьектов используемых в запросе? |
7 июн 13, 11:16 [14404731] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Этот "товарисчь" много чего предлагает. Если следовать всем его указаниям, таблицы быстро обрастут кучей "полезных" индексов типа — пять ключевых столбцов + 15 include-столбцов. |
||
7 июн 13, 11:20 [14404769] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Индекс2 используется. Индекс1 не используется. |
||||
7 июн 13, 11:41 [14405048] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
И что тогда непонятно, если "При использовании второго индекса чуть меньше логического чтения и "стоимость" выполнения запроса 8%, против 12%" ? |
||
7 июн 13, 11:42 [14405059] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
Ну значит у вас в запросе селективность идёт по одному из двух полей или по обоим и в результирующий набор включены только они и поля из INCLUDE просто не нужны. Второй индекс легче и оптимизатор доволен его использованием. Мне видится так. |
||||
7 июн 13, 11:42 [14405064] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Запрос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] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
а план выполнения? Про какую из таблиц с 2мя индексами вы говорили? |
||
7 июн 13, 11:46 [14405108] Ответить | Цитировать Сообщить модератору |
Ivan Durak Member Откуда: Minsk!!! Сообщений: 3646 |
В добавок к этому - первый на вставке медленнее. И апдейты полей 3,4,5 тоже с ним медленнее. Короче если поля 3,4,5 не выбираются... или наоборот - кроме них еще поля выбираются - то индекс2 лучше. |
||||
7 июн 13, 11:46 [14405110] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
[quot Сергей Викт[/quot] а план выполнения? Про какую из таблиц с 2мя индексами вы говорили?[/quot] Как план выполнения поместить? Проблема с таблицей Firm. |
7 июн 13, 11:50 [14405139] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
а план выполнения? Про какую из таблиц с 2мя индексами вы говорили?[/quot] Как план выполнения поместить? Проблема с таблицей Firm.[/quot] Ну и что непонятного? У вас из таблицы Firm используется fiiID для поиска. В индексе 2 он есть и весит меньше. А второе поле в индексе2 fiName? Или это поле получается через RID Lookup? |
||
7 июн 13, 11:52 [14405165] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Индекс2 может и лучше, но он занимает место и операции обновления будут идти дольше. |
||||
7 июн 13, 11:58 [14405210] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
ну так удалите Индекс1 |
||
7 июн 13, 11:58 [14405214] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
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] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34657 |
Да, как в сказках.. Направо пройдет— сам умрешь, конь останется, налево пойдешь— коня потеряешь, сам жив останешься... Может быть... А идти-то тебе... |
||||
7 июн 13, 12:37 [14405565] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Удалить не получится - он используется в других запросах... |
||||
7 июн 13, 13:34 [14406009] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы хотите, чтобы на основании одного запроса Engine Tuning Advisor вам посоветовал индекс для всех остальных запросов ? |
||
7 июн 13, 13:39 [14406046] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Нет, я хочу понять: почему не используется индекс, который уже есть в базе, но чуть больше в нём полей, чем нужно для этого запроса. А используется другой индекс, в котором только одно поле есть (нужное для этого запроса). В таблице активно используются только эти два поля (ID и название фирмы) и индексом1, думал я, закрою все проблемы с этой таблицей. А оказалось что нет так. |
||||
7 июн 13, 13:56 [14406195] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
используется тот индекс, который сочтет нужным использовать оптимизатор. |
||
7 июн 13, 13:59 [14406223] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34657 |
saszay, Выложи ещё create table для этих таблиц и create index для, всех индексов. |
7 июн 13, 16:13 [14407294] Ответить | Цитировать Сообщить модератору |
Ivan Durak Member Откуда: Minsk!!! Сообщений: 3646 |
индекс 1 тяжелее - больше страниц занимает, индекс2 меньше i/o даст. При наличии их обоих, ты бы на месте оптимизатора какой бы сканил? |
||||
7 июн 13, 16:58 [14407591] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Индекс2 в базе не было. Вместо него SQL подставляло другой индекс: CREATE UNIQUE NONCLUSTERED INDEX [IX_Firm_fiName_unique] ON [dbo].[Firm] ( [fiName] ASC ) INCLUDE ( [fiUrl], [usiID], [fiiID]) |
||||
7 июн 13, 17:13 [14407702] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Что значит "SQL подставлял" ? Простое наличие индекса не обязывает оптимизатор использовать его в каждом запросе. |
||
7 июн 13, 17:16 [14407725] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |