我正在尝试将每个交易者的前 253 个值从临时交易者表插入到临时结果表中。
我正在使用以下代码来做到这一点。
CREATE TABLE #trad ( Trad varchar(50))
IF @trad is not null
INSERT INTO #Trad
SELECT DISTINCT * FROM dbo.Split(@trad,',') -- split will have traders seperated by commas
ELSE INSERT INTO #Traders
Select distinct Trader from TraderMap tm
where traderorgroup = 'trader'
CREATE TABLE #result
(port VARCHAR(50),portdate DATE,P MONEY,V_95 MONEY,
V_99 MONEY,VLimit MONEY,V_90 MONEY,H_99 MONEY,
H_975 MONEY,H_95 MONEY,H_90 MONEY,H_80 MONEY,dCnt
INT,Trad varchar(100))
DECLARE @traderlist AS Varchar(100)
DECLARE traderlist CURSOR FOR
SELECT DISTINCT Traders FROM #traders
OPEN traderlist
FETCH next FROM traderlist INTO @traderlist
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #result (port, portdate, P, V_95, V_99, VLimit,
dCnt,Trad)
SELECT TOP 253 pl.Port,pl.Portdate,pl.dtd_P
PL,var.V_95,var.V_99, sum(gu.Guid * -1) VLimit,
Row_number() OVER(partition by pl.TradName ORDER BY Portdate DESC)
dCnt,pl.TradName
FROM Trad_PL pl INNER JOIN rep_tab var
ON pl.Portdate = var.V_Date
AND pl.Port = var.Port
AND pl.TradName = var.Trad
INNER JOIN Trad_Guid gui
ON pl.Port = gui.Port
AND pl.TradName = gui.Trad
WHERE pl.Portdate <= @portdate
AND pl.Port = CASE WHEN @port = 'Her' THEN 'Herport' ELSE
@port END
AND pl.ONA = 'Act'
AND pl.TradName = @tradlist
AND var.PType = '0Trad'
group by
pl.TradName,pl.Port,pl.Portdate,pl.dtd_P,var.V_95,var.V_99
ORDER BY Portdate DESC
FETCH next FROM tradlist INTO @tradlist
END
CLOSE tradlist
DEALLOCATE tradlist
此代码运行数小时。有什么有效的方法可以从 Trad_PL 和 rep_tab 中获取每个交易的前 253 行。
一般来说,如果您有一个游标,那么它是您查找性能问题的第一个地方。如果您有 10 个交易员,它可能会很有效,但如果您有 10,000 个交易员,它就不太好用了。
尝试这个。
我删除了命中 @tradlist 的 where 子句并加入了您的临时表(它已经从不同的交易者列表创建,所以不用担心)。我还消除了 TOP 253。您已经使用 dCnt 字段创建了一个行号,所以我只是在 dCnt <= 253 的 WHERE 子句中添加了一个条目。
如果您仍然遇到性能问题,我会确保您有与每个连接相关的索引并查看查询计划。总体而言,性能调优是一个很大的主题,但您可能比购买 Grant Fritchey 的《执行计划》一书做得更糟。甚至还有免费的电子书副本。
https://www.red-gate.com/simple-talk/books/sql-server-execution-plans-third-edition-by-grant-fritchey/
最后但同样重要的是,完全远离您的实际问题,格式是您发布代码时的朋友。如果您的代码更易于阅读,您就更有可能获得积极的回应(和答案)。如果您看的话,我发布的这段代码经过格式化以使其更易于阅读。您当然不必使用这种特定的布局,格式化可能是一件非常个人化的事情,但除了屏幕左侧的所有代码之外的其他东西通常会有帮助。