2013-10-14 79 views
0

我對查詢的性能有疑問。select語句上的SQL Server性能

我有一個名爲tblHistory的表,它包含17'000行。 我有一個表名爲tblItem與14'000行和表tblItemType與約10行是關係如下面在查詢中所述。

下面的查詢顯示在同治工作室0秒:

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 

下面的查詢顯示Management Studio中0秒:

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

你可以試試這個:如果有必要(PK_tblItem和PK_tblHistory)

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' 
) 

而且重建索引