Sql 如何减少简单select查询的响应时间?

Sql 如何减少简单select查询的响应时间?,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,MarketPlane表包含超过6000万行 当我需要特定日期的飞机总数时,我执行这个查询需要7分钟以上的时间。我如何减少这个时间 SELECT COUNT(primaryKeyColumn) FROM MarketPlan WHERE LaunchDate > @date 我已经实现了您链接中提到的所有内容,甚至现在我已经用(nolock)实现了,这将响应时间减少到5分钟。您必须在表上,或者可能在日期之前 你可能还想看看 相关表格是否在LaunchDate列上有索引?另外,

MarketPlane
表包含超过6000万行

当我需要特定日期的飞机总数时,我执行这个查询需要7分钟以上的时间。我如何减少这个时间

SELECT COUNT(primaryKeyColumn) 
FROM   MarketPlan 
WHERE  LaunchDate > @date
我已经实现了您链接中提到的所有内容,甚至现在我已经用(nolock)实现了
,这将响应时间减少到5分钟。

您必须在表上,或者可能在日期之前

你可能还想看看


相关表格是否在
LaunchDate
列上有索引?另外,您是否真的想发布
LaunchDate>@date

假设SQL Server基于@date,尽管这同样适用于大多数数据库

如果您的主要查询是选择一系列数据(基于示例),那么添加或更改集群INEDX将大大缩短查询时间

见:

默认情况下,SQLServer将主键创建为聚集索引,这从事务的角度来看非常好,但是如果您的重点是检索数据,那么更改该默认值将产生巨大的差异

CREATE CLUSTERED INDEX name ON MarketPlan (LaunchDate DESC)

注释:假设启动日期是静态日期值,主要是以递增/顺序的顺序插入以最小化索引碎片。

这里有一些好的建议,如果所有其他的都失败了,考虑一个小的非正规化,创建另一个具有累积计数的表,并用触发器更新它。如果您有更多这种性质的查询,请考虑OLAP,您的特定查询不需要日期列上的聚集键。使用带有前导日期列的非聚集索引实际上会运行得更好,因为您不需要在该查询中执行键查找,因此非聚集索引将比聚集索引(它隐式地包括聚集键列)覆盖范围更广、更紧凑。


如果您对它进行了正确的索引,但它仍然没有执行,则很可能是碎片。在这种情况下,请对索引进行碎片整理,然后重试。

创建一个新索引,如下所示:

在MarketPlan上创建索引xLaunchDate(LaunchDate,primaryKeyColumn)

查看这篇关于索引如何提高性能的文章

“其中LaunchDate>@date”

参数@date的值是否在同一批(或交易或上下文)中定义?
如果不是,则如果其值来自当前批之外(例如,存储过程或udf函数的输入参数),则这将导致聚集索引扫描(所有行),而不是聚集索引查找(仅满足WHERE条件的行)。
SQL Server optimizer无法(在编译时)对查询进行完全优化,从而导致完全表扫描,因为参数的值仅在运行时已知

更新:对建议OLAP的答案的评论。
OLAP只是一个概念,SSAS多维数据集只是OLAP实现的可能方式之一。
获取/使用OLAP概念是方便的,而不是义务。
您没有使用SSAS来使用OLAP概念。
参见,例如

更新2:评论中问题的评论:


MDX是SSAS(多维数据集/OLAP)提供的选项/便利性/功能,而不是义务

您可以做的最简单的事情是:

SELECT COUNT(LaunchDate) 
FROM   MarketPlan 
WHERE  LaunchDate > @date
这将保证您只检索任何LaunchDate索引的索引


另外(这取决于您的执行计划),我还看到过>执行表扫描和使用索引的实例(但不是特定于SQL Server)。如果您知道最重要的日期,您可以尝试
LaunchDate在@date和
之间的位置表有多宽?如果表很宽(即(n)char、(n)varchar或xml的许多列),则可能存在大量IO,使用聚集索引会导致查询运行缓慢

要确定IO是否导致查询时间过长,请执行以下操作:

  • 仅在LaunchDate列上创建非聚集索引
  • 运行下面的查询,计算LaunchDate并强制使用新索引

    选择计数(启动日期)

    来自市场计划(索引=新索引名称)

    其中LaunchDate>@date


  • 我不喜欢使用索引提示,我建议使用此提示只是为了证明IO是否导致查询时间过长。

    有两种方法可以做到这一点

  • 首先在date列上创建聚集索引,因为查询是特定于日期范围的,所以所有数据都将按实际顺序排列,这将避免扫描表中的所有记录

  • 您可以尝试使用水平分区,这将影响现有的表设计,但这是最好的方法,请参见此


  • Sql Server 2008和LaunchDate上的群集索引如果您在LaunchDate上已经有了群集索引,您不应该看到7分钟以上的查询时间?您一次检索多少条记录?@OMG-为什么DateTime列上的聚集索引不能提高性能?该查询是一个范围扫描,允许快速范围索引查找,因为所有数据都在连续块中?半相关。。。6000万条记录也进入了这样一个阶段:数据所在磁盘的设置可能会产生相当大的影响。数据库的优化随着其增长而变得越来越复杂。在Sql Server 2008中,launchDate的数据类型是Date。它提供了大量信息,但在我的场景中不起作用,因为我已经实现了链接中提到的所有内容。我不想使用OLAP,因为在它上,我必须编写MDX查询来获取数据,并且每次插入新记录时都要进行查询“我将不得不处理多维数据集。我不想要它。”吉万·巴特,你的陈述都错了。SQL和实时(这是ROLAP模式,请参阅)处理在cube@vg8-是的,ROLAP中有实时处理功能,但你不认为由于这个原因,我将不得不使用MDX吗?@Jeevan Bhatt,多维数据集中的MDX只是一种方便。您可以使用SQL