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

Откуда:
Сообщений: 1963
После экспорта базы Access в MS SQL сервер получаем таблицу:

/****** Object: Table [dbo].[Communication] Script Date: 07/07/2011 17:44:50 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Communication](
	[ID_comm] [int] NOT NULL,
	[co_XRM] [int] NULL,
	[co_B_CODE] [smallint] NULL,
	[co_CM] [int] NULL,
	[co_rev_ID_comm] [int] NULL,
	[co_LastC_DATE] [datetime] NULL,
	[co_NextC_DATE] [datetime] NULL,
	[co_NextC_TIME] [datetime] NULL,
	[co_TYPE] [smallint] NULL,
	[co_cTYPE] [int] NULL,
	[co_Target] [smallint] NULL,
	[co_COMMENTS] [nvarchar](max) NULL,
	[co_Status] [tinyint] NULL,
	[co_Result] [int] NULL,
	[co_COMMENTS_result] [nvarchar](max) NULL,
	[co_Chain_path] [nvarchar](255) NULL,
	[co_Linked_Deal] [int] NULL,
	[co_Predok] [nvarchar](7) NULL,
	[ID_DEAL] [int] NULL,
	[ID_Outlook] [nvarchar](255) NULL,
	[Outlook] [bit] NOT NULL
) ON [PRIMARY]

GO

Затем выполняем запрос:
SELECT COMMUNICATION.ID_comm, COMMUNICATION.co_CM, COMMUNICATION.co_LastC_DATE, COMMUNICATION.co_NextC_DATE, COMMUNICATION.co_TYPE, COMMUNICATION.co_Target, COMMUNICATION.co_COMMENTS, COMMUNICATION.co_COMMENTS_result, COMMUNICATION.co_Result,
 COMMUNICATION.co_Status, COMMUNICATION.co_NextC_TIME, COMMUNICATION.co_Chain_path, COMMUNICATION.co_TYPE, COMMUNICATION.co_Target, COMMUNICATION.co_Status
 FROM COMMUNICATION INNER JOIN (SELECT DISTINCT left(COMMUNICATION.co_Chain_Path,7) as Expr1 FROM COMMUNICATION
 WHERE (((COMMUNICATION.co_XRM) > 1400))) AS Query9 ON COMMUNICATION.co_Predok = Query9.Expr1 ORDER BY COMMUNICATION.co_CM, COMMUNICATION.co_Chain_path, COMMUNICATION.co_NextC_DATE;
Смотрим в плане выполнения, что Sort занимает 85% времени, и создаём индекс:

create nonclustered index Comm_Main 
on dbo.COMMUNICATION(co_CM)
include (co_Chain_path, co_NextC_DATE)

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

Вопросы: Стоит ли как-то менять индекс?
Как заставить запрос с ним (индексом) работать?
А стоит ли запрос заставлять с ним работать?

В таблице 18000 записей, запрос выдаёт около 5000.

P.S. Перенос вспомогательного запроса из From в Where добавляет лишний шаг в плане выполнения, и всё. % стоимости шагов не меняется.
7 июл 11, 18:14    [10941065]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить запрос использовать индекс? И есть ли смысл в моём случае?  [new]
aleks2
Guest
1. Либо делайте свой индекс CLUSTERED.
2. Либо включайте ВСЕ поля выборки в сыой индекс.
3. Либо выбирайте совсем немного записей (<5%) своим запросом.
7 июл 11, 18:34    [10941198]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить запрос использовать индекс? И есть ли смысл в моём случае?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
тупой ответ - как минимум все поля сортировки в индекс + with (fastfirstrow) / option( fast 1 ) к запросу. хотя может и без хинтов схавает
только вот "85% времени в плане сортировка занимает" - это не совсем "времени" ) и - не факт что это плохо ))
7 июл 11, 18:47    [10941255]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить запрос использовать индекс? И есть ли смысл в моём случае?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
aleks2
1. Либо делайте свой индекс CLUSTERED.
2. Либо включайте ВСЕ поля выборки в сыой индекс.
3. Либо выбирайте совсем немного записей (<5%) своим запросом.
А зачем ВСЕ поля выборки-то включать?
select стопиццот полей from табличко where НУЖНОЕ_ПОЛЕ = 18
8 июл 11, 04:17    [10942717]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить запрос использовать индекс? И есть ли смысл в моём случае?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
DaniilSeryi
В таблице 18000 записей, запрос выдаёт около 5000.
Я бы на месте планировщика - не парился бы, заглянул бы в статистики, и запустил бы скан таблицы.

А вот если бы запрос выдавал бы не 5000, а 500, то тогда уже другой план.
8 июл 11, 04:22    [10942720]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить запрос использовать индекс? И есть ли смысл в моём случае?  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
DaniilSeryi
Смотрим в плане выполнения, что Sort занимает 85% времени, и создаём индекс:
Индекс вам поможет выбрать на 0-10% быстрее (из оставшихся 15% после сорта).
А сам сорт... Если он на 5000 записях занимает 85% общего времени, то это очень гуд!!!
Он сортирует за миллисекунды.
Или вам быстрее надо?
Ну, как вариант - хранить данные в таблице уже в нужном порядке.
Этому поможет кластеризованный индекс.
8 июл 11, 04:50    [10942730]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить запрос использовать индекс? И есть ли смысл в моём случае?  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1963
Makar4ik
DaniilSeryi
Смотрим в плане выполнения, что Sort занимает 85% времени, и создаём индекс:
Индекс вам поможет выбрать на 0-10% быстрее (из оставшихся 15% после сорта).
А сам сорт... Если он на 5000 записях занимает 85% общего времени, то это очень гуд!!!
Он сортирует за миллисекунды.
Или вам быстрее надо?
Ну, как вариант - хранить данные в таблице уже в нужном порядке.
Этому поможет кластеризованный индекс.


Ясно, спасибо Вам.

И спасибо всем остальным ответившим - тему можно закрывать.
8 июл 11, 09:20    [10943064]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить