悬赏分:10 离问题结束还有 2 天 12 小时 浏览:144 次
字符串拼接的存储过程/视图/函数 效率问题!
如USE [PMS_HZTEST]
ALTER PROCEDURE [dbo].[FIN_CurrentDepositLedger_Select]
(
@PID BIGINT,
@LGID BIGINT = NULL
)
AS
SET NOCOUNT OFF;
DECLARE @SQL_Statement NVARCHAR(3000);
BEGIN
IF @LGID IS NULL
BEGIN
SET @LGID=dbo.dpk_FD_DefaultLanguage();
END
SET @SQL_Statement = '
SELECT DISTINCT CASE WHEN z.stayBKTID=2
THEN ''G''+IsNull(z.stayResvNo,'''')
ELSE IsNull(z.stayResvNo,'''')
END AS RESV#,z.stayHDID,
z.BusinessDate AS RESV_DATE,
dbo.uf_RPT_GetGuestName(z.stayBKTID,z.stayGuestPFID,z.stayDelegateFamilyName,z.stayDelegateGivenName, b.pfFamilyName,b.pfGivenName,c.hdGroupName) AS GUSET_NAME,
stayArrivalDate AS ARRIVAL,
[dbo].[uf_RPT_GetNoOfNTS](z.stayArrivalDate, z.stayDepartureDate) AS #NTS,
ISNULL(e.rtCode,'''') AS RM_TYPE,
dbo.uf_RPT_GetNoOfRoom_CurDepositLedger(z.PID,z.stayBKTID,e.rtROID,d.roomRTID,e.rtIsAffectAvail,z.stayShareWithSTID,z.stayHDID) AS #ROOM,
dbo.uf_RPT_GetRMRate(z.pid,z.stayID,'+CAST(@LGID AS NVARCHAR)+','''+CONVERT(NVARCHAR(20),@BusinessDate,111)+''') AS RM_RATE,
[dbo].[uf_RPT_GetTotalRoomCharges](z.PID,z.StayID,z.stayBKTID,z.stayHDID) AS TOTAL_ROOM_CHARGES,
IsNull(a.dltAmt,0) AS DEPOSIT_RECEIVED,
[dbo].[uf_RPT_Get_DiscountAmt](z.PID,z.StayID,z.stayBKTID,z.stayHDID) AS DISCOUNT_DEDUCTED,
dbo.uf_RPT_GetHCV_dltID(z.PID,z.stayid) AS HCV#,
a.BusinessDate AS DEPOSIT_DATE,
ISNULL(g.plDesc,'''') AS PNAME,
ISNULL(h.pCode,'''') AS PID,
a.dltid
FROM TXN_Stay z(NOLOCK)
INNER JOIN TXN_DepositLedgerTxn a(NOLOCK) ON (z.PID=a.PID AND z.STAYID=a.dltSTAYID)
LEFT JOIN Resv_Profile b(NOLOCK) ON (b.PFID=z.stayGuestPFID AND b.PFID>0)
INNER JOIN TXN_Header c(NOLOCK) ON (c.HDID = z.stayHDID AND c.PID=z.PID)
INNER JOIN Txn_Room d(NOLOCK) ON (z.stayROOMID=d.ROOMID AND d.PID=z.PID)
LEFT JOIN FO_RoomType e(NOLOCK) ON (e.RTID=d.roomRTID AND e.PID=d.PID)
INNER JOIN FO_Property h(NOLOCK) ON (h.PID=z.PID)
LEFT JOIN vw_Property_Local g(NOLOCK) ON (g.PID=h.PID AND g.LGID='+CAST(@LGID AS NVARCHAR)+' AND g.IsDeleted=0)
WHERE STAYID>0 AND z.stayInhouseSTID=102001 AND a.dltSTID IN (112001, 112004, 112009) AND a.dltType=1 ';
PRINT @SQL_Statement;
print len(@SQL_Statement);
EXECUTE (@SQL_Statement);
RETURN 0;
END
------------------------------------------------------------------
字符串拼接的存储过程中->函数多点好? 还是视图多点好? 还有写子查询?
在性能上那个好一点?
|
你太强了 竟然将那么多的表都联接查询 你的表关系真有那么复杂吗?
我最多的也就四个表进行过查询 看看你的数据库还能不能改进哈? 字符串拼接并不影响效率 但是转换成视图就不好了 函数是封装好的 这个也没什么的 写存储过程 最好不要用视图 昏`~看到这一大堆东西就头皮发麻~~很多时候把数据加载到内存再进行处理会更方便一些. 写成这种太难维护了`~ 貌似只有一个查询的样子, 上帝保佑你! 这段SQL语句我没有细看(主要是因为排版的缘故),只是简单说说我的看法: 1. 你的这个多表查询的确是长了点,不过不要因此就修改数据库结构,不是因为“牵一发而动全身”,而是数据库结构优化要全盘考虑,决不能因为一条语句就跑去瞎改。 2. 函数、视图、子查询,这三者的性能没有必然的顺序。 3. 你的这个存储过程没有给全,对吧? 4. 两条print语句是测试用的? 5. 最后面的return用来干什么的? 6. 请仔细分析你的SQL语句,看看是不是可以避免使用动态SQL。(我大概看了你的那条动态SQL,好像完全可以用避免的) 建议取出来数据之后在逻辑层做处理。而不是把所有的数据都在sql server上拼接好 |
|
1周前 IamV : 那如果确实有 6,7个表关联起来查数据 还有变量,限制条件等~ 应该怎么做呢? |
|
2天前 IamV : 我这个存储过程是用在ReportService中,需要直接返回数据, 现在主要想问下! 视图/函数 在性能上的区别! |