我为一堆不同的报告创建了一系列视图.它们相互构建到最终视图,返回的记录少于5k.当我打开此视图时,运行所需的时间不到一秒.如果我添加WHERE collumn IS NOT NULL它需要超过2分钟.虽然这对报告很好,但我不需要经常运行,还有一些我必须每周,每天,有时更频繁地运行.
我的解决方案是创建一个存储过程,从视图的数据中生成一个表,并查询该表.我将存储过程设置为在计划的报告自动触发之前运行.这工作正常但我每次想要获取更新的报告时都必须手动运行存储过程.
有没有更好的办法?
查看[MW_Submitted_ROY]以查找已提交的周财务报表.此视图将活动表与静态表中的历史数据组合在一起.我在静态表中按摩的数据与活动数据的格式相同.
SELECT oe_po_no, cus_no, user_def_fld_1, user_def_fld_2, tot_sls_amt
FROM MW_Submitted_Weeks_OldMacola
WHERE MW_Submitted_Weeks_OldMacola.oe_po_no LIKE 'adv%'
UNION
SELECT oe_po_no, cus_no, user_def_fld_1, user_def_fld_2, tot_sls_amt
FROM oehdrhst_sql
WHERE oehdrhst_sql.oe_po_no LIKE 'adv%'
Run Code Online (Sandbox Code Playgroud)
查看[MW_Company_Weeks]以生成他们将为当前和上一年提交财务的每个公司的所有可能周数.
SELECT MW.MW_Weeks.Year, MW.MW_Weeks.Week, MW.MW_CompanyCodes.cmp_code
FROM MW.MW_Weeks CROSS JOIN
MW.MW_CompanyCodes
WHERE (MW.MW_Weeks.WEDate <= GETDATE()) AND (MW.MW_Weeks.Year > YEAR(GETDATE()) - 2)
Run Code Online (Sandbox Code Playgroud)
查看[MW_Submitted_Weeks_By_RBC_ROY]结合了有关生成报告所需公司的更多信息
SELECT dbo.cicmpy.textfield2 AS [Group], dbo.cicmpy.cmp_code, dbo.cicmpy.cmp_name, dbo.cicmpy.cmp_fadd3 AS Owner, dbo.cicmpy.SalesPersonNumber,
MW.MW_Submitted_ROY.user_def_fld_1 AS Year, MW.MW_Submitted_ROY.user_def_fld_2 AS Week, MW.MW_Submitted_ROY.oe_po_no AS Description,
MW.MW_Submitted_ROY.tot_sls_amt
FROM dbo.cicmpy INNER JOIN
MW.MW_Submitted_ROY ON dbo.cicmpy.cmp_code = MW.MW_Submitted_ROY.cus_no
WHERE (dbo.cicmpy.cmp_code LIKE 'C%') AND (dbo.cicmpy.cmp_status = 'a') AND (dbo.cicmpy.cmp_type = 'C')
Run Code Online (Sandbox Code Playgroud)
这将我们带到最终的视图[MW_Missing_Weeks],它显示我缺少了几周,以及上一年提交财务的价值.这是添加'is not null'使得它永远需要的地方.
SELECT MW.MW_Company_Weeks.Year, MW.MW_Company_Weeks.Week, MW.MW_Company_Weeks.cmp_code, bPrev.tot_sls_amt, bPrev.[Group], bPrev.cmp_name, bPrev.Owner,
bPrev.SalesPersonNumber, bPrev.Description
FROM MW.MW_Company_Weeks LEFT OUTER JOIN
MW.MW_Submitted_Weeks_By_RBC_ROY ON MW.MW_Company_Weeks.cmp_code = MW.MW_Submitted_Weeks_By_RBC_ROY.cmp_code AND
MW.MW_Company_Weeks.Year = MW.MW_Submitted_Weeks_By_RBC_ROY.Year AND MW.MW_Company_Weeks.Week = MW.MW_Submitted_Weeks_By_RBC_ROY.Week LEFT OUTER JOIN
MW.MW_Submitted_Weeks_By_RBC_ROY AS bPrev ON MW.MW_Company_Weeks.cmp_code = bPrev.cmp_code AND MW.MW_Company_Weeks.Year = bPrev.Year + 1 AND
MW.MW_Company_Weeks.Week = bPrev.Week
WHERE (MW.MW_Submitted_Weeks_By_RBC_ROY.cmp_code IS NULL) AND bPrev.tot_sls_amt IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
在SSMS中,转到查询>显示估计执行计划,或点击Ctrl + L.找到占用最高百分比的计划部分,并查看绿色是否有"缺失索引".右键单击并选择"缺少索引详细信息".这将创建用于制作索引的代码.您只需添加索引名称即可.
它看起来像这样:
/*
USE [Your Database]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[YourTable] ([ColA])
INCLUDE ([ColB],[ColC])
GO
*/
Run Code Online (Sandbox Code Playgroud)
这是创建索引的快速而肮脏的方法.
您也可以使用查询执行计划来解决问题.这需要一些练习.