对高级性能调优的建议 - 超越基本索引

时间:2015-02-10 16:57:10

标签: sql-server tsql azure sqlperformance

摘要

我计划使用以下架构在SQL Azure数据库中存储车牌列表:

模式

CREATE TABLE [dbo].[events](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [dateTimeCreated] [datetime] NOT NULL,
    [registration] [varchar](14) NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[events] ADD  CONSTRAINT [DF_events_dateTimeCreated]  DEFAULT (getdate()) FOR [dateTimeCreated]
GO

我只能想到运行以下一个查询: - 在给定的日期/时间范围内搜索注册

到目前为止,我只能想到创建一个非聚集索引agaisnt dateTimeCreated并注册

问题

最终可能会出现数百万行的10个行。 *当行数最终大大增加时,有哪些选项(天蓝色特定与否)可以提高性能? *是否有关于查询性能如何针对给定行数降级的指南?

2 个答案:

答案 0 :(得分:1)

您绝对应该为dateTimeCreated创建群集索引。 registration列也应该被编入索引,但是否应该(以及如何)将其编入索引取决于数据:您的registration是否会对它们有所了解或者它们是否是随机的?

Clustered Indexes背后的关键理念:

  

表中的数据行以排序顺序存储的唯一时间是   当表包含聚集索引时。

这意味着当您对聚类的列进行搜索并且值具有一些可订购的语义(您的dateTimeCreated列)时,您获取正确数据的可能性会显着增加。 (SQL Server不必提取 - 尽可能多的表页来收集必要的数据。)

另外:(MSDN documentation link

  

Microsoft Azure SQL数据库不支持没有群集的表   索引。表必须具有聚簇索引。如果创建了表   如果没有聚簇约束,则必须创建聚簇索引   在表上允许插入操作之前。

答案 1 :(得分:0)

我会将ID设为PK(和聚集索引)

为什么bigint?
int上升到40亿(如果使用负数则为80亿)
不仅光盘空间更少,而且在相同数量的内存中缓存了更多记录。

count(*)将是n阶 两倍的记录需要两倍的时间来计算

对于其他列,如果要对其进行搜索或排序,请创建索引。