我的观点如下:
CREATE VIEW V1
AS
SELECT
T1.Col1, F1.Col1, T1.Col2, T2.Col2...
FROM
T1
INNER JOIN
T2 ON T1.Col2 = T2.Col1
CROSS APPLY
UDF(T1.Col1, T2.Col2) F1
内部联接返回百万条记录。在这种情况下,我知道将从应用程序传递的T1.Col1
的确切值。
有没有办法重写上面的视图,以便交叉应用只能应用于过滤的记录(基于T1.Col1
值),而不是处理所有记录,然后过滤?即使在20分钟后,当前视图也不会返回任何值,而当我将值直接传递给UDF时,它会在不到一秒的时间内返回输出。
更新 以下是UDF的结构,我已根据以下评论更新了问题:
CREATE FUNCTION [dbo].[UDF](@Col1 INT, @Col2 INT)
RETURNS @TBL TABLE(Col1 int, Col2 int, Col3 VARCHAR(10), Col4 int) AS
DECLARE CURSOR1 CURSOR FOR
SELECT DISTINCT Col1 FROM TBL1 WHERE Col2 = @Col1 AND Col3 = @Col2
OPEN CURSOR1
FETCH NEXT FROM CURSOR1 INTO @Col1
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE CURSOR2 CURSOR FOR...
INSERT INTO @TBLVAR
SELECT * FROM SRCTBL1 WHERE
CLOSE CURSOR2
DEALLOCATE CURSOR2
DECLARE CURSOR3 CURSOR FOR...
INSERT INTO @TBLVAR
SELECT * FROM SRCTBL2 WHERE
CLOSE CURSOR3
DEALLOCATE CURSOR3
DECLARE CURSOR4 CURSOR FOR...
INSERT INTO @TBLVAR
SELECT * FROM SRCTBL3 WHERE
CLOSE CURSOR4
DEALLOCATE CURSOR4
CLOSE CURSOR1
DEALLOCATE CURSOR2
SELECT Col1, Col2, Col3, Col4
答案 0 :(得分:0)
使用公用表表达式:
CREATE VIEW V1
AS
WITH cte(cols...) AS
(
SELECT
T1.Col1, F1.Col1, T1.Col2, T2.Col2...
FROM T1
INNER JOIN T2
ON T1.Col2 = T2.Col1
WHERE T1.col1 = ?
)
SELECT *
FROM cte c
CROSS APPLY UDF(c.Col1, c.Col2) F1
答案 1 :(得分:0)
使用内存系统。如果你用java或.net写这个。将创建更快的结果。
创建一个微服务来缓存结果并为其提供服务。
微服务,维基百科,
答案 2 :(得分:0)
创建内联表值函数而不是视图:
create function fnx (@col1 int)
returns table
as
return (
select
t1.col1, f1.col1, t1.col2, t2.col2...
from
t1
inner join
t2 on t1.col2 = t2.col1
cross apply
udf(t1.col1, t2.col2) f1
where t1.col1 = @col1
)
这样您就可以将参数传递给t1.col1上的过滤器。