代码之家  ›  专栏  ›  技术社区  ›  Amy B

根据日期范围查询条件的性能

  •  2
  • Amy B  · 技术社区  · 14 年前

    CREATE TABLE Meetings
    (
      ID int PRIMRY KEY IDENTITY(1,1)
      StartDate DateTime NOT NULL,
      EndDate DateTime NULL,
      Field1 varchar(50),
      Field2 varchar(50),
      Field3 varchar(50),
      Field4 varchar(50)
    )
    

    这里有一个问题:

    DECLARE @ApplicableDate DateTime
    
    SELECT ID, StartDate, EndDate, Field1, Field2, Field3, Field4
    FROM Meetings
    WHERE StartDate <= @ApplicableDate AND
      (EndDate is null || @ApplicableDate <= EndDate)
    

    查询以一种简单的方式表示我想要的行,但是性能非常差。不管我添加了什么索引,它都会执行聚集索引扫描。我试过:

    • 起始日期
    • 开始日期,结束日期

    如何提高此查询的性能?


    this question this one

    2 回复  |  直到 7 年前
        1
  •  2
  •   Frank    14 年前

    如果查询返回20%-50%的记录,那么多次扫描是最佳选择。如果有索引,则必须始终在索引中查找数据,然后索引在表中包含一个记录地址,然后必须从磁盘获取包含此记录的页,这样就有可能索引中的相邻记录分布在整个磁盘上。

    • 是网络带宽吗?
    • 内存/缓存是否受限?
        2
  •  3
  •   bobs    14 年前

    我假设您在SQL Server上查看我的语法。

    将ID上的主键设为非聚集索引。

    ID int PRIMARY KEY NONCLUSTERED IDENTITY(1,1),
    

    CREATE CLUSTERED INDEX ix_Meetings_StartDate
    ON Meetings (StartDate)