Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008索引多个列,其中一些并非一直使用_Sql_Sql Server_Performance_Sql Server 2008_Indexing - Fatal编程技术网

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%以上?)


    简短回答:将使用一个覆盖索引,即使查询中未使用所有覆盖列。

    我同意。我只能补充一点:测量。在应用任何索引之前,请使用
    SET STATISTICS TIME
    捕获查询实际花费的时间。同时捕获查询计划并保存它。然后你有一个基线。然后用新索引重复。现在你确切地知道你已经取得了多大的进步。同样,在业绩下降的六个月后,你也可以用一些东西来衡量。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)相适应).不要考虑在这里为每一列创建索引,这在您的情况下根本不是一个好的做法。