TSQL - 游标中返回的空行
TSQL - Empty rows returned in a cursor
抱歉,这可能是一个非常愚蠢的问题——我正在使用一个游标,它连接了一个临时 table 约 697K 行和一个 returns 78K 行的函数。 (我应该补充的是它以前更糟的改进)。游标遍历并匹配 'tables' 中的两个值并更新第三个值。这需要 6 个小时左右。这是荒谬的。我们正在努力想办法提高效率。
感谢任何和所有建议。但我的询问是这样的--
它似乎正在返回如下所示的数据(在很多情况下是空信息)。我可以限制代码说哪里...数据不为空...但它不会返回 Null 其 empty/nonexistent 行。我在想,如果有一种方法可以排除这样的行,我们可能会限制我们的数据池。但是我完全不知道这是什么意思。
declare @season int = 21
DECLARE @match varchar(55)
declare @perf_no int
declare @order_dt datetime
DECLARE @price CURSOR
SET @price = CURSOR FOR
SELECT distinct match_criteria, perf_no, order_dt
FROM #prices
OPEN @price
FETCH NEXT
FROM @price INTO @match, @perf_no, @order_dt
WHILE @@FETCH_STATUS = 0
BEGIN
select @match, @perf_no, @order_dt, x.price as 'amount'
from #prices p
join dbo.[LFT_GET_PRICES_Seasonal] (@season, @order_dt) x on p.perf_price_type = x.perf_price_type and p.zone_no = x.zone_no
where match_criteria = @match and perf_no = @perf_no
FETCH NEXT
FROM @price INTO @match, @perf_no, @order_dt
END
CLOSE @price
DEALLOCATE @price
这是#prices 和#我们的函数的示例 returns。
价格
pkg_no perf_no zone_no price_type order_dt price perf_price_type match_criteria
12 144 2707 1073 2018-09-03 00:00:00.000 NULL 115769 O5716788P1517Z2707
12 123 2707 1073 2018-09-03 00:00:00.000 NULL 115840 O5716788P1517Z2707
12 887 2707 1073 2018-09-03 00:00:00.000 NULL 115521 O5716788P1517Z2707
函数:
perf_price_type zone_no price min_price enabled editable_ind
115521 2678 12.00 12.00 Y N
115521 2679 61.00 61.00 Y N
115521 2680 41.00 41.00 Y N
光标所做的是根据函数的价格更新#prices table 中的价格。 (我们使用游标仅将其限制为某些 performance/limited 条件)。但我愿意接受建议。以及关于如何改进这一点的建议。
您写道,您希望使用 table 值函数的结果更新#price table。
您可以使用 cross apply
而不是游标来做到这一点。
由于您没有 post 正确的示例数据,我无法测试我的答案,但如果它满足您的需要,与游标相比,它应该快如闪电。
DECLARE @season int = 21
UPDAET p
SET price = x.Price
FROM #Prices p
CROSS APPLY
(
SELECT *
FROM dbo.LFT_GET_PRICES_Seasonal(@season, order_dt) udf
WHERE udf.perf_price_type = p.perf_price_type
AND udf.zone_no = p.zone_no
) x
SQL 最适合基于集合的方法而不是过程方法,这就是为什么您要尽可能避免循环和游标,并且只将它们用作最后的手段。
抱歉,这可能是一个非常愚蠢的问题——我正在使用一个游标,它连接了一个临时 table 约 697K 行和一个 returns 78K 行的函数。 (我应该补充的是它以前更糟的改进)。游标遍历并匹配 'tables' 中的两个值并更新第三个值。这需要 6 个小时左右。这是荒谬的。我们正在努力想办法提高效率。
感谢任何和所有建议。但我的询问是这样的--
它似乎正在返回如下所示的数据(在很多情况下是空信息)。我可以限制代码说哪里...数据不为空...但它不会返回 Null 其 empty/nonexistent 行。我在想,如果有一种方法可以排除这样的行,我们可能会限制我们的数据池。但是我完全不知道这是什么意思。
declare @season int = 21
DECLARE @match varchar(55)
declare @perf_no int
declare @order_dt datetime
DECLARE @price CURSOR
SET @price = CURSOR FOR
SELECT distinct match_criteria, perf_no, order_dt
FROM #prices
OPEN @price
FETCH NEXT
FROM @price INTO @match, @perf_no, @order_dt
WHILE @@FETCH_STATUS = 0
BEGIN
select @match, @perf_no, @order_dt, x.price as 'amount'
from #prices p
join dbo.[LFT_GET_PRICES_Seasonal] (@season, @order_dt) x on p.perf_price_type = x.perf_price_type and p.zone_no = x.zone_no
where match_criteria = @match and perf_no = @perf_no
FETCH NEXT
FROM @price INTO @match, @perf_no, @order_dt
END
CLOSE @price
DEALLOCATE @price
这是#prices 和#我们的函数的示例 returns。
价格
pkg_no perf_no zone_no price_type order_dt price perf_price_type match_criteria
12 144 2707 1073 2018-09-03 00:00:00.000 NULL 115769 O5716788P1517Z2707
12 123 2707 1073 2018-09-03 00:00:00.000 NULL 115840 O5716788P1517Z2707
12 887 2707 1073 2018-09-03 00:00:00.000 NULL 115521 O5716788P1517Z2707
函数:
perf_price_type zone_no price min_price enabled editable_ind
115521 2678 12.00 12.00 Y N
115521 2679 61.00 61.00 Y N
115521 2680 41.00 41.00 Y N
光标所做的是根据函数的价格更新#prices table 中的价格。 (我们使用游标仅将其限制为某些 performance/limited 条件)。但我愿意接受建议。以及关于如何改进这一点的建议。
您写道,您希望使用 table 值函数的结果更新#price table。
您可以使用 cross apply
而不是游标来做到这一点。
由于您没有 post 正确的示例数据,我无法测试我的答案,但如果它满足您的需要,与游标相比,它应该快如闪电。
DECLARE @season int = 21
UPDAET p
SET price = x.Price
FROM #Prices p
CROSS APPLY
(
SELECT *
FROM dbo.LFT_GET_PRICES_Seasonal(@season, order_dt) udf
WHERE udf.perf_price_type = p.perf_price_type
AND udf.zone_no = p.zone_no
) x
SQL 最适合基于集合的方法而不是过程方法,这就是为什么您要尽可能避免循环和游标,并且只将它们用作最后的手段。