巨型表上的SQL查询

时间:2015-08-20 13:49:29

标签: sql sql-server query-optimization

我尝试从表中查询以获得具有以下查询的特定日期:

SELECT
[bmUnitId] AS BMUnitID,
[DataType],
[LocalTimeFrom],
[LocalTimeTo],
[LevelTo]

FROM
tibcoRampPosition

WHERE
LocalTimeTo between '".$chosenDate1."' and '".$chosenDate2."'
AND
bmUnitId = '".$chosenBMUnit."'
AND
DataType = 8

ORDER BY
LocalTimeTo asc

我检查了变量,确保它们是我想要的(通过在执行查询之前回显它们)。问题是,它查询数据的表有56,685,678行,是一个5.3 GB的数据库。

执行查询需要> 5分钟。我想知道是否还有我可以改进这个......我希望它的执行时间最长可达10秒。 5分钟对于应用程序来说并不是很好。

1 个答案:

答案 0 :(得分:0)

您需要一个索引,否则每次查询时数据库都必须读取整个表。索引是来自少数列(最常被过滤的列)的数据并且是有序的,因此搜索速度很快。看看你的查询,我认为像这样的索引就足够了:

CREATE CLUSTERED INDEX IX_MyIndex ON dbo.tibcoRampPosition
(
    LocalTimeTo,
    bmUnitId,
    DataType
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

我首先放置了LocalTimeTo列,因为您按范围查询它。其他两个的顺序无关紧要(至少在此查询中)。

See more info in this answer

如果之前没有索引,那么查询很可能会在5秒内返回。数据库是唯一可以通过3行代码提高性能的平台。