コードを使用せずに、またはむしろ、SQL クエリを実行する前に 1 回だけ「静的に」SQL Server 2008 データベースに非クラスター化インデックスを作成する方法について助言していただければ幸いです (おそらく意味が通じないかもしれませんが、私の言いたいことは、ビジネス アプリケーションの一部である SQL クエリを実行するたびに、インデックスを作成する SQL コマンドを実行したくないということです)。
つまり、理想的には、Visual Studio 2010 Professional に組み込まれている Microsoft SQL Server 内に、これを行うためのツールがあるはずです (注: 私は ENTERPRISE エディションも ULTIMATE エディションも持っていません。これは、PROFESSIONAL バージョンの組み込み SQL マネージャーで実行できることに大きな違いをもたらします)。他にツールがないため (調べたところ、Microsoft SQL Server 2008 には必要なものがないことがわかりました。少なくとも私のシステムでは、どうやら機能不全のフリーウェア バージョンです)。したがって、以下のテーブルにインデックスを付ける単純な SQL コマンドで十分でしょう。
以下の参考文献を読みましたが、どうすればいいのかわかりません。
これが私の表です:
Table CUSTOMER
Columns:
CustomerID = GUID - this is a unique primary key
CustomerDecimal1 = decimal- this is not unique, but 99% of the time it is unique
compared to the rest of decimal fields. I wish to index this field 1 of 2
CustomerDecimal2 = decimal- this is not unique, but 99% of the time it is unique
compared to the rest of decimal fields. I wish to index this field 2 of 2
CustomerTextComments = vChar(50)
小数フィールドは WHERE 句で頻繁に使用されるため、非クラスター化インデックスに最適です。これは、Microsoft SQL Server 2008 でサポートされている新しい機能のようです。
私のプラットフォームについてさらに詳しく言うと、既存のデータを含むテーブルはすでにありますが、レコードは数個だけで、ほとんどが空白です。私は Visual Studio 2010 内のサーバー エクスプローラーから作業しています。このエクスプローラーには、SQL クエリを生成する機能など、多くの機能があります。理想的には、Linq-to-entities でインデックス メソッドを記述したいのですが (SQL をあまりよく知らないため)、このテーブルで CustomerDecimal1、CustomerDecimal2 フィールドにインデックスを付ける方法の完全なリストを誰か提供していただければ幸いです。
参考文献:
http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/ (SQL Server 2008 の WHERE 句検索用の新しい「フィルター処理された」インデックス プロパティ)
http://en.wikipedia.org/wiki/Index_%28database%29#非クラスター化
- - -更新しました
@mrdenny -- 時間を割いていただきありがとうございます。あなたは素晴らしい評判をお持ちだとは思いますが、あなたの言っていることは信じられません。はい、私は頑固なので、それを否定と呼んでいます! :-) 他の人が見てくれることを期待して、このスレッドをもう少しオープンにしておきます。また、私は SQL をネイティブで実行しておらず、Entity Framework (EF 4.0) 内部からの LINQ-to-Entities のみを実行しているため、あなたが親切に提供してくれたコード (「2 つの 10 進数列に非クラスター化インデックスを作成する T/SQL」) をどこに配置すればよいかさえわかりません。私は常に両方の 10 進数列を WHERE 検索で使用しているため、最初の SQL コマンドが私には適切です。
誰か、デニー氏の最初の SQL コードを Linq-to-Entities に翻訳できますか? それができないなら、私は手を上げて、信じられないと言います (インデックスはバランスのとれたツリーのようなもので、システムに自動的に組み込まれるはずだという私の読んだ内容に反します)。あるいは、行間を読んで、インデックスによって最大で約 20% のパフォーマンス向上が見込める、と読みました。これは良いことですが、それほど心配する必要はありません。はい、これは負け惜しみです!
答え1
まず、非クラスター化インデックスは SQL Server 2008 で新しく追加されたものではありません。以前から存在していました。フィルター インデックスは SQL Server 2008 で新しく追加されたものです。
SQL Server に対してクエリを実行する前に、どのインデックスを作成する必要があるかをシステムに判断させる方法はありません。
SQL Server でインデックスを作成するには 2 つの方法があります。1 つは T/SQL を使用する方法で、もう 1 つはグラフィカル エディターを備えた SQL Server Management Studio を使用する方法です。グラフィカル エディターは、T/SQL を生成し、データベースに対して T/SQL を実行するだけです。
2 つの 10 進列に非クラスター化インデックスを作成する T/SQL は次のようになります。
CREATE INDEX IX_CustomerDecimal1_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal1, CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
データベース テーブルを検索するときに 2 つの CustomerDecimal フィールドを個別に使用する予定の場合は、それぞれに個別のインデックスが必要になります。
CREATE INDEX IX_CustomerDecimal1 on dbo.CUSTOMER
(CustomerDecimal1)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
CREATE INDEX IX_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
どちらの場合でも、生成される IO を最小限に抑えるために、返される列を含まれる列のリストに追加する必要があります。