台灣最大程式設計社群網站
線上人數
1984
 
會員總數:246228
討論主題:189787
歡迎您免費加入會員
討論區列表 >> MS SQL >> 有一堆運算欄位的Stored Procedure要怎麼改善效能?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
有一堆運算欄位的Stored Procedure要怎麼改善效能?
價值 : 100 QP  點閱數:1660 回應數:8
樓主

tdiuser
門外漢
0 17
339 27
發送站內信

hi all,

在stored procedure裡若大部份select的欄位皆為運算欄位
而這些運算欄位又大多來自相同table,差別只在於where條件些許不同
想請問這些運算欄位可以做什麼樣的整併或處理來提升效能嗎?

如:


目前已將原本存取實體table改為temp table,但改善程度不明顯
尤其某些table的資料量已達上百萬筆
光是執行stored procedure就要好幾分鐘 很頭痛>///<

搜尋相關Tags的文章: [ TSQL ] , [ tuning ] , [ 效能 ] , [ 優化 ] , [ STORED PROCEDURE ] , [ SP ] , [ SQL ] ,
本篇文章發表於2016-06-01 04:29
1樓
我也遇過這樣的問題
如果不需要即時就好辦 把運算的結果每天晚上排程 存到另外的table 讓使用者直接去 select 結果的排程算完的table

create procedure proc_算很大
as

select ............ into xxx from xxx1
本篇文章回覆於2016-06-01 06:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
alter table add B99 int null;

在 update 或許可以提升一些速度
本篇文章回覆於2016-06-01 06:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

pilipala
檢舉此回應
弄些 Sample Data 來參考,會比較有討論的方向。

就提供語法來看,推測應該子查詢部分, tblBBB Table 讀取太多次造成效能不好,可以嘗試改為這篇文章內的作法
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20110616095703KUY
在 SUM() 裡面有 CASE WHEN 來判斷資料條件

另外 WHERE 條件會影響 SQL Server 對於索引使用的選擇,可以利用執行計畫來看看
本篇文章回覆於2016-06-01 08:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

風箏
檢舉此回應
一次JOIN 搞定
主要兩張表的關連應該是透過
B.B0=A.A0 AND B.B1=A.A1 AND B.B2=A.A2
三個欄位
看你的子查詢都是判定第四段之後的條件進行加總

應該可以改寫成下面這樣
把第四段條件移到SUM CASE WHEN中進行判定
條件成力就加總B99
反之加0
本篇文章回覆於2016-06-01 10:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

tdiuser
檢舉此回應
TO 真的有點難,

呵,我現在就活生生碰到這個問題
每個計算欄位分開執行速度很正常,但兜在一起時就很可怕
本篇文章回覆於2016-06-01 13:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

tdiuser
檢舉此回應
TO pilipala & 風箏

下午找時間試試兩位大大的方法
不行的話再求救

先謝謝你們
本篇文章回覆於2016-06-01 13:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
現在我都這樣處理 例如下面的 procedure
ALTER procedure [dbo].[proc_客戶分析]
as
select
arf2103_customer_code 請款客戶,
arf2101_docno_type 單據分類編號,
arf2101_docno_date 異動單號_日期,
arf2101_docno_seq 異動單號_流水號,
arf2107_acc_date 帳款日期,
arf2108_acc_amt 帳款金額,
arf2106_ref_docno_type 來源單據編號,
arf2106_ref_docno_date 來源單據_日期,
arf2106_ref_docno_seq 來源單據_流水號,
saf2122_sales 業務人員,
saf2113_datecr 出租日期起日,
saf2114_datecpmtal 出租迄日
into #basic
from arf21 t1 left join saf21 t2 on
t1.arf2106_ref_docno_type=saf2101_docno_type and
t1.arf2106_ref_docno_date=t2.saf2101_docno_date and
t1.arf2106_ref_docno_seq=t2.saf2101_docno_seq
where arf2107_acc_date <=getdate()

select 請款客戶,業務人員,sum(帳款金額) 帳款金額
into #cnt
from #basic group by 請款客戶,業務人員



select 請款客戶,業務人員,min(出租日期起日) as 第一次租,min(出租迄日) as 第一次租迄 ,
max(出租日期起日) as 最後一次租,max(出租迄日) as 最後一次租迄
into #cnt2
from #basic
group by 請款客戶,業務人員

select
t1.請款客戶+'-'+ t3.cmf0103_bname as 客戶,
cmf0134_bzcode+'-'+ t5.cnf1003_char01 客戶類別,
t1.業務人員+'-'+t4.taf1004_cname as 業務,
convert(int,帳款金額) 帳款金額,
convert(char(10),第一次租,111) as 第一次租,
convert(char(10),第一次租迄,111) as 第一次租迄,
convert(char(10),最後一次租,111) as 最後一次租,
convert(char(10),最後一次租迄,111) as 最後一次租迄
from #cnt t1 join #cnt2 t2 on t1.請款客戶=t2.請款客戶 and t1.業務人員=t2.業務人員
left join cmf01 t3 on t1.請款客戶=t3.cmf0102_cuscode
left join taf10 t4 on t1.業務人員=t4.taf1001_empid
left join cnf10 t5 on cmf0134_bzcode=t5.cnf1002_fileorder and t5.cnf1001_filetype='s59'
order by 帳款金額 desc
本篇文章回覆於2016-06-01 14:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

Sdany
捐贈 VP 給 Sdany 檢舉此回應
我也是用 「風箏 」 的作法
本篇文章回覆於2016-06-22 20:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.