【发布时间】:2012-02-02 18:49:12
【问题描述】:
我正在运行此报告:
use SalesDWH
go
;with
cte_biggie as(
select (c.npi+'|'+ CAST(DATEPART(yy, [DATE entered]) as varchar) +'|'+
CASE WHEN DATEPART(mm, [DATE entered]) = 01 THEN 'Jan'
WHEN DATEPART(mm, [DATE entered]) = 02 THEN 'Feb'
WHEN DATEPART(mm, [DATE entered]) = 03 THEN 'Mar'
WHEN DATEPART(mm, [DATE entered]) = 04 THEN 'Apr'
WHEN DATEPART(mm, [DATE entered]) = 05 THEN 'May'
WHEN DATEPART(mm, [DATE entered]) = 06 THEN 'Jun'
WHEN DATEPART(mm, [DATE entered]) = 07 THEN 'Jul'
WHEN DATEPART(mm, [DATE entered]) = 08 THEN 'Aug'
WHEN DATEPART(mm, [DATE entered]) = 09 THEN 'Sep'
WHEN DATEPART(mm, [DATE entered]) = 10 THEN 'Oct'
WHEN DATEPART(mm, [DATE entered]) = 11 THEN 'Nov'
WHEN DATEPART(mm, [DATE entered]) = 12 THEN 'Dec'
END
+'|'+isnull(cast(COUNT([specimen id]) as varchar),'') +'|'+isnull([practice name],'')+'|'+isnull(b.[mlis practice id],'')+'|'+a.[practice code]+'|'+[Requesting Physician]+'|'+isnull(c.salesrep,'')+'|'+
isnull(cast(c.dateestablished as varchar),'')+'|'+ ISNULL (c.practiceaddress1,'')+'|'+ISNULL ( c.practiceaddress2 , '' )+'|'+ISNULL (c.practicecity,'')+'|'+ISNULL (c.practicestate,'')+'|'+
ISNULL(b.[Active Inactive],'')) [result]
from quicklabdump a
inner join qlmlismapping b
on (b.[practice code] = a.[practice code])
inner join PracticeandPhysician c
on (a.[Requesting Physician]=c.doctorfirstname+' '+c.DOCTORLASTNAME
and a.[practice code]=c.practicecode)
where DATEPART(yy, [DATE entered]) in (2010,2011)
and DATEPART(mm, [DATE entered]) in (01,02,03,04,05,06,07,08,09,10,11,12)
group by DATEPART(yy, [DATE entered]), DATEPART(mm, [DATE entered]), a.[practice name],b.[mlis practice id],a.[practice code],
a.[Requesting Physician],c.salesrep,c.dateestablished, c.practicecity,c.practicestate,c.npi,c.practiceaddress1 ,c.practiceaddress2,
b.[Active Inactive]
)
select 'NPI|Year Entered|Month Entered|Count|Practice Name|MLIS Code|Practice Code|Physician|Sales Rep|Date Established|Address|Address2|City|State|Status'
union all
select * from cte_biggie
因为我要加入 3 个表,所以我想知道使用索引和聚集索引优化此查询的最佳方法是什么。
我会在哪些列上添加索引?
目前此报告需要 20 秒。数据库大约有 5 个演出。
【问题讨论】:
-
假设您已经有聚集索引,我会确保在您的查询中涉及的所有外键列以及
WHERE子句中使用的Date_Entered列都有一个索引 -
@marc_s 非常感谢。我没有聚集索引,我应该把它们放在哪里?
-
@marc_s 设置聚集索引后,是否需要一段时间才能生效?
-
你应该用
left(datename(m, [DATE entered]), 3)替换那个case语句的月份缩写。 -
@MichaelFredrickson 我只是按照你说的做了,由于某种原因,它返回的记录数量是 4 倍!知道为什么吗?
标签: sql sql-server sql-server-2008 optimization