【问题标题】:index/clustered-index structuring in sql serversql server 中的索引/聚集索引结构
【发布时间】: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


【解决方案1】:

我要做的第一件事是更改 WHERE 子句 - 目前,它不是 sargable,这意味着即使在 Date Entered 列上有索引,它也不会被使用,因为您正在使用 DATEPART 函数它。

改为:

WHERE [Date Entered] >= '20100101' AND [Date Entered] < '20120101'

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

首先要检查的其他事项是在连接中涉及的其他表中的字段上设置索引。

【讨论】:

  • @adathdev,我完全按照你说的做了,查询花费了 34 秒而不是 20 秒!我做错了什么?
  • 设置聚集索引后,是否需要一段时间才能生效?
  • @l__ - 性能调优可能是一门黑暗的艺术,通常是一个迭代/调查过程。因此,如果没有更多信息,很难回答!您将它创建为聚集索引还是非聚集索引?你能看看执行计划,看看大部分时间都花在了哪里吗?此外,只需运行几次查询,以确保它始终更高。
  • 瓶颈在这里 [SalesDWH].[dbo].[QuickLabDump].Date Entered, [SalesDWH].[dbo].[QuickLabDump].Practice Name, [SalesDWH].[dbo]。 [QuickLabDump].实践代码,[SalesDWH].[dbo].[QuickLabDump].Requesting Physician
  • 聚集索引是否需要一段时间才能生效
猜你喜欢
  • 2018-05-08
  • 1970-01-01
  • 2014-12-21
  • 2012-10-01
  • 2011-11-30
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多