我需要优化这个查询,但我不知道如何。
select
max(case when EAMT.ENTITY_ASSOC_TYPE_ID = 5519 then EAMT.[TEXT] end) as OnDate
,max(case when EAMT.ENTITY_ASSOC_TYPE_ID =5523 then EAMT.[TEXT] end) as [Description]
,max(case when EAMT.ENTITY_ASSOC_TYPE_ID = 5520 then LTRIM(RTRIM(EAMT.[TEXT])) end) as [Case_URL]
,EAMT.ENTITY_ID
from ENTITY_ASSOC_METADATA_TEXT EAMT with (nolock)
where EAMT.ENTITY_ASSOC_TYPE_ID in (
select ENTITY_ASSOC_TYPE_ID
from ENTITY_ASSOC_TYPE with (nolock)
where Entity_Type_ID in (select Entity_Type_ID
from ENTITY_TYPE with (nolock)
where Name like '%Daily Work Status%'
) and IS_ACTIVE = 'Y'
) and EAMT.IS_ACTIVE = 'Y'
Group by Entity_ID
我是优化的新手。目前此查询需要5分31秒。请帮忙。
我首先将其写为连接:
select EAMT.ENTITY_ID
max(case when EAMT.ENTITY_ASSOC_TYPE_ID = 5519 then EAMT.[TEXT] end) as OnDate,
max(case when EAMT.ENTITY_ASSOC_TYPE_ID = 5523 then EAMT.[TEXT] end) as [Description],
max(case when EAMT.ENTITY_ASSOC_TYPE_ID = 5520 then LTRIM(RTRIM(EAMT.[TEXT])) end) as [Case_URL]
from ENTITY_ASSOC_METADATA_TEXT EAMT join
ENTITY_ASSOC_TYPE eat
ON eat.ENTITY_ASSOC_TYPE_ID = eamt.ENTITY_ASSOC_TYPE_ID join
ENTITY_TYPE et
on et.Entity_Type_ID = eamt.Entity_Type_ID
where et.Name like '%Daily Work Status%' an
eam.IS_ACTIVE = 'Y' and
EAMT.IS_ACTIVE = 'Y' and
EAMT.ENTITY_ASSOC_TYPE_ID in (5519, 5523, 5520)
group by eamt.Entity_ID
我不确定这是否会更快,但它会为数据库提供更多优化查询和使用索引的机会。
试试这个 :
select
max(case when EAMT.ENTITY_ASSOC_TYPE_ID = 5519 then EAMT.[TEXT] end) as OnDate
,max(case when EAMT.ENTITY_ASSOC_TYPE_ID =5523 then EAMT.[TEXT] end) as [Description]
,max(case when EAMT.ENTITY_ASSOC_TYPE_ID = 5520 then LTRIM(RTRIM(EAMT.[TEXT])) end) as [Case_URL]
,EAMT.ENTITY_ID
from ENTITY_ASSOC_METADATA_TEXT EAMT with (nolock)
where EAMT.IS_ACTIVE = 'Y' AND
EXISTS( select 1
from ENTITY_ASSOC_TYPE EAT with (nolock)
where EAMT.ENTITY_ASSOC_TYPE_ID = EAT.ENTITY_ASSOC_TYPE_ID AND
EAT.IS_ACTIVE = 'Y' AND
EXISTS(select 1
from ENTITY_TYPE ET with (nolock)
where EAT.Entity_Type_ID = AND ET.Entity_Type_ID
ET.Name like '%Daily Work Status%'))
Group by Entity_ID
做了几个变化之类的
IN
替换了EXISTS
条款首先你需要告诉我,每个表包含多少行?
II)每张桌子之间的关系是什么?
III)查询应该返回多少行?如果它可以返回超过数千,那么为什么你不能使用分页等。
试试这个,
;With CTE as
(
SELECT ENTITY_ASSOC_TYPE_ID
FROM dbo.ENTITY_ASSOC_TYPE A WITH (NOLOCK)
WHERE EXISTS (
SELECT 1
FROM dbo.ENTITY_TYPE B WITH (NOLOCK)
WHERE A.Entity_Type_ID= B.Entity_Type_ID
and B.NAME LIKE '%Daily Work Status%'
)
AND A.IS_ACTIVE = 'Y'
)
-- Test how much time it takes
--select * from CTE
SELECT max(CASE
WHEN EAMT.ENTITY_ASSOC_TYPE_ID = 5519
THEN EAMT.[TEXT]
END) AS OnDate
,max(CASE
WHEN EAMT.ENTITY_ASSOC_TYPE_ID = 5523
THEN EAMT.[TEXT]
END) AS [Description]
,max(CASE
WHEN EAMT.ENTITY_ASSOC_TYPE_ID = 5520
THEN LTRIM(RTRIM(EAMT.[TEXT]))
END) AS [Case_URL]
,EAMT.ENTITY_ID
FROM dbo.ENTITY_ASSOC_METADATA_TEXT EAMT WITH (NOLOCK)
WHERE
Exists(
select 1
from CTE c
where c.ENTITY_ASSOC_TYPE_ID=EAMT.ENTITY_ASSOC_TYPE_ID
)
AND EAMT.IS_ACTIVE = 'Y'
GROUP BY Entity_ID