![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 tdiuser ![]()
![]() |
在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樓 |
弄些 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樓 |
我也是用 「風箏 」 的作法
本篇文章回覆於2016-06-22 20:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |