1

私は次のように構築されたビューを持っています:

CREATE VIEW [dbo].[myview] AS
SELECT   
       dbo.table1.field1
      ,dbo.table2.field2  
      ,dbo.HeavyStoredProcedure(dbo.table1.field1) AS calculated_value 
      ...
FROM
      table1
      INNER JOIN table2 ON (...)
WHERE  
      ...
      AND NOT( EXISTS (SELECT * from table3 
               WHERE (table3.somefield = dbo.HeavyStoredProcedure(dbo.table1.field1)))
               OR
               EXISTS (SELECT * from table4
               WHERE (table4.anotherfield = dbo.HeavyStoredProcedure(dbo.table1.field1)))
             )

ここでの問題は、「HeavyStoredProcedure」がまったく同じ引数で何度も呼び出されるため、全体がクロールに遅くなることです。

table1 の行ごとに 1 回だけ"HeavyStoredProcedure"を呼び出し、計算結果を WHERE 句で 2 回再利用するようにするにはどうすればよいですか?

4

1 に答える 1

0

SQL Serverの場合、これを試してください:

CREATE VIEW [dbo].[myview] AS
SELECT   
       dbo.table1.field1
      ,dbo.table2.field2  
      ,
      ...
FROM
      table1
      INNER JOIN table2 ON (...)
      outer apply (
          select dbo.HeavyStoredProcedure(dbo.table1.field1) AS calculated_value 
      ) as CALC
WHERE  
      ...
      AND NOT( EXISTS (SELECT * from table3 
               WHERE (table3.somefield = CALC.calculated_value))
               OR
               EXISTS (SELECT * from table4
               WHERE (table4.anotherfield = CALC.calculated_value))
             )
于 2013-09-19T08:59:23.977 に答える