Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как можно оптимизнуть такой запрос  [new]
Int23
Guest
Добрый день. У меня есть запрос
exec sp_executesql N'select top 1 count(*) from ("dbo"."TerritoryObject" N0
 left hash join "dbo"."TerritoryObjectType" N1 on (N0."TerritoryObjectType" = N1."OID"))
where (N0."GCRecord" is null and ((isnull(CharIndex(@p0, N0."Name"), 0) > 0) or (isnull(CharIndex(@p0, N1."Name"), 0) > 0)))',N'@p0 nvarchar(4000)',@p0=N'россия'


Так получитается что в таблице TerritoryObjectType более 6 млн записей. Индекс по Name есть но все равно запрос отрабатывает 2 минуты. Что можно попробовать?
28 авг 12, 11:22    [13074364]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизнуть такой запрос  [new]
Int23
Guest
Я описался. В TerritoryObject 6 млн записей
28 авг 12, 11:25    [13074394]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизнуть такой запрос  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
А поиск по Name только по произвольному вхождению строки поиска ? Или можно ограничится вхождением с начала строки?
28 авг 12, 11:28    [13074425]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизнуть такой запрос  [new]
Int23
Guest
Да в том и проблема, что может любое вхождение
28 авг 12, 11:32    [13074456]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизнуть такой запрос  [new]
iap
Member

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

а как может помочь индекс по Name? Никак.
Условием является наличие некоего фрагмента в произвольном месте имени.
Простыми средствами это не лечится.
Разве что http://social.technet.microsoft.com/wiki/ru-ru/contents/articles/12921.full-text.aspx
28 авг 12, 11:37    [13074505]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизнуть такой запрос  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Int23,

Индекс бесполезен. Но интересно, сколько отдельно отрабатывает такой поиск по таблице TerritoryObjectType и отдельно по TerritoryObject? Неужели, даже если полное сканирование, то 6 млн записей обрабатывается аж за 2 минуты?
Если нет, то уберите хинт в соединении и посмотрите, есть ли какие-то индексы на полях N0."TerritoryObjectType" и N1."OID".
Кстати, зачем вам isnull(...,0)>0, если нулл условие и так будет ложным, а у вас заменяется на 0 и проверяется что 0 > 0, т.е. тоже ложное всегда.
28 авг 12, 11:57    [13074700]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизнуть такой запрос  [new]
Int23
Guest
Ну я прописал индекс по GCRecord, TerritoryObjectType, Name. Стало в 2 раза быстрее. Но все равно долговато
28 авг 12, 11:58    [13074707]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизнуть такой запрос  [new]
дык план покажи
Guest
Int23,

дык план покажи. индекс может и есть, только наверно не используется, да?
а GCRecord is null - не уменьшает выборку?
нафига там hash?
6 миллионов посортировать ради интереса?

попробуй найти для начала TerritoryObjectType, которых по идее сильно меньше
из него inner join'ом выбери TerritoryObject

странная организация хранения данных. вроде и структура есть (отдельно object, отдельно objecttype), при этом ключевая информация хранится "где-то там в строке, то ли посерёдке, то ли в конце. а может и в начале".

попробуй структурировать. парсить на этапе вставки или вроде того.
28 авг 12, 12:01    [13074761]     Ответить | Цитировать Сообщить модератору
 Re: Как можно оптимизнуть такой запрос  [new]
aleks2
Guest
declare @t table (OID int primary key clustered)
insert @t
  select distinct OID from dbo.TerritoryObjectType where CharIndex(@p0, Name) > 0

select sum(x) as cnt
from
(select count(*) x
   from dbo.TerritoryObject 
   where GCRecord is null and isnull(CharIndex(@p0, Name), 0) > 0 and TerritoryObjectType not in (select OID from @t)
 union all
 select count(*) from dbo.TerritoryObject N0 inner join @t T on N0.TerritoryObjectType=T.OID
) y
28 авг 12, 12:01    [13074764]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить