5

SQL Server 2008 R2 を使用しています。私のデータベースには、ヒント付きのこれらのインデックス付きビューを使用するマルチインデックス付きビューとマルチビューが存在しますNOEXPAND。SSMS (Database\Tasks\Generate Script ...) でデータベースのスクリプトを取得すると、以下の順序で SSMS 製品スクリプトが実行されます。

  1. インデックス付きビューのスクリプト
  2. 上記のインデックス付きビューを使用するビューのスクリプト
  3. インデックス付きビューのクラスター化インデックス付きスクリプト。

NOEXPAND作成したスクリプトを実行すると、SQL サーバーはクラスター化インデックスのない最初のインデックス付きビューを作成し、次にヒント付きのインデックス付きビューのビューを作成しようとすると、エラーが発生します。私がやること?

SSMS エラー:hint 'noexpand' on object ..(indexed view).. is invalid.

4

2 に答える 2

12

スクリプト インデックスのデフォルトは False です。ビューに を含めるには、これを true に変更する必要がありCREATE INDEXます。管理スタジオで:

  • ツール > オプション
  • SQL Server オブジェクト エクスプローラー
  • スクリプティング
  • テーブルとビューのオプション > スクリプト インデックス

オプションを True に設定し、[OK] をクリックして、スクリプトの生成を再試行します。

編集

デフォルトのインストールで、変更したのは上記の設定だけです。次のスキーマを生成しました。

CREATE TABLE dbo.x(i INT);
GO
ALTER VIEW dbo.v_x
WITH SCHEMABINDING
AS
  SELECT i, c = COUNT_BIG(*)
    FROM dbo.x
    GROUP BY i;
GO
CREATE UNIQUE CLUSTERED INDEX i ON dbo.v_x(i);
GO
CREATE VIEW dbo.v_y
AS
  SELECT i,c FROM dbo.v_x WITH (NOEXPAND);
GO

データベースを右クリックし、[タスク] > [スクリプトの生成...] で 2 つのビューとテーブルを選択し、新しいクエリ ウィンドウにスクリプトを作成しましたSET。そこまたは重要ではない):

USE [foo]
GO
/****** Object:  Table [dbo].[x]    Script Date: 06/20/2012 08:03:59 ******/
CREATE TABLE [dbo].[x](
    [i] [int] NULL
) ON [PRIMARY]
GO
/****** Object:  View [dbo].[v_x]    Script Date: 06/20/2012 08:04:00 ******/
CREATE VIEW [dbo].[v_x]
WITH SCHEMABINDING
AS
  SELECT i, c = COUNT_BIG(*)
    FROM dbo.x
    GROUP BY i;
GO
CREATE UNIQUE CLUSTERED INDEX [i] ON [dbo].[v_x] 
(
    [i] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, 
  IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
  ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
/****** Object:  View [dbo].[v_y]    Script Date: 06/20/2012 08:04:00 ******/
CREATE VIEW [dbo].[v_y]
AS
  SELECT i,c FROM dbo.v_x WITH (NOEXPAND);
GO

を別のデータベースに変更したUSE [foo]ところ、スクリプトは正常に実行されました (そして、明らかに正しい順序になっています)。

したがって、スクリプトを別の方法で生成しているか、「エラー時にスクリプトを続行する」オプションを使用していて、ビューがインデックスの作成を妨げています。

于 2012-06-17T16:09:19.103 に答える
0

私は自分の質問を検索し、この問題を解決する方法を見つけます。この問題は、view1 という名前の単純なビューを作成し、view2 という名前の別のビューを作成し、view1 で view2 を使用し、view2 をインデックス付きビューに変更すると発生します。この問題を解決するには、view1 を再作成する必要があります。

于 2012-07-04T10:22:51.117 に答える