2013-10-14 5 views
0

У меня вопрос о производительности запроса.Sql Производительность сервера в операторе select

У меня есть таблица с именем tblHistory и содержит 17'000 строк. У меня есть таблица с именем tblItem с 14'000 строками и таблицей tblItemType с примерно 10 строками, которые имеют отношение, как описано ниже в запросе.

Следующий запрос показывает 0sec в Managment студии:

Select tblItem_Id, tblItem_Title, 
CountHistoryItems = 
(
SELECT count(*) FROM tblHistory 
where tblHistory_ItemId = tblItem_Id 
) 
from tblItem INNER JOIN tblItemType ON tblItem_ItemTypeId = tblItemType_Id 

Следующий запрос показывает 0sec в Management Studio:

Select tblItem_Id, tblItem_Title 
from tblItem INNER JOIN tblItemType ON tblItem_ItemTypeId = tblItemType_Id 
where 
( 
    tblItemType_BaseTypeId = '00000000-0000-0000-0000-000000000200' or 
    tblItemType_BaseTypeId = '00000000-0000-0000-0000-000000000300' 
) 

Как только я использую оба примера вместе, как в следующем запросе он нужен около 2 минут в управлении Студия для получения результата:

Select tblItem_Id, tblItem_Title, 
CountHistoryItems = 
(
SELECT count(*) FROM tblHistory 
where tblHistory_ItemId = tblItem_Id 
) 
from tblItem INNER JOIN tblItemType ON tblItem_ItemTypeId = tblItemType_Id 
where 
( 
    tblItemType_BaseTypeId = '00000000-0000-0000-0000-000000000200' or 
    tblItemType_BaseTypeId = '00000000-0000-0000-0000-000000000300' 
) 

У вас есть идея, почему это так долго или вы можете сказать мне, как я могу сделать это быстрее?

спасибо.

С уважением. Иван

+0

Какие показатели делают у вас есть на ваших столах? – sphair

+2

Как вы отлаживаете такие проблемы, просматривая план выполнения. Отправьте его здесь. – usr

+0

Вы посмотрели на план выполнения, чтобы узнать, какая часть вашего запроса занимает больше всего времени? – Sedecimdies

ответ

0

создать не кластерный индекс tblItemType_BaseTypeId если вы не

+0

Я сделал не кластерный индекс, но это не имеет никакого значения. Любая другая идея? – Marc

1

Вы можете попробовать это:

select 
    tblItem_id 
    , tblItem_Title 
    , count(*) as CountHistoryItems 
from 
    tblItem 
    inner join tblItemType on tblItem_ItemTypeId = tblItemType_id 
    inner join tblHistory on tblItem_id = tblHistory_itemId 
group by tblItem_id, tblItem_title 
where 
( 
    tblItemType_BaseTypeId = '00000000-0000-0000-0000-000000000200' or 
    tblItemType_BaseTypeId = '00000000-0000-0000-0000-000000000300' 
) 

также перестроить индексы, если это необходимо (PK_tblItem и PK_tblHistory)

Смежные вопросы