0

クエリのパフォーマンスについて質問があります。

tblHistory という名前のテーブルがあり、17,000 行が含まれています。14'000 行の tblItem という名前のテーブルと、以下のクエリで説明するような関係にある約 10 行のテーブル tblItemType があります。

次のクエリは、managment Studio で 0sec を示しています。

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 で 0sec を示します。

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

これがなぜそんなに時間がかかるのか、または私がそれをより速くする方法を教えてもらえますか?

どうもありがとうございました。

よろしくお願いします。イヴァン

4

2 に答える 2

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

于 2013-10-14T12:25:05.927 に答える