これは、CREATE VIEW SQLステートメントを学習する一連の第四の記事です。 これまでのところ、T-SQLを使用してビューを作成および変更することは多く行われてきました。 この最後の部分では、インデックス付きビューを操作する方法を大きく見てみたいと思います。
いつものように、シリーズと一緒に続くためには、前の部分を最初に読んでからこれを読むことを強くお勧めします。, これは主に、この部分でも使用する独自のサンプルデータベースとオブジェクトをゼロから作成したためですが、全体像を見やすくなるためです。
CREATE VIEW SQLシリーズの前の三つの部分は次のとおりです。
- SQL Serverでのビューの作成
- SQL Serverでのビューの変更
- SQL Serverでのビューを介したデータの挿入
これを続ける前に、それらを読んでください。
はじめに
最初に行うことは、インデックス付きビューを作成することです。, もちろん、このシリーズを通して何度も行ったように、このためにCREATE VIEW SQLステートメントを使用します。 しかし、一般的な考え方は、タイトルが言うように、インデックス付きビューを操作する方法、ビューにインデックスを追加するための要件、およびプログラ さらに、インデックス付きビューの長所を説明するために、SQL Serverでの実行計画を見ていきます。 低速な実行クエリのボトルネックを見つけて修正することになると、Dbaや開発者にとっては素晴らしいツールです。,
さらに騒ぎなしで、以下からCREATE VIEW SQLステートメントを使用してビューを作成し、それが何をするかを見てみましょう:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
div> |
sqlshackdbを使用します。
go
ビュー dboを作成します。,VEMPLOYEESALESORDERS
スキーマバインディング付き
として
従業員を選択します。EmployeeID、
製品。ProductID,
SUM(price*quantity)As SaleTotal,
SaleDate
からdboます。従業員
dboに参加します。従業員の販売。EmployeeID=売上。EmployeeID
dboに参加します。販売のプロダクト。ProductID=製品。ProductID
従業員によるグループ。EmployeeID、
製品。ProductID,
売上。,SaleDate;
GO
|
このビューにはWITH SCHEMABINDINGオプションがあることに注意してください。 の理由でこのオプションをオンにするので作成時の指標の景色は、実際に物理的に取得しデータベースに保存されている 言い換えれば、このビューが依存しているものは、テーブルに関する限り、構造は参照しているものから変更することはできません。
したがって、ビュー定義に影響を与えるような方法でそれらを変更できないように、基礎となるテーブルにバインドする必要があります。, 何らかの方法でそれらを変更しようとすると、SQL Serverはこのビューが何かに依存しているというエラーをスローします。 したがって、ビューにインデックスを作成するための難しい要件として見てください。
コマンドが正常に実行されると、以下に示すように、オブジェクトエクスプローラのViewsフォルダの下にvEmployeeSalesOrdersビューが表示されます。
ビューの定義はもう少し複雑なクエリです。 SELECT文の後にGROUP BY句が続く集計が得られました。, クエリに集計がある場合は、数値を一緒に追加するため、GROUP BY句が必要です。
基本的に、クエリにGROUP BYがある場合は、集計以外の選択リストにあるすべてのものでグループ化する必要があります。,
さて、私はすでにビューを作成しましたが、CREATE VIEW SQL文のSELECT部分のみを実行してビューの定義をテストして、それが返すものを確認することは常に良い考えです。
次に、スキーマバインドオプションが有効か無効かを確認する方法を次に示します。, オブジェクトエクスプローラーに移動し、ビューを展開し、ビューを右クリックしてプロパティを選択します。
ビュープロパティウィンドウの他のすべての情報の中で、一般ページの下でスキーマバインドオプションがTrueまたはFalseに設定されているかどうかがわかります。
インデックス付きビューの作成
先に進み、ビューにインデックスを作成しましょう。, Consider the script from below for creating a clustered index on the vEmployeeSalesOrders view:
1
2
3
4
5
6
|
USE SQLShackDB;
GO
CREATE UNIQUE CLUSTERED INDEX CAK_vEmployeesSalesOrders
ON dbo.,vEmployeeSalesOrders(EmployeeID,ProductID,SaleDate);
GO
|
SSMSで実行ボタンを押すと、SQL Serverはインデックスを作成できないというエラーをスローします。
上記のショットで見ることができない完全なエラーメッセージは次のとおりです。
ビュー’sqlshackdbにインデックスを作成できません。dbo。vemployeesalesorders’その選択リストにはCOUNT_BIGの適切な使用が含まれていないためです。 選択リストにCOUNT_BIG(*)を追加することを検討してください。,この場合、GROUP BYを使用しているという事実を考えると、COUNT_BIGが必要です。一般的に、COUNT、SUM、AVGなどの集計を使用している場合。 索引の選択リストには、索引を作成するためにCOUNT_BIGを含める必要があります。
それはまさに私たちがやろうとしていることです。,CREATE VIEW SQLステートメントを使用して、以下のスクリプトを使用して選択リストにCOUNT_BIGを追加します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
sqlshackdbを使用します。
go
alter view dbo.,VEMPLOYEESALESORDERS
スキーマバインディング付き
として
従業員を選択します。EmployeeID、
製品。ProductID,
SUM(price*quantity)AS SaleTotal,
SaleDate,
COUNT_BIG(*)AS RecordCount
dboから。従業員
dboに参加します。従業員の販売。EmployeeID=売上。EmployeeID
dboに参加します。販売のプロダクト。ProductID=製品。ProductID
従業員によるグループ。EmployeeID、
製品。ProductID,
売上。,SaleDate;
GO
|
この場合、これがなぜ起こっているのか疑問に思っているなら、sql Serverはインデックスに対して回しているレコードの数を追跡する方法を必要とし、これはインデックス付きビューを作成する際の制限の一つでもあるためです。
これまでのところ、すべてがうまく見えます。 ビューの定義を正常に変更しました。
これで、以前に使用したスクリプトをもう一度実行することで、ビューにインデックスを作成することに戻ることができます。, 今回は、操作がスムーズに完了します。 オブジェクトエクスプローラーに移動し、ビューのIndexesフォルダーを展開すると、新しく作成されたインデックスが表示されます。
ここから、インデックスを右クリックしてプロパティを選択すると、一般ページでビュー名、インデックス名、タイプ、キー列などが表示されます。,:
ストレージに切り替えると、物理的にデータベースに格納されているため、ファイルグループがあることがわかります。
さらに、断片化に切り替えると、テーブルにはいくつかのレコードしかないので、総フラグメンテーションがゼロパーセントであるとします。
sqlインデックスの保守と監視に関する詳細で楽しく読みやすいプライマーをお探しですか? SQLインデックスの保守を確認します。,
インデックスの削除
さらに進む前に、インデックスを削除する方法を見てみましょう。 最も簡単な方法は、右クリックしインデックスオブジェクトExplorer用の削除オプションです。 ただし、一度に複数のインデックスを削除する必要がある場合は、DROP INDEX文が便利です。 結局のところ、これはCREATE VIEW SQLステートメントの学習に関するT-SQLシリーズであるため、これが私たちがやろうとしていることです。,
Use the script from below to drop the CAK_vEmployeesSalesOrders index:
1
2
3
4
5
|
USE SQLShackDB;
GO
DROP INDEX CAK_vEmployeesSalesOrders ON dbo.,vEmployeeSalesOrders;
GO
|
複数のインデックスを削除する必要がある場合は、すべての名前をカンマで区切って指定します。
ランダムデータの生成
さて、インデックスを取り除いたので、テーブルにランダムデータを生成して、実行計画を見て、SQL Serverが内部でデータをフェッチする方法を見てみましょう。 解析の実行プランを見つけ方の違いの性能に対する影響については、クエリーな指します。,
以下のスクリプトを使用して、50000のランダムなレコードをSalesテーブルに挿入します。
スクリプトを詳細に説明するつもりはありませんが、基本的に50000回実行され、ランダムなデータをSalesテーブルに挿入するループです。, レコードが正常に挿入されたかどうかを確認するには、Salesテーブルのすべてのレコードをカウントする次のSELECTステートメントを実行します。
1
2
3
4
|
sqlshackdbを使用します。
go
セールスからカウント(*)を選択します
|
返される数は、salesテーブルに50006行があることを示しています。, これは、私たちが最初に持っていた+6を生成したレコードの数です。
実行計画の分析
テーブルにいくつかのデータがあるので、ビューでのインデックスの使用を実際に示すことができます。 VEmployeeSalesOrdersビューを照会し、SQL Serverがデータを取得する方法を確認しましょう。, Before executing the SELECT statement from below, make sure to include the Actual Execution Plan as shown below:
1
2
3
4
|
USE SQLShackDB;
GO
SELECT * FROM dbo.,vEmployeeSalesOrders;
|
このスクリプトは23814行を返しましたが、さらに重要なのは、クエリの実行計画を生成しました。 覚えていることを落としたインデックスります。 だから、今私たちの見解には索引はありません。 したがって、SQL Serverは以下のようにいくつかのテーブルスキャンを行います。
これは、データベースの世界では、特に大量のデータを持つテーブルでは、ほとんど最悪のことです。, EmployeesテーブルやProductsテーブルの場合など、少量のデータでテーブルスキャンを行うことは問題ありませんが、50k以上のレコードがあるため、Salesテーブルには悪いです。
テーブルスキャンを取り除く最も簡単な方法は、それが劇的に物事を高速化するので、その上にインデックスを作成することです。 したがって、この問題を解決するために行うことは、vemployeesalesordersビューで一意のクラスタ化インデックスを作成するためのスクリプトを再実行することです。
ここで、SELECT文を再実行するだけで、インデックスを作成したばかりであっても違いはありません。 それはなぜですか?, このシリーズの目的でSQL Server Express editionを使用しているため、Sql ServerのEnterprise editionおよびDeveloper editionでのみ、クエリオプティマイザが実際にインデックスを考慮します。
実行計画を生成するときにSQL Serverにインデックスを使用させることができるため、心配はありません。 これは、NOEXPANDオプションを使用して行われます。, NOEXPANDはインデックス付きビューにのみ適用されます。
1
|
dboから*を選択します。vEmployeeSalesOrders WITH(NOEXPAND)
|
そのように、SQL Serverにクラスタ化インデックスを使用させました。, 以下に示すように、いくつかの操作を排除することによって、いくつかの進歩を遂げました。
実際には、SELECTステートメントを同時に実行し、実行計画を見て結果を比較することができます。
あなたはそれを見ますか? 最初のSELECT文(w/o index95%)と第二のSELECT文(w/index5%)のクエリコストを比較すると、単一のインデックスを使用するとパフォーマンスが大幅に向上します。,
結論
インデックスはパフォーマンスを高速化し、ビューのインデックスではインデックスがデータベースに格納されているため、パフォーマンスを ビュこの記事では、この一連のCREATE VIEW SQLステートメントの学習を終えてみたいと思います。
T-SQLを使用したビューの作成と変更に関するすべてについて、ほぼ説明しました。, CREATE VIEW SQLステートメントから始め、いくつかのビューを作成し、それらを変更し、削除しました。
私はこの一連のCREATE VIEW SQL文を学ぶことがあなたにとって有益であり、それを読んでくれてありがとうと願っています。,
CREATE VIEW SQL:SQL Serverのビューを介してデータを挿入
CREATE VIEW SQL:SQL Serverのインデックス付きビューの操作
- 著者
- 最近の投稿
コペンハーゲン-デザイン-アンド-テクノロジー-スクールのネットワークと電子技術に焦点を当てたitテクノロジーのAp卒業生であるbojan aka”boksi”は、品質保証、ソフトウェアサポート、製品のエバンジェリズム、ユーザーエンゲージメントの経験を持つソフトウェアアナリストです。,
彼はSQL ShackとApexSQLソリューションセンターの両方に関して、4K解像度やテーマ設定、エラー処理、インデックス戦略、パフォーマンス監視などのクライアント技術に関するトピックについて幅広く執筆している。
Bojanは、セルビアのNisにあるApexSQLで、MySQLやSQL Serverを含む次世代のデータベースツールの設計、開発、テスト、およびスタンドアロンツールとVisual Studio、SSMS、VSCodeへの統合の両方に焦点を当てたチームの不可欠な部分として働いています。,
詳しくは約Bojanです
すべての投稿によるBojan Petrovic
- Visual StudioコードのためのMySQLおよびMariaDBの開発-月13日 2020
- SQL UPDATE構文の説明-月10日2020
- ビュー SQL:ワークを眺めはまさにSQLサーバー-平成24年2020年