2013-10-02 197 views
3

我有一系列的視圖,我創建了一堆不同的報告。他們互相建立起一個最終視圖,返回少於5k條記錄。當我打開這個視圖時,運行時間不到一秒鐘。如果我添加一個WHERE collumn IS NOT NULL它需要2分鐘。雖然這對報告沒有問題,但我不需要經常運行,但還有其他一些我必須每週運行一次,每天運行一次,有時候更頻繁。查看TSQL查詢需要很長時間

我的解決方案是創建一個存儲過程,從視圖的數據中創建一個表並查詢它。我將存儲過程設置爲在計劃報告自動啓動之前運行。這工作正常,但我必須手動運行存儲過程手動每次我想要獲取更新的報告。

有沒有更好的方法?

查看[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]這說明我這周的缺失,和值前一年提交了財務報表。這是添加'不爲空'的地方,這使得它永遠。

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

http://technet.microsoft.com/en-us/library/dd171921(v=sql.100).aspx – seekerOfKnowledge

+0

如果不知道更多關於表結構,索引等的具體建議,真的很難做出。可以看一下執行計劃,看看發生減速的位置,看看索引可能在不存在的情況下可以提供哪些幫助。聽起來像「..不空」正在引發一些大表掃描,放慢東西... –

+0

@DavidW這些是我從來沒有搞錯過的東西。你想讓我包含執行計劃xml嗎?這很大。 – d90

回答

7

在SSMS中,轉到查詢>顯示預計執行計劃,或點擊Ctrl + L。找出計劃中佔據最高比例的部分,看看是否有綠色的「失蹤索引」。右鍵點擊並選擇「缺少索引詳細信息」。這將創建代碼來創建索引。你只需要添加索引名稱。

它會是這個樣子:

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

這是一個快速和骯髒的方法來創建一個索引。

您也可以使用查詢執行計劃對問題進行故障排除。這需要一些練習。

+0

technet.microsoft.com/en-us/library/dd171921(v=sql.100).aspx – seekerOfKnowledge

+1

@BClaydon它建議創建一個我創建的表的索引歷史數據。這使查詢執行時間從2分鐘縮短到5-9秒!現在,它建議在一張桌子上另外編制一個索引,像一整天都在寫。節省的成本是40%,但是我閱讀索引可以降低服務器的整體性能。我認爲這不會影響歷史數據表上的任何內容,因爲這從來沒有改變。建議? – d90

+0

@Dininno - 無論何時向表中添加新數據,都必須爲該表上的所有索引重新編制數據索引(您可以有許多索引)。因此,事務性表在數據進入時會受到性能影響。問題對你來說,是否值得這臺服務器值得呢?更重要的是,快速的報告還是快速的服務器?您可以隨時測試以查看發生的情況,然後根據需要刪除索引。 – BClaydon