我有 TBV 功能。像这样
ALTER FUNCTION [dbo].[fn_Functiont]
(
@accessibleIds ListAccesableIds READONLY
)
RETURNS TABLE
AS
RETURN
(
SELECT d.*, b.Name AS Name, ps.Name AS PaymentSystemName, c.UserName AS UserName, c.FirstName AS ClientFirstName, c.LastName AS LastName, c.Number AS DocumentNumber, c.Id
FROM Document AS d
JOIN System AS ps ON d.SystemId = ps.Id
JOIN Client AS c ON c.Id = d.ClientId
LEFT JOIN Shop AS b ON b.Id = d.ShopId
WHERE d.OperationTypeId IN (2, 4, 5) AND c.Type = 1
)
Run Code Online (Sandbox Code Playgroud)
我想传递给这个包含整数的函数列表。我想创建表值类型,但这里的问题是我如何将 List 输入参数传递给函数?我知道我可以通过 …
sql-server entity-framework functions sql-server-2014 table-valued-parameters
我有一些运行缓慢的查询(按月分组的 100 万条记录中的 8 秒),并且一直试图理解执行计划。我们使用大约 10 个 TVP 来发送一组用户选择的过滤器,我有一个索引视图,占查询成本的 84%。
执行计划比较大,不能上传到这里,所以上传到这里了
我花了很多时间来尝试优化这些查询(其中有 14 个,但每个查询的核心都大同小异)并且希望任何人在阅读它们时提出建议或提示。我还实现了实际执行计划建议的查询,但查询速度慢了 5 倍?
performance sql-server execution-plan sql-server-2012 table-valued-parameters query-performance
我知道如何创建表类型(用作表值参数) - 但是一旦创建,我如何查看它?
我有一个标量函数,它返回一个大的 XML,它是通过一堆发票创建的。
可以使用几种不同的方法计算要提供给函数的确切发票列表,但函数每次都是相同的。出于这个原因,我声明了一个用户定义的表类型来包含表中的主键eInvoice.Header
并将其传递给函数。这样我就可以有几个不同的函数来决定要处理哪些发票,并且只有一个函数可以实际生成 XML:
create function eInvoice.GetRelevantLinesInOneWay()
returns table ...
create function eInvoice.GetRelevantLinesInAnotherWay()
returns table ...
create function eInvoice.GetXML(@lines eInvoice.InvoicePrimaryKeys readonly)
returns xml
as
begin
declare @x xml;
with xmlnamespaces(N'important namespace' as pro)
select @x = (
select
...
from
eInvoice.Header h
inner join @lines l on h.ST_PRIMARY = l.invoice_row_id
for xml path(N'pro:Import'), type
);
return @x;
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种设置已被证明是非常脆弱的。
通常@lines
包含大约 150 行(大约1m
in eInvoce.Header
)。正确的执行计划是在 上使用索引查找ST_PRIMARY
,当我将 的主体eInvoice.GetXML
作为临时查询执行时,总是会发生这种情况。
然而,当我将它存储为一个函数时,它会按预期工作一段时间,然后发生了一些事情(太多行@lines
,比如大约300 …
performance sql-server execution-plan sql-server-2012 table-valued-parameters query-performance