1

我现在有 200 万条记录的表,它将每天增加 05 万条记录,所以我想优化这个查询

Select * from Forex where Id in 
(SELECT MAX(Id) FROM Forex GROUP BY Symbol having Symbol in 
(Select Distinct Symbol from Forex) )

我创建了 NONCLUSTERED INDEX,所以这个查询所用的时间是 673 毫秒。我已将查询修改为

Select * from Forex where Id in 
(SELECT MAX(Id) FROM Forex GROUP BY Symbol having  Symbol in 
('AUDCAD','AUDCHF','AUDJPY','AUDNZD','AUDUSD','CADCHF','CHFJPY', 
'EURAUD','EURCAD','EURCHF','EURGBP','EURJPY','EURNOK','EURNZD', 
'EURUSD','GBPCAD','GBPCHF','GBPJPY','GBPUSD','NZDJPY','NZDUSD', 
'USDCAD','USDCHF','USDJPY','USDNOK','USDSEK'))

现在花费的时间是 391 毫秒

是否有可能使少于 100 毫秒?或有人帮助优化此查询

4

2 回答 2

1

由于您只有 26 个符号和一百万行,因此 26 索引搜索可能会更好(假设索引为Symbol ASC, Id DESC

DECLARE @Id     INT,
        @Symbol VARCHAR(10)

DECLARE @Results TABLE(
  Id     INT,
  Symbol VARCHAR(10))

SELECT TOP 1 @Id = Id,
             @Symbol = Symbol
FROM   Forex
ORDER  BY Symbol ASC,
          Id DESC

WHILE @@ROWCOUNT = 1
  BEGIN
      INSERT INTO @Results
      VALUES      (@Id,
                   @Symbol)

      SELECT TOP 1 @Id = Id,
                   @Symbol = Symbol
      FROM   Forex
      WHERE  Symbol > @Symbol
      ORDER  BY Symbol ASC,
                Id DESC
  END

SELECT *
FROM   @Results 
于 2013-07-09T13:17:23.090 回答
0

您应该能够摆脱该HAVING子句:

Select * from Forex where Id in 
(SELECT MAX(Id) FROM Forex GROUP BY Symbol)

你也可以试试这个版本:

SELECT * FROM Forex F
WHERE Id =
(SELECT MAX(Id) FROM Forex WHERE Symbol = F.Symbol)

虽然我不希望它有很大的不同。

一些广泛的笔触(有些可能有效,有些可能无效):

  1. Id确保您在和上有索引Symbol, Id DESC。如果索引 onId可以是 CLUSTERED 它也会有所帮助。
  2. 如果不需要,不要返回所有列。
  3. Symbol通过移动到另一个较小的表来对表进行非规范化
  4. 添加内存
  5. 添加 CPU
  6. 使用更快的硬盘
于 2013-07-09T13:09:22.357 回答