SQL Server交叉应用性能问题

时间:2015-08-27 11:22:50

标签: sql-server performance views cross-apply

我的观点如下:

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

3 个答案:

答案 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写这个。将创建更快的结果。

创建一个微服务来缓存结果并为其提供服务。

  • 参考

微服务,维基百科,

https://en.m.wikipedia.org/wiki/Microservices

答案 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上的过滤器。