2017-02-28 191 views
1

我的公司有一种观点,即我们通过一些报告提供。我被告知使用该报告的经理之一超时。经过一番调查后,我发现从存储过程返回93,000条记录需要5分钟,并且从视图返回68,000条记录,其中添加了1条where子句(用于年规格)。视图查询速度慢

在启动执行计划的情况下运行select之后,我通过添加一个缺失的索引,在68,000条记录上从3分钟到16秒。对于我来说仍然太慢,因为这应该不会超过一秒或2.

执行计划在我的聚簇索引扫描中花费了84%。在这里发现另一个问题,询问他们如何减少这种情况并尝试解决方案,但对我没有任何影响。我不是DBA,而是asp.net开发人员,所以我不知道索引和优化的小细节。

查询不是做一个选择*如其他人不建议做如下所示:

SELECT 
    [Customer_Type] 
    ,[Customer] 
    ,[Unit_Number] 
    ,[Cert_Number] 
    ,[Effective_Date] 
    ,[Expiration_Date] 
    ,[Coverage] 
    ,[CoveragePercentThefts] 
    ,[Amount] 
    ,[Facility_Name] 
    ,[Facility_Policy_Number] 
    ,[Accounting_Period] 
    ,[Entry_Date] 
    ,[Entry_Month] 
    ,[Entry_Year] 
    ,[FTD] 
    ,[Month_FTD] 
    ,[Year_FTD] 
    ,[Entry_By] 
    ,[Net_payment] 
    ,[transaction_code] 
    ,[Facility_Address] 
    ,[Facility_City] 
    ,[Facility_State] 
    ,[Full_Name] 
    ,[CalculatedNet] 
    ,[PctTenantsInsured] 
FROM 
    [Policy_Tracking].[dbo].[vw_Facility_Detail_Report_V4] 
WHERE 
    Year_FTD = '2016' 

会有人介意帮我得到这个下降到一个更好的多少?我很感激帮助。

编辑:

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE VIEW [dbo].[vw_Facility_Detail_Report_V4] 
AS 
    SELECT   
     dbo.Customer_Types.Customer_Type, 
     CASE 
      WHEN Customer_Types.Customer_Type = 'I' 
       THEN CUSTOMERS.First_Name + ' ' +  CUSTOMERS.Last_Name 
      WHEN Customer_Types.Customer_Type = 'O' 
       AND CUSTOMERS.Organization_Name > '' 
       THEN CUSTOMERS.Organization_Name 
      ELSE CUSTOMERS.First_Name + ' ' + CUSTOMERS.Last_Name 
     END AS Customer, 
     dbo.POLICYS.Unit_Number, dbo.POLICYS.Cert_Number, 
     dbo.POLICYS.Effective_Date, dbo.POLICYS.Expiration_Date, 
     dbo.Coverages.Coverage, dbo.CoveragePercentThefts.Description AS CoveragePercentThefts, 
     dbo.PAYMENTS_Transactions.Amount, dbo.FACILITYS.Facility_Name, 
     dbo.FACILITYS.Facility_Policy_Number, 
     dbo.PAYMENTS_Transactions.Accounting_Period, 
     dbo.PAYMENTS_Transactions.Mod_Date AS Entry_Date, 
     MONTH(dbo.PAYMENTS_Transactions.Mod_Date) AS Entry_Month, 
     YEAR(dbo.PAYMENTS_Transactions.Mod_Date) AS Entry_Year, 
     dbo.PAYMENTS_Transactions.Transaction_Date AS FTD, 
     MONTH(dbo.PAYMENTS_Transactions.Transaction_Date) AS Month_FTD, 
     YEAR(dbo.PAYMENTS_Transactions.Transaction_Date) AS Year_FTD, 
     dbo.PAYMENTS_Transactions.Mod_ID AS Entry_By, 
     dbo.siteLink_Statement.dcNetPayment AS Net_payment, 
     dbo.PAYMENTS_Transactions.Payment_Tran_Code_ID AS transaction_code, 
     dbo.FACILITYS.Address AS Facility_Address, 
     dbo.FACILITYS.City AS Facility_City, dbo.FACILITYS.State AS Facility_State, 
     dbo.CUSTOMERS.Full_Name, 
     dbo.PAYMENTS_Transactions.Amount - dbo.FACILITYS.Commission_Rate * .01 * dbo.PAYMENTS_Transactions.Amount AS CalculatedNet, 
     dbo.siteLink_Statement.dcPctTenantsInsured AS PctTenantsInsured 
    FROM    
     dbo.Customer_Types 
    RIGHT OUTER JOIN 
     dbo.CUSTOMERS ON dbo.Customer_Types.ID = dbo.CUSTOMERS.Customer_Type_ID 
    RIGHT OUTER JOIN 
     dbo.Policy_Facility_Customer 
    INNER JOIN 
     dbo.POLICYS ON dbo.Policy_Facility_Customer.Cert_Number = dbo.POLICYS.Cert_Number 
    INNER JOIN 
     dbo.FACILITYS ON dbo.POLICYS.Facility_Policy_Number = dbo.FACILITYS.Facility_Policy_Number 
         AND dbo.Policy_Facility_Customer.Facility_ID = dbo.FACILITYS.ID 
    LEFT OUTER JOIN 
     dbo.Coverages ON dbo.POLICYS.Coverage_ID = dbo.Coverages.ID 
    LEFT OUTER JOIN 
     dbo.CoveragePercentThefts ON dbo.POLICYS.Coverage_Percent_Theft_ID = dbo.CoveragePercentThefts.ID 
     ON dbo.CUSTOMERS.ID = dbo.Policy_Facility_Customer.Customer_ID 
    RIGHT OUTER JOIN 
     dbo.PAYMENTS_Transactions ON dbo.POLICYS.Cert_Number = dbo.PAYMENTS_Transactions.Cert_Number 
    LEFT OUTER JOIN 
     dbo.siteLink_Statement ON dbo.FACILITYS.Facility_Policy_Number = dbo.siteLink_Statement.SSFNumber 
           AND MONTH(dbo.PAYMENTS_Transactions.Accounting_Period) = MONTH(DATEADD(m, - 1, dbo.siteLink_Statement.zCreationDate)) 
           AND YEAR(dbo.PAYMENTS_Transactions.Accounting_Period) = YEAR(DATEADD(m, - 1, dbo.siteLink_Statement.zCreationDate)) 
GO 

EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPane1', @value=N'[0E232FF0-B466-11cf-A24F-00AA00A3EFFF, 1.00] 
Begin DesignProperties = 
    Begin PaneConfigurations = 
     Begin PaneConfiguration = 0 
    NumPanes = 4 
    Configuration = "(H (1[40] 4[20] 2[20] 3))" 
    End 
    Begin PaneConfiguration = 1 
    NumPanes = 3 
    Configuration = "(H (1[34] 4[49] 3))" 
    End 
    Begin PaneConfiguration = 2 
    NumPanes = 3 
    Configuration = "(H (1[50] 2[25] 3))" 
    End 
    Begin PaneConfiguration = 3 
    NumPanes = 3 
    Configuration = "(H (4 [30] 2 [40] 3))" 
    End 
    Begin PaneConfiguration = 4 
    NumPanes = 2 
    Configuration = "(H (1[56] 3))" 
    End 
    Begin PaneConfiguration = 5 
    NumPanes = 2 
    Configuration = "(H (2 [66] 3))" 
    End 
    Begin PaneConfiguration = 6 
    NumPanes = 2 
    Configuration = "(H (4 [50] 3))" 
    End 
    Begin PaneConfiguration = 7 
    NumPanes = 1 
    Configuration = "(V (3))" 
    End 
    Begin PaneConfiguration = 8 
    NumPanes = 3 
    Configuration = "(H (1[15] 4[76] 2))" 
    End 
    Begin PaneConfiguration = 9 
    NumPanes = 2 
    Configuration = "(H (1[28] 4))" 
    End 
    Begin PaneConfiguration = 10 
    NumPanes = 2 
    Configuration = "(H (1[66] 2))" 
    End 
    Begin PaneConfiguration = 11 
    NumPanes = 2 
    Configuration = "(H (4 [60] 2))" 
    End 
    Begin PaneConfiguration = 12 
    NumPanes = 1 
    Configuration = "(H (1))" 
    End 
    Begin PaneConfiguration = 13 
    NumPanes = 1 
    Configuration = "(V (4))" 
    End 
    Begin PaneConfiguration = 14 
    NumPanes = 1 
    Configuration = "(V (2))" 
    End 
    ActivePaneConfig = 0 
    End 
    Begin DiagramPane = 
    Begin Origin = 
    Top = -100 
    Left = 0 
    End 
    Begin Tables = 
    Begin Table = "Customer_Types" 
     Begin Extent = 
      Top = 20 
      Left = 680 
      Bottom = 128 
      Right = 836 
     End 
     DisplayFlags = 280 
     TopColumn = 0 
    End 
    Begin Table = "CUSTOMERS" 
     Begin Extent = 
      Top = 20 
      Left = 446 
      Bottom = 128 
      Right = 620 
     End 
     DisplayFlags = 280 
     TopColumn = 6 
    End 
    Begin Table = "Policy_Facility_Customer" 
     Begin Extent = 
      Top = 22 
      Left = 40 
      Bottom = 130 
      Right = 191 
     End 
     DisplayFlags = 280 
     TopColumn = 0 
    End 
    Begin Table = "POLICYS" 
     Begin Extent = 
      Top = 38 
      Left = 387 
      Bottom = 146 
      Right = 606 
     End 
     DisplayFlags = 280 
     TopColumn = 0 
    End 
    Begin Table = "FACILITYS" 
     Begin Extent = 
      Top = 188 
      Left = 164 
      Bottom = 296 
      Right = 353 
     End 
     DisplayFlags = 280 
     TopColumn = 0 
    End 
    Begin Table = "Coverages" 
     Begin Extent = 
      Top = 155 
      Left = 639 
      Bottom = 263 
      Right = 790 
     End 
     DisplayFlags = 280 
     TopColumn = 0 
    End 
    Begin Table = "CoveragePercentThefts" 
     Begin Extent = 
      Top = 330 
      Left = 38 
      Bottom = 438 
      Right = 240 
    ' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'vw_Facility_Detail_Report_V4' 
GO 

EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPane2', @value=N'   End 
     DisplayFlags = 280 
     TopColumn = 0 
    End 
    Begin Table = "PAYMENTS_Transactions" 
     Begin Extent = 
      Top = 432 
      Left = 484 
      Bottom = 540 
      Right = 682 
     End 
     DisplayFlags = 280 
     TopColumn = 0 
    End 
    Begin Table = "siteLink_Statement" 
     Begin Extent = 
      Top = 240 
      Left = 1076 
      Bottom = 369 
      Right = 1276 
     End 
     DisplayFlags = 280 
     TopColumn = 0 
    End 
    End 
    End 
    Begin SQLPane = 
    End 
    Begin DataPane = 
     Begin ParameterDefaults = "" 
     End 
     Begin ColumnWidths = 20 
    Width = 284 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    Width = 1500 
    End 
    End 
    Begin CriteriaPane = 
     Begin ColumnWidths = 11 
    Column = 19890 
    Alias = 1410 
    Table = 1500 
    Output = 720 
    Append = 1400 
    NewValue = 1170 
    SortType = 1350 
    SortOrder = 1410 
    GroupBy = 1350 
    Filter = 1350 
    Or = 1350 
    Or = 1350 
    Or = 1350 
    End 
    End 
End 
' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'vw_Facility_Detail_Report_V4' 
GO 

EXEC sys.sp_addextendedproperty @name=N'MS_DiagramPaneCount', @value=2 , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'VIEW',@level1name=N'vw_Facility_Detail_Report_V4' 
GO 
+1

此视图非常简单。毫无疑问,实际的性能问题在'vw_Facility_Detail_Report_V4'中。 –

+0

@GordonLinoff感谢您的及时回复。你认为我在视图中看到什么或在哪里? – ggiaquin16

+0

发布vw_Facility_Detail_Report_V4的定义会有所帮助,执行计划也一样。 – ZeroUltimax

回答

0

如果你能重构这个观点,这将是最好的解决办法。如果没有,你几乎没有选择。

  1. What makes a SQL statement sargable?

查询的这部分不是sargable

LEFT OUTER JOIN 
dbo.siteLink_Statement ON dbo.FACILITYS.Facility_Policy_Number = dbo.siteLink_Statement.SSFNumber 
    AND MONTH(dbo.PAYMENTS_Transactions.Accounting_Period) = MONTH(DATEADD(m, - 1, dbo.siteLink_Statement.zCreationDate)) 
    AND YEAR(dbo.PAYMENTS_Transactions.Accounting_Period) = YEAR(DATEADD(m, - 1, dbo.siteLink_Statement.zCreationDate)) 
  • 确保所有JOINs Column应该被索引。
  • 如果可能的话,您可以将选定的列作为覆盖索引以避免密钥查找。 https://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/