sql server中的索引/聚集索引结构

sql server中的索引/聚集索引结构,sql,sql-server,sql-server-2008,optimization,Sql,Sql Server,Sql Server 2008,Optimization,我正在运行此报告: 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' WHE

我正在运行此报告:

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子句-目前,它不是可搜索的,这意味着即使输入的日期列上有索引,也不会使用它,因为您正在对其使用DATEPART函数

相反,要:

WHERE [Date Entered] >= '20100101' AND [Date Entered] < '20120101'
其中[输入日期]>='20100101'和[输入日期]<'20120101'
这将是我要更改的第一件事,并确保在输入的日期上有一个索引。作为聚集索引,这可能是一个很好的竞争者,尽管如果不了解更多关于数据访问/加载模式等的信息,为整个环境选择最佳索引策略是很困难的


其他需要检查的初始事项是在联接中涉及的其他表中的字段上建立索引。

假设您已经有聚集索引,我只需确保在查询中涉及的所有外键列上都有索引,以及在
WHERE
clause@marc_s非常感谢。我没有聚集索引,我应该把它们放在哪里?@marc_s设置聚集索引后,是否需要一段时间才能生效?您应该将月份缩写的case语句替换为
left(datename(m,[输入日期]、3)
@MichaelFredrickson我只是照你说的做了,出于某种原因,它返回的记录数量是原来的4倍!!知道为什么吗?@adathdev,我完全照你说的做了,查询用了34秒而不是20秒!我做错了什么?设置聚集索引后,需要一段时间才能生效吗?@l\uuuu-性能调整可能是一个问题这是一门黑暗的艺术,通常是一个迭代/调查的过程。因此,如果没有更多的信息,很难回答问题!您是将其创建为聚集索引还是非聚集索引?您能否查看执行计划并查看大部分时间都花在了哪里?此外,只需运行查询几次,以确保其一致性更高。瓶颈在这里[SalesDWH].[dbo].[QuickLabDump]。输入日期[SalesDWH].[dbo].[QuickLabDump]。机构名称[SalesDWH].[dbo].[QuickLabDump]。机构代码[SalesDWH].[dbo].[QuickLabDump]。请求物理学家聚集索引是否需要一段时间才能生效