【问题标题】:View doesn't perform, but running the same query directly does查看不执行,但直接运行相同的查询
【发布时间】:2020-01-08 13:30:57
【问题描述】:

对于 PowerBI 使用情况,我们可以查看我们最大的表格。但是,它不会运行,会因 PAGEIOLATCH_SH 而超时。查询很简单:

select * from view where ProgramId = 'ParticularProgram'

但是,如果我们在视图中运行查询,它不会出现任何问题或超时。你知道是什么原因造成的吗?视图中的原始查询是:

select column 1, column 2 etc from table where ProgramId = 'ParticularProgram'

为分区指定 where 子句不会改变行为并使其保持缓慢。当两者一起运行时,第一个的查询成本为 99%。 ProgramId 在表中进行了分区,并且此特定程序是该分区的一部分。

在此先感谢

请为正在运行的查询找到附加的实际查询计划: DirectQueryOnTable,XML DirextQueryExecutionPlanXML 和对应的ddl:

/****** Object:  Table [dm].[AggProgramPeriodLoyalty]    Script Date: 1/8/2020 3:47:03 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dm].[AggProgramPeriodLoyalty](
    [AggProgramPeriodLoyaltyKey] [int] IDENTITY(1,1) NOT NULL,
    [ProgramId] [nvarchar](100) NOT NULL,
    [ProgramTitle] [nvarchar](255) NOT NULL,
    [ProgramCurrency] [nvarchar](3) NULL,
    [ProgramPeriodType] [nvarchar](50) NOT NULL,
    [ProgramPeriodTypeLabel] [nvarchar](50) NULL,
    [IsCurrentProgramPeriod] [tinyint] NOT NULL,
    [IsLastCompletedProgramPeriod] [tinyint] NOT NULL,
    [LoyaltyId] [nvarchar](100) NOT NULL,
    [IsRegistered] [int] NOT NULL,
    [IsRegisteredCml] [int] NOT NULL,
    [UsedPlatforms] [nvarchar](100) NULL,
    [DigitalStampsBalanceMutation] [int] NOT NULL,
    [DigitalStampsBalance] [int] NOT NULL,
    [DigitalRedeemPotential] [int] NOT NULL,
    [DigitalParticipationBonusInteractions] [int] NOT NULL,
    [DigitalParticipationBonusInteractionsCml] [int] NOT NULL,
    [DigitalParticipationBonusStamps] [int] NOT NULL,
    [DigitalParticipationBonusStampsCml] [int] NOT NULL,
    [DigitalCollectInteractions] [int] NOT NULL,
    [DigitalCollectInteractionsCml] [int] NOT NULL,
    [IsNewDigitalCollector] [int] NOT NULL,
    [IsDigitalCollector] [int] NOT NULL,
    [IsDigitalCollectorCml] [int] NOT NULL,
    [DigitalCollectedStamps] [int] NOT NULL,
    [DigitalCollectedStampsCml] [int] NOT NULL,
    [TurnoverByDigitalCollectors] [decimal](18, 5) NOT NULL,
    [TurnoverByDigitalCollectorsCml] [decimal](18, 5) NOT NULL,
    [DigitalRedeemInteractions] [int] NOT NULL,
    [DigitalRedeemInteractionsCml] [int] NOT NULL,
    [IsNewDigitalRedeemer] [int] NOT NULL,
    [IsDigitalRedeemer] [int] NOT NULL,
    [IsDigitalRedeemerCml] [int] NOT NULL,
    [DigitalRedeemedStamps] [int] NOT NULL,
    [DigitalRedeemedStampsCml] [int] NOT NULL,
    [DigitalRewards] [int] NOT NULL,
    [DigitalRewardsCml] [int] NOT NULL,
    [TurnoverByDigitalRedeemers] [decimal](18, 5) NOT NULL,
    [TurnoverByDigitalRedeemersCml] [decimal](18, 5) NOT NULL,
    [AdditionalPaymentForDigitalRewards] [decimal](18, 5) NOT NULL,
    [AdditionalPaymentForDigitalRewardsCml] [decimal](18, 5) NOT NULL,
    [DigitalCounterRedeemInteractions] [int] NOT NULL,
    [DigitalCounterRedeemInteractionsCml] [int] NOT NULL,
    [DigitalConvertInteractions] [int] NOT NULL,
    [DigitalConvertInteractionsCml] [int] NOT NULL,
    [DigitalConvertedStamps] [int] NOT NULL,
    [DigitalConvertedStampsCml] [int] NOT NULL,
    [DigitalAddInteractions] [int] NOT NULL,
    [DigitalAddInteractionsCml] [int] NOT NULL,
    [DigitalAddedStamps] [int] NOT NULL,
    [DigitalAddedStampsCml] [int] NOT NULL,
    [DigitalDeductInteractions] [int] NOT NULL,
    [DigitalDeductInteractionsCml] [int] NOT NULL,
    [DigitalDeductedStamps] [int] NOT NULL,
    [DigitalDeductedStampsCml] [int] NOT NULL,
    [DigitalTransferToInteractions] [int] NOT NULL,
    [DigitalTransferToInteractionsCml] [int] NOT NULL,
    [DigitalTransferedToStamps] [int] NOT NULL,
    [DigitalTransferedToStampsCml] [int] NOT NULL,
    [DigitalTransferFromInteractions] [int] NOT NULL,
    [DigitalTransferFromInteractionsCml] [int] NOT NULL,
    [DigitalTransferedFromStamps] [int] NOT NULL,
    [DigitalTransferedFromStampsCml] [int] NOT NULL,
    [DigitalGiftCreatedInteractions] [int] NOT NULL,
    [DigitalGiftCreatedInteractionsCml] [int] NOT NULL,
    [DigitalGiftCreatedStamps] [int] NOT NULL,
    [DigitalGiftCreatedStampsCml] [int] NOT NULL,
    [DigitalGiftRedeemedInteractions] [int] NOT NULL,
    [DigitalGiftRedeemedInteractionsCml] [int] NOT NULL,
    [DigitalGiftRedeemedStamps] [int] NOT NULL,
    [DigitalGiftRedeemedStampsCml] [int] NOT NULL,
    [DigitalGiftExpiredInteractions] [int] NOT NULL,
    [DigitalGiftExpiredInteractionsCml] [int] NOT NULL,
    [DigitalGiftExpiredStamps] [int] NOT NULL,
    [DigitalGiftExpiredStampsCml] [int] NOT NULL,
    [DigitalGiftCancelledInteractions] [int] NOT NULL,
    [DigitalGiftCancelledInteractionsCml] [int] NOT NULL,
    [DigitalGiftCancelledStamps] [int] NOT NULL,
    [DigitalGiftCancelledStampsCml] [int] NOT NULL,
    [CreateDTS] [datetime2](3) NOT NULL,
    [CreateExnId] [int] NOT NULL,
    [UpdateDTS] [datetime2](3) NULL,
    [UpdateExnId] [int] NULL,
    [IsProfileCompleted] [int] NULL,
    [IsProfileCompletedCml] [int] NULL,
    [DigitalRedeemBonusInteractions] [int] NULL,
    [DigitalRedeemBonusInteractionsCml] [int] NULL,
    [DigitalRedeemBonusStamps] [int] NULL,
    [DigitalRedeemBonusStampsCml] [int] NULL,
    [DigitalCounterCollectInteractions] [int] NULL,
    [DigitalCounterCollectInteractionsCml] [int] NULL,
    [DigitalCounterRedeemBonusInteractions] [int] NULL,
    [DigitalCounterRedeemBonusInteractionsCml] [int] NULL,
    [ProgramWeekCombination] [nvarchar](100) NULL,
    [TotalUsedPlatforms] [nvarchar](100) NULL,
 CONSTRAINT [PK_AggProgramPeriodLoyalty] PRIMARY KEY CLUSTERED 
(
    [AggProgramPeriodLoyaltyKey] ASC,
    [ProgramId] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PS_ByProgramId]([ProgramId]),
 CONSTRAINT [UK_AggProgramPeriodLoyalty] UNIQUE NONCLUSTERED 
(
    [ProgramId] ASC,
    [ProgramPeriodType] ASC,
    [LoyaltyId] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PS_ByProgramId]([ProgramId])
) ON [PS_ByProgramId]([ProgramId])
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftCreatedInteractions]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftCreatedInteractionsCml]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftCreatedStamps]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftCreatedStampsCml]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftRedeemedInteractions]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftRedeemedInteractionsCml]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftRedeemedStamps]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftRedeemedStampsCml]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftExpiredInteractions]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftExpiredInteractionsCml]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftExpiredStamps]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftExpiredStampsCml]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftCancelledInteractions]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftCancelledInteractionsCml]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftCancelledStamps]
GO

ALTER TABLE [dm].[AggProgramPeriodLoyalty] ADD  DEFAULT ((0)) FOR [DigitalGiftCancelledStampsCml]
GO

以及视图上的 select 语句的估计查询计划,根本没有执行:QueryOnView,XML ViewExecutionPlanXML

还有视图 DDL:

CREATE view [dm].[vwAggProgramPeriodLoyalty]
as
select [AggProgramPeriodLoyaltyKey] as [Agg Program Period Loyalty Key]
     , upper([ProgramId]) as [Program Id]
     , [ProgramTitle] as [Program Title]
     , [ProgramCurrency] as [Program Currency]
     , [ProgramPeriodType] as [Program Period Type]
     , [ProgramPeriodTypeLabel] as [Program Period Type Label]
     , upper([ProgramWeekCombination]) as [Program Week Combination] 
     , [IsCurrentProgramPeriod] as [Is Current Program Period]
     , [IsLastCompletedProgramPeriod] as [Is Last Completed Program Period]
     , [LoyaltyId] as [Loyalty Id]
     , [IsRegistered] as [Is Registered]
     , [IsRegisteredCml] as [Is Registered Cumulative]
     , [UsedPlatforms] as [Used Platforms]
     , [DigitalStampsBalanceMutation] as [Digital Stamps Balance Mutation]
     , [DigitalStampsBalance] as [Digital Stamps Balance]
     , [DigitalRedeemPotential] as [Digital Redeem Potential]
     , [DigitalParticipationBonusInteractions] as [Digital Participation Bonus Interactions]
     , [DigitalParticipationBonusInteractionsCml] as [Digital Participation Bonus Interactions Cumulative]
     , [DigitalParticipationBonusStamps] as [Digital Participation Bonus Stamps]
     , [DigitalParticipationBonusStampsCml] as [Digital Participation Bonus Stamps Cumulative]
     , [DigitalCollectInteractions] as [Digital Collect Interactions]
     , [DigitalCollectInteractionsCml] as [Digital Collect Interactions Cumulative]
     , [IsNewDigitalCollector] as [Is First Digital Collect]
     , [IsDigitalCollector] as [Is Digital Collector]
     , [IsDigitalCollectorCml] as [Is Digital Collector Cumulative]
     , [DigitalCollectedStamps] as [Digital Collected Stamps]
     , [DigitalCollectedStampsCml] as [Digital Collected Stamps Cumulative]
     , [TurnoverByDigitalCollectors] as [Turnover By Digital Collectors]
     , [TurnoverByDigitalCollectorsCml] as [Turnover By Digital Collectors Cumulative]
     , [DigitalRedeemInteractions] as [Digital Redeem Interactions]
     , [DigitalRedeemInteractionsCml] as [Digital Redeem Interactions Cumulative]
     , [IsNewDigitalRedeemer] as [Is First Digital Redeem]
     , [IsDigitalRedeemer] as [Is Digital Redeemer]
     , [IsDigitalRedeemerCml] as [Is Digital Redeemer Cumulative]
     , [DigitalRedeemedStamps] as [Digital Redeemed Stamps]
     , [DigitalRedeemedStampsCml] as [Digital Redeemed Stamps Cumulative]
     , [DigitalRewards] as [Digital Rewards]
     , [DigitalRewardsCml] as [Digital Rewards Cumulative]
     , [TurnoverByDigitalRedeemers] as [Turnover By Digital Redeemers]
     , [TurnoverByDigitalRedeemersCml] as [Turnover By Digital Redeemers Cumulative]
     , [AdditionalPaymentForDigitalRewards] as [Additional Payment For Digital Rewards]
     , [AdditionalPaymentForDigitalRewardsCml] as [Additional Payment For Digital Rewards Cumulative]
     , [DigitalConvertInteractions] as [Digital Convert Interactions]
     , [DigitalConvertInteractionsCml] as [Digital Convert Interactions Cumulative]
     , [DigitalConvertedStamps] as [Digital Converted Stamps]
     , [DigitalConvertedStampsCml] as [Digital Converted Stamps Cumulative]
     , [DigitalAddInteractions] as [Digital Add Interactions]
     , [DigitalAddInteractionsCml] as [Digital Add Interactions Cumulative]
     , [DigitalAddedStamps] as [Digital Added Stamps]
     , [DigitalAddedStampsCml] as [Digital Added Stamps Cumulative]
     , [DigitalDeductInteractions] as [Digital Deduct Interactions]
     , [DigitalDeductInteractionsCml] as [Digital Deduct Interactions Cumulative]
     , [DigitalDeductedStamps] as [Digital Deducted Stamps]
     , [DigitalDeductedStampsCml] as [Digital Deducted Stamps Cumulative]
     , [DigitalTransferToInteractions] as [Digital Transfer To Interactions]
     , [DigitalTransferToInteractionsCml] as [Digital Transfer To Interactions Cumulative]
     , [DigitalTransferedToStamps] as [Digital Transfered To Stamps]
     , [DigitalTransferedToStampsCml] as [Digital Transfered To Stamps Cumulative]
     , [DigitalTransferFromInteractions] as [Digital Transfer From Interactions]
     , [DigitalTransferFromInteractionsCml] as [Digital Transfer From Interactions Cumulative]
     , [DigitalTransferedFromStamps] as [Digital Transfered From Stamps]
     , [DigitalTransferedFromStampsCml] as [Digital Transfered From Stamps Cumulative]
     , [DigitalGiftCreatedInteractions] as [Digital Gift Created Interactions]            
     , [DigitalGiftCreatedInteractionsCml] as [Digital Gift Created Interactions Cumulative]    
     , [DigitalGiftCreatedStamps] as [Digital Gift Created Stamps]             
     , [DigitalGiftCreatedStampsCml] as [Digital Gift Created Stamps Cumulative]            
     , [DigitalGiftRedeemedInteractions] as [Digital Gift Redeemed Interactions]      
     , [DigitalGiftRedeemedInteractionsCml]  as [Digital Gift Redeemed Interactions Cumulative]     
     , [DigitalGiftRedeemedStamps] as [Digital Gift Redeemed Stamps]            
     , [DigitalGiftRedeemedStampsCml] as [Digital Gift Redeemed Stamps Cumulative]      
     , [DigitalGiftExpiredInteractions] as [Digital Gift Expired Interactions]          
     , [DigitalGiftExpiredInteractionsCml] as [Digital Gift Expired Interactions Cumulative]  
     , [DigitalGiftExpiredStamps] as [Digital Gift Expired Stamps]              
     , [DigitalGiftExpiredStampsCml] as [Digital Gift Expired Stamps Cumulative]        
     , [DigitalGiftCancelledInteractions] as [Digital Gift Cancelled Interactions]     
     , [DigitalGiftCancelledInteractionsCml] as [Digital Gift Cancelled Interactions Cumulative]    
     , [DigitalGiftCancelledStamps] as [Digital Gift Cancelled Stamps]           
     , [DigitalGiftCancelledStampsCml] as [Digital Gift Cancelled Stamps Cumulative]
  from [dm].[AggProgramPeriodLoyalty];

此外,我添加了超时概述:LogOfWaitType

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。就目前而言,我们只能猜测 - 请发布架构定义(对于您的基表和您的视图),以及两个查询的执行计划。
  • 嗨!谢谢您的回答。我添加了一些信息,并且还想添加架构定义。您是指视图中使用的表结构和查询吗?还是您的意思不同?
  • 您是否在查询中使用任何窗口函数?
  • 我们非常更喜欢文字而不是图片,如果可以的话!是的,表格和视图的 DDL 会很棒。
  • @Bonzay,我现在包含了 DDL。该视图不包含任何窗口函数,只有 2 个鞋面。据我所知,这不会影响性能。

标签: sql sql-server performance azure-sql-database


【解决方案1】:

视图首先扫描基表,然后应用由分区键组成的过滤器。因此极端的性能差异。执行计划完全不同。由于您没有在视图中执行任何操作,并且只选择了一些基表字段,因此我建议您删除视图并直接使用该表。另一种选择是 TVF:

    CREATE FUNCTION dbo.fn_MyWorkaround(@ProgramId VARCHAR(50))
    RETURNS TABLE
    RETURN(
        select [AggProgramPeriodLoyaltyKey] as [Agg Program Period Loyalty Key]
     , upper([ProgramId]) as [Program Id]
     , [ProgramTitle] as [Program Title]
     , [ProgramCurrency] as [Program Currency]
     , [ProgramPeriodType] as [Program Period Type]
     , [ProgramPeriodTypeLabel] as [Program Period Type Label]
     , upper([ProgramWeekCombination]) as [Program Week Combination] 
     , [IsCurrentProgramPeriod] as [Is Current Program Period]
     , [IsLastCompletedProgramPeriod] as [Is Last Completed Program Period]
     , [LoyaltyId] as [Loyalty Id]
     , [IsRegistered] as [Is Registered]
     , [IsRegisteredCml] as [Is Registered Cumulative]
     , [UsedPlatforms] as [Used Platforms]
     , [DigitalStampsBalanceMutation] as [Digital Stamps Balance Mutation]
     , [DigitalStampsBalance] as [Digital Stamps Balance]
     , [DigitalRedeemPotential] as [Digital Redeem Potential]
     , [DigitalParticipationBonusInteractions] as [Digital Participation Bonus Interactions]
     , [DigitalParticipationBonusInteractionsCml] as [Digital Participation Bonus Interactions Cumulative]
     , [DigitalParticipationBonusStamps] as [Digital Participation Bonus Stamps]
     , [DigitalParticipationBonusStampsCml] as [Digital Participation Bonus Stamps Cumulative]
     , [DigitalCollectInteractions] as [Digital Collect Interactions]
     , [DigitalCollectInteractionsCml] as [Digital Collect Interactions Cumulative]
     , [IsNewDigitalCollector] as [Is First Digital Collect]
     , [IsDigitalCollector] as [Is Digital Collector]
     , [IsDigitalCollectorCml] as [Is Digital Collector Cumulative]
     , [DigitalCollectedStamps] as [Digital Collected Stamps]
     , [DigitalCollectedStampsCml] as [Digital Collected Stamps Cumulative]
     , [TurnoverByDigitalCollectors] as [Turnover By Digital Collectors]
     , [TurnoverByDigitalCollectorsCml] as [Turnover By Digital Collectors Cumulative]
     , [DigitalRedeemInteractions] as [Digital Redeem Interactions]
     , [DigitalRedeemInteractionsCml] as [Digital Redeem Interactions Cumulative]
     , [IsNewDigitalRedeemer] as [Is First Digital Redeem]
     , [IsDigitalRedeemer] as [Is Digital Redeemer]
     , [IsDigitalRedeemerCml] as [Is Digital Redeemer Cumulative]
     , [DigitalRedeemedStamps] as [Digital Redeemed Stamps]
     , [DigitalRedeemedStampsCml] as [Digital Redeemed Stamps Cumulative]
     , [DigitalRewards] as [Digital Rewards]
     , [DigitalRewardsCml] as [Digital Rewards Cumulative]
     , [TurnoverByDigitalRedeemers] as [Turnover By Digital Redeemers]
     , [TurnoverByDigitalRedeemersCml] as [Turnover By Digital Redeemers Cumulative]
     , [AdditionalPaymentForDigitalRewards] as [Additional Payment For Digital Rewards]
     , [AdditionalPaymentForDigitalRewardsCml] as [Additional Payment For Digital Rewards Cumulative]
     , [DigitalConvertInteractions] as [Digital Convert Interactions]
     , [DigitalConvertInteractionsCml] as [Digital Convert Interactions Cumulative]
     , [DigitalConvertedStamps] as [Digital Converted Stamps]
     , [DigitalConvertedStampsCml] as [Digital Converted Stamps Cumulative]
     , [DigitalAddInteractions] as [Digital Add Interactions]
     , [DigitalAddInteractionsCml] as [Digital Add Interactions Cumulative]
     , [DigitalAddedStamps] as [Digital Added Stamps]
     , [DigitalAddedStampsCml] as [Digital Added Stamps Cumulative]
     , [DigitalDeductInteractions] as [Digital Deduct Interactions]
     , [DigitalDeductInteractionsCml] as [Digital Deduct Interactions Cumulative]
     , [DigitalDeductedStamps] as [Digital Deducted Stamps]
     , [DigitalDeductedStampsCml] as [Digital Deducted Stamps Cumulative]
     , [DigitalTransferToInteractions] as [Digital Transfer To Interactions]
     , [DigitalTransferToInteractionsCml] as [Digital Transfer To Interactions Cumulative]
     , [DigitalTransferedToStamps] as [Digital Transfered To Stamps]
     , [DigitalTransferedToStampsCml] as [Digital Transfered To Stamps Cumulative]
     , [DigitalTransferFromInteractions] as [Digital Transfer From Interactions]
     , [DigitalTransferFromInteractionsCml] as [Digital Transfer From Interactions Cumulative]
     , [DigitalTransferedFromStamps] as [Digital Transfered From Stamps]
     , [DigitalTransferedFromStampsCml] as [Digital Transfered From Stamps Cumulative]
     , [DigitalGiftCreatedInteractions] as [Digital Gift Created Interactions]            
     , [DigitalGiftCreatedInteractionsCml] as [Digital Gift Created Interactions Cumulative]    
     , [DigitalGiftCreatedStamps] as [Digital Gift Created Stamps]             
     , [DigitalGiftCreatedStampsCml] as [Digital Gift Created Stamps Cumulative]            
     , [DigitalGiftRedeemedInteractions] as [Digital Gift Redeemed Interactions]      
     , [DigitalGiftRedeemedInteractionsCml]  as [Digital Gift Redeemed Interactions Cumulative]     
     , [DigitalGiftRedeemedStamps] as [Digital Gift Redeemed Stamps]            
     , [DigitalGiftRedeemedStampsCml] as [Digital Gift Redeemed Stamps Cumulative]      
     , [DigitalGiftExpiredInteractions] as [Digital Gift Expired Interactions]          
     , [DigitalGiftExpiredInteractionsCml] as [Digital Gift Expired Interactions Cumulative]  
     , [DigitalGiftExpiredStamps] as [Digital Gift Expired Stamps]              
     , [DigitalGiftExpiredStampsCml] as [Digital Gift Expired Stamps Cumulative]        
     , [DigitalGiftCancelledInteractions] as [Digital Gift Cancelled Interactions]     
     , [DigitalGiftCancelledInteractionsCml] as [Digital Gift Cancelled Interactions Cumulative]    
     , [DigitalGiftCancelledStamps] as [Digital Gift Cancelled Stamps]           
     , [DigitalGiftCancelledStampsCml] as [Digital Gift Cancelled Stamps Cumulative]
  from [dm].[AggProgramPeriodLoyalty]
        WHERE ProgramId = @ProgramId
    )
    GO 

然后使用 :

运行它
SELECT *
FROM dbo.fn_MyWorkaround('ParticularProgram')

这将为您提供相同的执行时间。

【讨论】:

  • 确实看起来像视图中的扫描和排序步骤导致了问题。我们确实会开始直接在表上查询,以防止这种情况发生,因为视图的主要功能是在名称中添加空格,我们现在将转移到 PowerBI。感谢您的帮助!
【解决方案2】:

我能看到的两个问题:

  • ProgramId 上没有索引,所以连表查询都很慢。
  • 视图查询实际上等价于...where upper(ProgramId) = 'ParticularProgram',所以即使ProgramId上的索引确实存在,也不能直接使用。另请参阅:sargable

建议:

  • 索引ProgramId(这也应该加快表查询)。
  • 修改视图以包含ProgramId AS [Program Id Original],然后查询那个(假设您在使用区分大小写的排序规则时实际上不需要不区分大小写):

    select * from view where [Program Id Original] = 'ParticularProgram'

或者,在upper(ProgramId) 上创建一个功能索引。


另外,请考虑使用不区分大小写的排序规则,因此您无需在 WHERE 子句中使用 upper

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2021-09-23
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多