のインデックスのサイズを見つけるためにどのようにテーブル値関数
は、テーブル、 ビュー、またはとして索引または表オブジェクトのヒープあたりの行が含まれていることを語句がある
In article about sys.indexesテーブル値関数。
このようなインデックスのサイズを調べることに興味がありました。
だから私は、インデックスを持つ関数を作成:レコードはsys.indexes
でもあり
:
create function fIndexSize()
returns @res table
(
object_id int not null
, name varchar(128) not null
, primary key (object_id)
)
as
begin
insert into @res
select object_id, name
from sys.objects
where object_id > 255
return
end
を
通常、次のクエリを使用してインデックスのサイズを取得します。
select
o.schema_id
, o.object_id
, o.name
, o.type_desc
, sum (a.total_pages) * 8.00/1024/1024 as TotalSpaceGB
from sys.objects o
inner join sys.indexes i on o.object_id = i.object_id
inner join sys.partitions p on i.object_id = p.object_id and i.index_id = p.index_id
inner join sys.allocation_units a on p.partition_id = a.container_id
where (o.name = 'fIndexSize' or i.name like 'PK__fIndexSi%')
group by o.schema_id, o.object_id, o.name, o.type_desc
今回は何も返されませんでした。
誰も私にこのようなインデックスのサイズを見つける方法をアドバイスできますか?
それを区別するために、私はXXXXで列名を選択しましたマルチステートメントのテーブル値関数は、 'TF '型のsys.objectsに格納されていますが、あなたが言ったように、それはマテリアライズされていないので、スペースの割り当てはありません。クエリ内部結合は、sys.indexesなどに行がないためオブジェクトを省略します。 –
@DanGuzman、少しの実験の後で、テーブル値関数の結果セットがtempdbで実現されていることを確認しました。そのサイズは 'sys.allocation_units'を介しています。私は本当に忙しいサーバー上の問題の一時テーブルの名前を把握する方法を知りません。 –
私は、OPが各関数呼び出しの一時的なスペースを必要としていたことを理解していませんでした。 TVF自体に結びついているのではなく、実行コンテキストごとのスペース。 –