テーブル(約18000レコードのリソース)とこの本体のテーブル値関数があります:
ALTER FUNCTION [dbo].[tfn_GetPackageResources]
(
@packageId int=null,
@resourceTypeId int=null,
@resourceCategoryId int=null,
@resourceGroupId int=null,
@resourceSubGroupId int=null
)
RETURNS TABLE
AS
RETURN
(
SELECT Resources.*
FROM Resources
INNER JOIN ResourceSubGroups ON Resources.ResourceSubGroupId=ResourceSubGroups.Id
INNER JOIN ResourceGroups ON ResourceSubGroups.ResourceGroupId=ResourceGroups.Id
INNER JOIN ResourceCategories ON ResourceGroups.ResourceCategoryId=ResourceCategories.Id
INNER JOIN ResourceTypes ON ResourceCategories.ResourceTypeId=ResourceTypes.Id
WHERE
(@resourceSubGroupId IS NULL OR ResourceSubGroupId=@resourceSubGroupId) AND
(@resourceGroupId IS NULL OR ResourceGroupId=@resourceGroupId) AND
(@resourceCategoryId IS NULL OR ResourceCategoryId=@resourceCategoryId) AND
(@resourceTypeId IS NULL OR ResourceTypeId=@resourceTypeId) AND
(@packageId IS NULL OR PackageId=@packageId)
)
今、私はこのようなクエリを作成します:
SELECT id
FROM dbo.tfn_GetPackageResources(@sourcePackageId,null,null,null,null)
WHERE id not in(
SELECT a.Id
FROM dbo.tfn_GetPackageResources(@sourcePackageId,null,null,null,null) a INNER JOIN
dbo.tfn_GetPackageResources(@comparePackageId,null,null,null,null) b
ON a.No = b.No AND
a.UnitCode=b.UnitCode AND
a.IsCompound=b.IsCompound AND
a.Title=b.Title
)
このクエリには約10秒かかります!(各部分のクエリは非常に高速に実行されますが、全体に時間がかかります)確認しましLEFT JOIN
たNOT EXISTS
が、結果は同じでした。しかし、Resourcesテーブルで直接クエリを実行すると、1秒以内で完了します。高速クエリは次のとおりです。
select * from resources where id not in (select id from resources)
どうすれば解決できますか?