1

このようなSQLでインデックス付きビューを作成しました:

Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...

また、ビューを作成した後、列 Table1_ID にクラスター化された一意のインデックスを設定します。
したがって、ビューは 2 つの列で構成されます。

Table1_ID
Table2TotalCount

2 つの質問があります。

  1. の代わりにCount(1)orを使用すると、SQL は Table1_ID にインデックスを設定することを許可しませんCount_BIG(1)Count_BIG(*)
  2. 2 番目の列 ( ) の型をどのように制御できますかTable2TotalCount- SQL は、 この列に長い null 許容型を与えます。ただし、この列には int not nullable型を設定したいと考えています。ビューを作成した後、列の型を変更する方法が見つかりません。また、ビューの作成に使用する t-sql は、常に int 値をTable2TotalCountに返します。
4

2 に答える 2

1

COUNT_BIG(*) を使用する必要があります。これは、インデックス付きビューの作成に関する制限の 1 つです。

ビューの SELECT ステートメントには、次の Transact-SQL 構文要素を含めることはできません。

  • COUNT (COUNT_BIG(*) が許可されます。)

この最初のビューを参照し、カウント列のデータ型を目的の型にキャストする、インデックスが作成されていない 2 番目のビューを作成することができます (おそらく、ISNULL() を使用して null 許容プロパティを防止します)。

于 2010-12-09T11:54:04.700 に答える
0
  1. これはおそらく、フィールドまたは。の代わりに式を使用しているためです*。を使用count(1)すると、と同じ結果が得られcount(*)ます。つまり、レコード数をカウントするため、を使用する理由はありませんcount(1)

  2. (long)の代わりにgetの代わりcountにを使用します。(ドキュメントには、両者の唯一の違いはreturn型であると具体的に記載されています。)nullを返さないため、値がnull可能である理由はわかりませんが、すべての集計で同じであり、おそらく制御できない可能性があります。count_bigintbigintcount

于 2010-12-09T10:39:40.160 に答える