日期关联优化不会更改计划

我有以下表格的报告要求。 我使用这些表创建了一个新数据库,并从实时数据库导入数据以用于报告目的。

报告参数是一个日期范围。 我阅读以下内容,发现可以使用DATE_CORRELATION_OPTIMIZATION通过使用seek而不是scan来使查询更快地工作。 我做了所需的设置 - 仍然查询使用相同的旧计划和相同的执行时间。 需要进行哪些其他更改才能使查询使用日期关联?

注意:我正在使用SQL Server 2005

参考

  • 优化访问相关日期时间列的查询
  • 查询优化器:日期关联优化
  • SQL

    --Database change made for date correlation
    ALTER DATABASE BISourcingTest
       SET DATE_CORRELATION_OPTIMIZATION ON;
    GO
    
    --Settings made
    SET ANSI_NULLS ON
    SET ANSI_PADDING ON
    SET ANSI_WARNINGS ON
    SET ARITHABORT ON
    SET CONCAT_NULL_YIELDS_NULL ON
    SET QUOTED_IDENTIFIER ON
    SET NUMERIC_ROUNDABORT OFF
    GO
    
    --Test Setting
    IF (  (sessionproperty('ANSI_NULLS') = 1) AND
          (sessionproperty('ANSI_PADDING') = 1) AND 
          (sessionproperty('ANSI_WARNINGS') = 1) AND 
          (sessionproperty('ARITHABORT') = 1) AND 
          (sessionproperty('CONCAT_NULL_YIELDS_NULL') = 1) AND 
          (sessionproperty('QUOTED_IDENTIFIER') = 1) AND 
          (sessionproperty('NUMERIC_ROUNDABORT') = 0)  
        )
       PRINT 'Everything is set'
    ELSE
       PRINT 'Different Setting'
    
    --Query
    SELECT C.ContainerID, C.CreatedOnDate,OLIC.OrderID
    FROM ContainersTest C
    INNER JOIN OrderLineItemContainers OLIC
        ON OLIC.ContainerID = C.ContainerID
    WHERE C.CreatedOnDate > '1/1/2015'
    AND C.CreatedOnDate < '2/01/2015'
    

    TABLES

    CREATE TABLE [dbo].[ContainersTest](
        [ContainerID] [varchar](20) NOT NULL,
        [Weight] [decimal](9, 2) NOT NULL DEFAULT ((0)),
        [CreatedOnDate] [datetime] NOT NULL DEFAULT (getdate()),
     CONSTRAINT [XPKContainersTest] PRIMARY KEY CLUSTERED 
    (
        [CreatedOnDate] ASC,
        [ContainerID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    CREATE TABLE [dbo].[OrderLineItemContainers](
        [OrderID] [int] NOT NULL,
        [LineItemID] [int] NOT NULL,
        [ContainerID] [varchar](20) NOT NULL,
        [CreatedOnDate] [datetime] NOT NULL DEFAULT (getdate()),
     CONSTRAINT [PK_POLineItemContainers] PRIMARY KEY CLUSTERED 
    (
        [OrderID] ASC,
        [LineItemID] ASC,
        [ContainerID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
     CONSTRAINT [IX_OrderLineItemContainers] UNIQUE NONCLUSTERED 
    (
        [ContainerID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    SET ANSI_PADDING OFF
    GO
    ALTER TABLE [dbo].[OrderLineItemContainers]  WITH CHECK ADD  CONSTRAINT [FK_POLineItemContainers_Containers] FOREIGN KEY([ContainerID])
    REFERENCES [dbo].[Containers] ([ContainerID])
    GO
    ALTER TABLE [dbo].[OrderLineItemContainers] CHECK CONSTRAINT [FK_POLineItemContainers_Containers]
    

    计划 在这里输入图像描述

    -


    根据文档:https://technet.microsoft.com/en-us/library/ms177416(v=sql.105).aspx

    如果维护相关统计信息的任何一个日期时间列不是聚簇索引的第一个或唯一键,请考虑在其上创建聚簇索引。 这样做通常可以提高关联统计信息所涵盖的查询类型的性能。 如果主键列上已经存在聚簇索引,则可以修改表,以便聚簇索引和主键使用不同的列集。

    由于您的OrderLineItemContainers表没有合适的索引来过滤日期,因此它无法执行任何操作。 尝试在OrderLineItemContainers.CreatedOnDate上添加一个非聚集索引来查看它是否会切换计划。

    最好是将它集群化,但还有其他一些考虑因素...请注意,如果这是主要查询,那么可以使主键成为非聚簇,并使用聚簇作为新日期索引,这使得它值得。

    所以这是最佳的:

    CREATE TABLE [dbo].[OrderLineItemContainers](
          [OrderID] [int] NOT NULL,
          [LineItemID] [int] NOT NULL,
          [ContainerID] [varchar](20) NOT NULL,
          [CreatedOnDate] [datetime] NOT NULL DEFAULT (getdate()),
       CONSTRAINT [PK_POLineItemContainers] PRIMARY KEY NONCLUSTERED -- NONCLUSTERED PRIMARY KEY!!
            (
                [OrderID] ASC,
                [LineItemID] ASC,
                [ContainerID] ASC
            )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
             CONSTRAINT [IX_OrderLineItemContainers] UNIQUE NONCLUSTERED 
            (
                [ContainerID] ASC
            )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
            ) ON [PRIMARY]
    
    CREATE CLUSTERED INDEX ON OrderLineItemContainers(CreatedOnDate)
    

    或者你可以尝试一个新的NONCLUSTERED索引:

    CREATE NONCLUSTERED INDEX ON OrderLineItemContainers(CreatedOnDate)
    
    链接地址: http://www.djcxy.com/p/90475.html

    上一篇: Optimization for Date Correlation doesn’t change plan

    下一篇: Get JSON elements from a web with Apache Flink