Crossを書き直す方法内側の結合に適用するためにビューをインデックス化するようにする

StackOverflow https://stackoverflow.com/questions/4089575

質問

aで 個別のスレッド 保存されたProcをビューに翻訳する方法についての実用的な例を獲得しました。これは、注文が注文なしでnullを含む注文のメッピングのマッピングに顧客名を保持します。したがって、以下の表には、ビューに次のように表示される必要があります。

Name     Orders
'John'   New Hat, New Book, New Phone
'Marry'  NULL

ビューをインデックス化する必要がありますが、ビュー内の選択クエリが適用されている場合やサブクエリが適用されている場合は、実行できません。このビューをインデックス付きビューに翻訳することは可能ですか?

create table Customers (CustomerId int, CustomerName VARCHAR(100))
create table Orders    (CustomerId int, OrderName VARCHAR(100))

insert into Customers  (CustomerId, CustomerName) select 1, 'John' union all select 2, 'Marry'
insert into Orders     (CustomerId, OrderName)    select 1, 'New Hat' union all select 1, 'New Book' union all select 1, 'New Phone'
go

create view OrderView as 
select c.CustomerName, x.OrderNames        
from Customers c            
cross apply (select stuff((select ',' + OrderName from Orders o 
      where o.CustomerId = c.CustomerId for xml path('')),1,1,'') 
      as OrderNames) x
go
役に立ちましたか?

解決

このビューをインデックス付けすることはできません。

基本的に、あなたはここで集計関数を持っています( CROSS APPLY).

インデックス付きビューで許可されている唯一の集計関数は COUNT_BIGSUM, 、彼らはセットの追加と減算を分配するので、それは SUM(a UNION ALL b) = SUM(a) + SUM(b), SUM(a EXCEPT ALL b) = SUM(a) - SUM(b).

このプロパティは、インデックスが保守可能になるために必要です。

基礎となるテーブルから新しいレコードが挿入、更新、または削除された場合、ビュー全体を再評価する必要はありません。新しいレコードの値は、集約値から追加または差し引かれます。

さらに、a COUNT_BIG レコードの削除を追跡するために、ビューの一部である必要があります( 0, 、ビューインデックスからレコードを削除する必要があります)。

他のヒント

1 = 1で内部結合を使用すると、条件が満たされ、結合が許可されます。

select * from x内側結合y on 1 = 1

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top