2017-02-28 1 views
1

Mon entreprise estime que nous alimentons certains rapports. On m'a présenté le problème de l'expiration du délai par l'un des gestionnaires qui utilise le rapport. Après une enquête, j'ai trouvé qu'il fallait 5 minutes pour retourner 93 000 enregistrements de la procédure stockée, et 3 minutes pour retourner 68 000 enregistrements faisant une déclaration de sélection à partir de la vue avec 1 clause ajoutée (pour la spécification de l'année). Après avoir exécuté la sélection avec le plan d'exécution activé, je suis passé de 3 minutes à 16 secondes sur les 68 000 enregistrements en ajoutant un index qui manquait. Est encore trop lent pour que je sois d'accord avec cela car cela ne devrait pas prendre plus d'une seconde ou 2.Lenteur des résultats de la requête de vue

Le plan d'exécution a un coût de 84% dans mon analyse d'index en cluster. J'ai trouvé une autre question ici demandant comment ils peuvent réduire cela et essayé la solution mais cela n'a eu aucun effet pour moi. Je ne suis pas un DBA mais un développeur asp.net donc je ne connais pas les petits détails de l'indexation et de l'optimisation.

La requête ne fait pas un select * que d'autres ont suggéré de ne pas faire comme on le voit ci-dessous:

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' 

Est-ce que l'esprit de quelqu'un me aider obtenir cela à un meilleur nombre? J'apprécie l'aide.

EDIT:

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

Cette vue est assez simple. Le problème de performance réel est sans aucun doute dans 'vw_Facility_Detail_Report_V4'. –

+0

@GordonLinoff merci pour votre réponse rapide. Quoi ou où suggérez-vous que je regarde dans la vue? – ggiaquin16

+0

La publication de la définition de vw_Facility_Detail_Report_V4 serait utile, tout comme le plan d'exécution. – ZeroUltimax

Répondre

0

Si vous pouvez factoriser ce point de vue qui serait la meilleure solution. Sinon, vous avez peu d'options à faire.

  1. What makes a SQL statement sargable?

Votre cette partie de la requête n'est pas 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)) 
  1. Assurez-vous que tous les JOINs Column devraient être indexés.
  2. Si c'est possible, vous pouvez faire en sorte que les colonnes sélectionnées soient incluses dans l'index de couverture pour éviter la recherche de clés. https://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/