查询sql server中用于更新日常工作状态的视图的优化

问题描述 投票:0回答:3

我需要优化这个查询,但我不知道如何。

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秒。请帮忙。

sql sql-server
3个回答
1
投票

我首先将其写为连接:

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  

我不确定这是否会更快,但它会为数据库提供更多优化查询和使用索引的机会。


0
投票

试试这个 :

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条款
  • 改变了相同条件的顺序

0
投票

首先你需要告诉我,每个表包含多少行?

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
© www.soinside.com 2019 - 2024. All rights reserved.