SQL Server 2008索引多个列,其中一些并非一直使用
我有一张有列的桌子SQL Server 2008索引多个列,其中一些并非一直使用,sql,sql-server,performance,sql-server-2008,indexing,Sql,Sql Server,Performance,Sql Server 2008,Indexing,我有一张有列的桌子 ParameterValueId, SiteId, LocationId, ParameterId, SampleDateTime 和其他一些专栏 ParameterValueId是主键 我想创建一个索引,它不是唯一的,可以加速对SiteId、LocationId、ParameterId、SampleDateTime的查询 我的所有查询都将使用SiteId 75%的查询将使用SiteId和LocationId 50%的查询将使用SiteId、LocationId和Para
ParameterValueId, SiteId, LocationId, ParameterId, SampleDateTime
和其他一些专栏
ParameterValueId
是主键
我想创建一个索引,它不是唯一的,可以加速对SiteId、LocationId、ParameterId、SampleDateTime
的查询
- 我的所有查询都将使用
SiteId
- 75%的查询将使用
和SiteId
LocationId
- 50%的查询将使用
、SiteId
和LocationId
ParameterId
- 25%的查询将使用
,SiteId
,LocationId
,以及过滤器parametrid
=/作为一般经验法则,考虑到您所描述的场景,在所有四列上建立一个索引可能是一个很好的起点。但是,根据数据的性质和形状,您可能还需要做其他事情来提高性能(例如,SiteID的差异有多大?它是否唯一?单个值是否占该列值的20%以上?)
简短回答:将使用一个覆盖索引,即使在查询中没有使用所有覆盖列。作为一般经验法则,考虑到您描述的场景,在所有四列上使用一个索引可能是一个很好的起点。但是,根据数据的性质和形状,您可能还需要做其他事情来提高性能(例如,SiteID的差异有多大?它是否唯一?单个值是否占该列值的20%以上?)
简短回答:将使用一个覆盖索引,即使查询中未使用所有覆盖列。我同意。我只能补充一点:测量。在应用任何索引之前,请使用
捕获查询实际花费的时间。同时捕获查询计划并保存它。然后你有一个基线。然后用新索引重复。现在你确切地知道你已经取得了多大的进步。同样,在业绩下降的六个月后,你也可以用一些东西来衡量。SitedId指的是客户公司所在地(可能是1英里的雷达)。SiteId将随着更多客户端的添加而增长。假设我们有5个站点,分离率应该是20%。LocationId是SiteId指定范围内的特定lat、lon。索引中的每一列在使用查询时都会减少一个已知的分数。主要问题是,当我创建一个包含四列的索引时,1、2、3列的查询是否仍然使用仍然使用的索引?我还建议,如果大部分时间都以这种方式查询表,那么应该将其作为聚集索引。如果它不是您的聚集索引,并且您正在从表中选择其他列(我想多于计数(*),那么您可能希望在索引中使用INCLUDE子句来引入这些其他列,以避免书签查找和您的问题“当我创建一个包含四列的索引时,1,2,3列的查询是否仍会使用该索引?“-是的:)我同意。我只能补充一点:测量。在应用任何索引之前,请使用SET STATISTICS TIME
捕获查询实际花费的时间。同时捕获查询计划并保存它。然后你有一个基线。然后用新索引重复。现在你确切地知道你已经取得了多大的进步。同样,在业绩下降的六个月后,你也可以用一些东西来衡量。SitedId指的是客户公司所在地(可能是1英里的雷达)。SiteId将随着更多客户端的添加而增长。假设我们有5个站点,分离率应该是20%。LocationId是SiteId指定范围内的特定lat、lon。索引中的每一列在使用查询时都会减少一个已知的分数。主要问题是,当我创建一个包含四列的索引时,1、2、3列的查询是否仍然使用仍然使用的索引?我还建议,如果大部分时间都以这种方式查询表,那么应该将其作为聚集索引。如果它不是您的聚集索引,并且您正在从表中选择其他列(我想多于计数(*),那么您可能希望在索引中使用INCLUDE子句来引入这些其他列,以避免书签查找和您的问题“当我创建一个包含四列的索引时,一个包含1,2,3列的查询是否仍然使用仍然使用的索引?”-是:)“如果我创建一个包含4列的索引,如果我只使用其中的1,2或3列,而不是全部4列,它会被使用并仍然提高性能吗?”?--是。(请确保您的覆盖索引也符合您的场景(SiteId、LocationId、ParameterId、SampleDateTime)的相应顺序。不要考虑在此处为每列创建索引,这在您的情况下根本不是一个好的做法。)如果我创建了一个索引4列,那么如果我只使用其中的1、2或3列,它会被使用吗?不是全部4列吗?--是的。(并且确保覆盖索引的顺序也与您的场景(SiteId、LocationId、ParameterId、SampleDateTime)相适应).不要考虑在这里为每一列创建索引,这在您的情况下根本不是一个好的做法。SET STATISTICS TIME