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

Откуда:
Сообщений: 336
На сервере под 2005 есть большая ежесуточная таблица с индексами:
create table [Data_2014_12_10]
{
[id] int identity(1,1),
[Interface] int not null,
[SysTime] datetime not null,
[ParameterID] int not null,
[Value] ntext null
}
create nonclustered index [idx_Interface] on [Data_2014_12_10]([Interface]) on [index_Interface_2014_12_10]
create nonclustered index [idx_SysTime] on [Data_2014_12_10]([SysTime]) on [index_SysTime_2014_12_10]
create nonclustered index [idx_ParameterID] on [Data_2014_12_10]([ParameterID]) on [index_ParameterID_2014_12_10]

Когда я делаю запрос:
select * from [Data_2014_12_10] where [Interface] = 12 and [ParameterID] = 351

то моментально получаю результат - 12 строк,
но стоит к существующему запросу добавить условие по неиндексированному полю
select * from [Data_2014_12_10] where [Interface] = 12 and [ParameterID] = 351 and [Value] like 'Default%'

то запрос исполняется несколько минут.
Как можно оптимизировать запрос?
p.s. на сервере ковыряться нельзя - только запрос.
12 дек 14, 19:08    [16991030]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Сделать индекс (Interface, ParameterID, Value).
12 дек 14, 19:10    [16991037]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Хотя, там у вас ntext.

Тогда добавить вычисляемое поле value_varchar as ( cast (Value as varchar (850)) )

И индекс по (Interface, ParameterID, value_varchar). Текст запроса придется поменять.

З.Ы. Может еще прокатить просто индекс по (Interface, ParameterID), но, возможно, его придется "вбивать" в запрос хинтами.

Сообщение было отредактировано: 12 дек 14, 19:13
12 дек 14, 19:12    [16991043]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Гавриленко Сергей Алексеевич
Сделать индекс (Interface, ParameterID, Value).

к сожалению, ничего изменять на сервере нельзя
12 дек 14, 19:12    [16991045]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
а самому запросу оптимальности не добавить?
12 дек 14, 19:14    [16991050]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
=Сергей=
Гавриленко Сергей Алексеевич
Сделать индекс (Interface, ParameterID, Value).

к сожалению, ничего изменять на сервере нельзя


Тогда или
select * from [Data_2014_12_10]  with ( index = index_Interface_2014_12_10 ) where [Interface] = 12 and [ParameterID] = 351 and [Value] like 'Default%'

или
select * from [Data_2014_12_10]  with ( index = index_ParameterID_2014_12_10 ) where [Interface] = 12 and [ParameterID] = 351 and [Value] like 'Default%'


Сообщение было отредактировано: 12 дек 14, 19:16
12 дек 14, 19:15    [16991052]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
=Сергей=
Гавриленко Сергей Алексеевич
Сделать индекс (Interface, ParameterID, Value).

к сожалению, ничего изменять на сервере нельзя

select * 
into #t
from [Data_2014_12_10] where [Interface] = 12 and [ParameterID] = 351

select * from #t where [Value] like 'Default%'
13 дек 14, 01:35    [16992318]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
select
 t.* 
from
 (select top (2147483647) * from [Data_2014_12_10] where [Interface] = 12 and [ParameterID] = 351) t
where
 t.Value like 'Default%';
13 дек 14, 11:28    [16992798]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить