sql-server - Wrapper TSQL 表值函数很慢
问题描述
我构建了一个包装函数,该函数目前只调用另一个表值函数,但它只是在客户端处理时间中增加了大量的执行时间。有没有更快的方法来做到这一点?
包装函数:
CREATE FUNCTION [console].[getCalculosRequisita]
(
@Disponivel BIGINT,
@mediaDiaria float,
@DiasStockArtigo INT,
@DiasAntes INT,
@SaidasPorMes float,
@QtdEncomendada2Meses BIGINT,
@StockAtual BIGINT,
@QtdRequisitada BIGINT,
@caixaMinima INT
)
RETURNS @tbl TABLE
(
DiasAteRotura INT,
AcaoRequisita varchar(10),
Aconselhada BIGINT
)
AS
BEGIN
--future configuration check
--future log input
INSERT INTO @tbl SELECT DiasAteRotura, AcaoRequisita,Aconselhada
FROM [cartridge].[getCalculosRequisitaTSQL]
(
@Disponivel ,
@mediaDiaria ,
@DiasStockArtigo ,
@DiasAntes ,
@SaidasPorMes ,
@QtdEncomendada2Meses ,
@StockAtual ,
@QtdRequisitada ,
@caixaMinima
)
--future log output
RETURN
END
GO
解决方案
将其作为内联 TVF 执行,这要快得多:
CREATE FUNCTION [console].[getCalculosRequisita]
(
@Disponivel BIGINT,
@mediaDiaria float,
@DiasStockArtigo INT,
@DiasAntes INT,
@SaidasPorMes float,
@QtdEncomendada2Meses BIGINT,
@StockAtual BIGINT,
@QtdRequisitada BIGINT,
@caixaMinima INT
)
RETURNS TABLE -- WITH SCHEMABINDING -- preferable, but then you can't change the underlying function
(
DiasAteRotura INT,
AcaoRequisita varchar(10),
Aconselhada BIGINT
)
AS RETURN
(SELECT DiasAteRotura, AcaoRequisita, Aconselhada
FROM [cartridge].[getCalculosRequisitaTSQL]
(
@Disponivel ,
@mediaDiaria ,
@DiasStockArtigo ,
@DiasAntes ,
@SaidasPorMes ,
@QtdEncomendada2Meses ,
@StockAtual ,
@QtdRequisitada ,
@caixaMinima
) AS t
);
GO
显然,如果您这样做,那么您将无法进行任何其他插入。无论如何记录都是不可能的,所以我不确定你打算做什么。
您还没有给出底层函数的代码。也许这也可以作为 iTVF 来完成。
推荐阅读
- vb.net - 为什么我的图标没有出现在桌面或任务栏上?
- sql - 使用序列对象替代 ON CONFLICT DO NOTHING
- numpy - 如何向量化指数概率函数
- ios - Apple-app-site-association 文件中的 webcredentials 是否需要 TeamID 前缀?
- javascript - 如何为香港和其他类似国家/地区的日期中带有特殊字符的`setNumberFormat()`日期格式
- reactjs - 使用 switch-case 时将值从子组件发送回父组件
- sql - 如何根据 Microsoft Transact SQL 中的参数值构造 where 子句?
- python - 如果上面的行具有相同的值,则删除 Pandas 数据框的两列中的值
- html - 通过 CSP 中的 frame-src 指令阻止的嵌入标签加载的 PDF
- amazon-web-services - Amazon S3 拒绝 S3:DeleteObject 和 S3:DeleteObjectVersion 仍会删除对象并生成 TMP 文件