我的公司认为我们会提供一些报告。我遇到了一个问题,即使用该报告的管理人员暂停了。经过一些调查后,我发现从存储过程中返回93,000条记录需要5分钟,并且从视图中返回68,000条记录执行select语句并添加1 where子句(年份规范)。
在启动执行计划的情况下运行select后,我通过添加缺少的索引在68,000条记录上从3分钟到16秒。对我来说仍然太慢了,因为这不应该超过一秒或2。
执行计划在我的聚集索引扫描中有84%的成本。在这里找到另一个问题,询问他们如何减少并尝试解决方案,但它对我没有任何影响。我不是DBA,而是asp.net开发人员,所以我不知道索引和优化的细节。
查询未执行select *,因为其他人建议不要执行以下操作:
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
答案 0 :(得分:0)
如果您可以重构此视图,那将是最佳解决方案。如果没有,你几乎没有选择。
您的这部分查询不是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
都应编入索引。