SQL查询查看需要很长时间

时间:2013-10-02 13:22:28

标签: sql-server tsql

我为一堆不同的报告创建了一系列观点。它们相互构建到最终视图,返回的记录少于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%'

查看[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)

查看[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')

这将我们带到最终的视图[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

1 个答案:

答案 0 :(得分:7)

在SSMS中转到查询&gt;显示估算的执行计划,或点击Ctrl + L。查找占用最高百分比的计划部分,并查看是否存在绿色的“缺失索引”。右键单击并选择“缺少索引详细信息”。这将创建用于制作索引的代码。您只需添加索引名称。

看起来像这样:

/*
USE [Your Database]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[YourTable] ([ColA])
INCLUDE ([ColB],[ColC])
GO
*/

这是一种创建索引的快捷方式。

您也可以使用查询执行计划对问题进行故障排除。这需要一些练习。