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

SQL Server在大表上按日期筛选的时间太长

  •  0
  • Itay.B  · 技术社区  · 4 年前

    我有一张有3亿行的表。其中一列的类型为 date 当我选择两个日期内的行时,这需要很长时间。大约3分钟。这个 日期 字段被索引,我在一台功能强大、规格很高的机器上使用SQL Server 2012。

    我能做些什么来让它快得多吗?

    这是查询:

    Select flightID, FlightDirection, DestinationID, FlightDuration
    from T_Flights (nolock)
    where FlightDate between @fromDate And @toDate
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Hadi Ardebili    4 年前

    执行计划中的扫描不好。 这应该是寻求。 尝试将select语句中的列添加到索引中并运行查询。 如果它仍然不起作用,你可以做的另一件事是使用数据库引擎优化顾问,看看它是否能给你任何建议。在Contoso中选择查询,右键单击并选择“在数据库引擎优化顾问中分析查询”。

        2
  •  0
  •   Venkataraman R    4 年前

    从你的讨论中,我了解到你在日期栏上没有适当的索引。您提到正在扫描索引。由于您没有提供有关扫描哪个索引的足够详细信息,我建议您创建包含索引以适应您的查询。

    现在,您的查询可以通过以下非聚集索引本身来满足。但是,添加索引会带来额外的维护开销。因此,只有在工作负载需要时才添加索引。

    -- Assuming FlightID is primary key. primary key is included by default and no need 
    --to add it separately. If FlightID is not primary key, add that to the list 
    -- of included columns
    
    CREATE NONCLUSTERED INDEX NCI_FlightDate ON  dbo.T_Flights(FlightDate) 
    INCLUDE (FlightDirection, DestinationID, FlightDuration) 
    
    
        3
  •  0
  •   Gordon Linoff    4 年前

    如果你有3亿行,那么在 (flightdate) 可以 帮助-但取决于每天有多少航班和多少天。您可以在索引中包含其他列,这应该会有更多帮助。

    然而,对于你想做的事情,听起来更好的解决方案是 partition 桌子。这将把每天的数据存储在一个单独的“文件”中,并且对于给定的查询,只会读取查询所需的数据。

    缺点是这需要重新创建表。然而,你可能会发现这是一个大胜利的表现,所以值得付出努力。

        4
  •  -1
  •   Sagar Vaja    4 年前

    您需要使用数据库引擎优化顾问来优化查询执行