我尝试从表中查询以获得具有以下查询的特定日期:
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分钟对于应用程序来说并不是很好。
答案 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
列,因为您按范围查询它。其他两个的顺序无关紧要(至少在此查询中)。
如果之前没有索引,那么查询很可能会在5秒内返回。数据库是唯一可以通过3行代码提高性能的平台。