Fil*_*ara 6 sql t-sql sql-server indexing azure-sql-database
我在Azure SQL数据库中使用v12服务器,我有下表:
CREATE TABLE [dbo].[AudienceNiches](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[WebsiteId] [nvarchar](128) NOT NULL,
[VisitorId] [nvarchar](128) NOT NULL,
[VisitDate] [datetime] NOT NULL,
[Interest] [nvarchar](50) NULL,
[Gender] [float] NULL,
[AgeFrom18To24] [float] NULL,
[AgeFrom25To34] [float] NULL,
[AgeFrom45To54] [float] NULL,
[AgeFrom55To64] [float] NULL,
[AgeFrom65Plus] [float] NULL,
[AgeFrom35To44] [float] NULL,
CONSTRAINT [PK_AudienceNiches] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
我正在执行此查询:(更新查询)
`select a.interest, count(interest) from (
select visitorid, interest
from audienceNiches
WHERE WebsiteId = @websiteid
AND VisitDate >= @startdate
AND VisitDate <= @enddate
group by visitorid, interest) as a
group by a.interest`
Run Code Online (Sandbox Code Playgroud)
我有以下索引(所有ASC):
idx_WebsiteId_VisitDate_VisitorId
idx_WebsiteId_VisitDate
idx_VisitorId
idx_Interest
问题是我的查询返回18K行aproximaly并需要5秒,整个表有8.8M记录,如果我扩展一点数据时间增加了很多,那么,这个查询的最佳索引是什么?我错过了什么?
此查询的最佳索引是这些列上的复合索引,按以下顺序:
这允许从索引中完全回答查询。WebsiteIdSqlServer 可以对 ( , )进行范围扫描VisitDate,然后排除 null Interest,最后对VisitorIds索引中的所有元素进行计数。索引条目将按正确的顺序排列,以允许这些操作有效地进行。