SQL Serverクエリの最適化とトランザクション処理で

我々は、単純なクエリの様々な使用方法を理解し、しかしを含む実際の開発では、より高度なデータ処理やクエリの一部で使用される前に、インデックス、ビュー、ストアドプロシージャとトリガこのように、より良いデータベース、診断、最適化の動作を達成することができ。

データベースのパフォーマンスを向上させるために、インデックスを使用して、データベースの検索速度を向上させるために達成するように、それをインデックス化されてどのような、インデックスメソッドは、内部SQL Serverのセットアップデータであり、彼は、SQL Serverがクエリのデータをルーティング編成するための方法を提供します。

:インデックスは、以下の6つのカテゴリに分類され
たインデックスは、2つの行が同じ値を持つ、ユニーク制約を作成することはできません、それは自動的に一意のインデックスを作成します。唯一のインデックスは、1。
2、主キーインデックス:インデックスは主キーのインデックステーブルは主キーを定義するときに自動的に作成される一意の特別な種類です、彼は各プライマリキー値が一意であることが必要です。
図3に示すように、クラスタ化インデックス:集約内のインデックス、テーブル内の行の物理的な順序と同じ順序で論理インデックスキー値。(注:表が一つだけクラスタ化インデックスを含むことができます)
4、非クラスタ化インデックス:インデックス・ページに基づいて、データを照会するときに、インデックスから保存されたレコードの場所を見つけることができ、より高速な非クラスタ化インデックスより、インデックスデータをクラスタ化アクセス速度。
図5に示すように、複合インデックス:複数の列をインデックスに組み合わせることができます。
図6は、フルテキストインデックスは:主にテキスト検索文字列の多数で使用されているインデックスマークに基づいて機能の特殊なタイプです。
:()一意のインデックス重複する値を作成することはできません

create unique nonclustered index U_cardID 
on TStudent (cardID)

テーブルの上に表示するインデックス:

Select * from sys.sysindexes 
where id=(select object_id from sys.all_objects where name='Tstudent')

指定されたインデックスをクエリ:

SELECT * FROM xueyuan
    WITH (INDEX = IX_name)
    WHERE 学员姓名 LIKE '孙%'

ビューは、通常、1つまたは複数の行または作成されたセットの列からのサブテーブルとして、仮想テーブルです。
ビューアクションがある:
1、テーブル内のデータをフィルタリング
2、機密データへのアクセス権限のないユーザーを防止するために
3を、物理データテーブル抽象データテーブルの複数の論理的である
ユーザのメリットである:結果は、より容易に理解され、データが得られましたしやすい
開発者に有益である:アプリケーション・維持するために、より簡単で便利なデータ検索を制限すること
注:
1、各ビューは複数のテーブルを使用することができ
、クエリに類似する2を、ビューは他のビュー、最もを入れ子にすることができ3良い超えないようにしてください
3を、以下を含めることはできませんselect文を定義しようとします。

  • ORDER BY句、SELECT文の選択リストには、TOP句を持っていない限り、
  • キーワードINTO
  • 一時テーブルまたはテーブル変数の参照
    ビューを作成するには:
    create view netstudent
    as
    select Sname,sex,Class from dbo.TStudent where Class='网络班'

    ビューからのデータを検索します。

    select * from netstudent 
    where sex='男'

    ビューを作成し、ヘッダ列を変更します。

    create view V_Tstudent1
    as
    select StudentID  学号,Sname 姓名,sex  性别,cardID  ×××号码,Birthday  生日,Class  班级 from dbo.TStudent
    select * from V_Tstudent1

    どのようなストアドプロシージャ、ストアドプロシージャでは、アプリケーションを呼び出すことができ、データベースに保存されたSQL文および制御文のプリコンパイルされたコレクションです。
    なぜストアドプロシージャを必要とする、サーバ(サーバ)SQLコードおよび実行にネットワークを介してクライアント(クライアント)から送信されたが適切でないので、それは、データが得られると、安全でないアプリケーションの実行性能の印象、及びネットワークトラフィックを漏れること大規模な。
    :ストアドプロシージャを使用することの利点は
    、1モジュラー設計
    2、実行速度、高効率
    ネットワークトラフィック低減、3
    、4、良好な安全有する
    ストレージプロセスは2つのカテゴリに分類される:システムストアドプロシージャストアドプロシージャとユーザ定義します
    システムストアドプロシージャ:
    テーブル管理データベースを更新するためのメカニズムを提供し、システム・テーブルからショートカット情報を取得するように機能するプリコンパイルさT-SQLステートメントのセット
    リソースデータベースに格納されている「SP」で始まり、共通次のようにシステムストアドプロシージャは、次のとおりです。
    SQL Serverクエリの最適化とトランザクション処理で
    T-SQL構文ステートメントを使用すると、ストアドプロシージャの実行を呼び出します。

    EXEC [UTE] 存储过程名 [参数值]
    EXEC为EXECUTE的简写

    一般的なシステムストアドプロシージャの使用方法:

    exec  sp_databases      --列出当前系统中的数据库
    exec  sp_renamedb  'mybank','bank'   --改变数据库名称(单用户访问)
    use  MySchool
    go 
    exec sp_tables                       --当前数据库中可查询对象的列表
    exec sp_columns student            --查看表student中列的信息
    exec  sp_help student               --查看表student的所有信息
    exec sp_helpconstraint student       --查看表student表的约束
    exec sp_helptext view_student_result   --查看视图的语句文本
    exec sp_stored_procedures      --返回当前数据库中的存储过程列表

    システムストアドプロシージャの役割に応じて、システムストアドプロシージャは、異なるクラスに分けることができ、ストアドプロシージャを拡張SQL Serverは、クラスにシステムストアドプロシージャの様々なタイプを提供することです。
    外部プログラムにSQL Serverからの例を提供するインタフェースは、(例えば、C#など)、他のプログラミング言語の使用は、外部ストアド・プロシージャを作成することができ
    、「XP」、DLLフォーム単独で始まる
    共通拡張ストアドプロシージャのxp_cmdshell彼はDOSコマンドで終了しますいくつかの操作は、それはそれで例示される
    構文は次のとおりです。
    **EXEC xp_cmdshell DOS命令 [NO_OUTPUT]**
    サーバーのセキュリティ設定などの一般的にxp_cmdshellの一部がオフになっている、あなたが有効にするには、次のステートメントを使用する必要があります。

    exec sp_configure  'show advanced options', 1   --显示高级配置选项(单引号中的只能一个空格隔开)
    go 
    reconfigure                                    --重新配置
    go 
    exec sp_configure  'xp_cmdshell',1                 --打开xp_cmdshell选项
    go
    reconfigure                                    --重新配置

    次の文の実行を有効にした後:

    exec  xp_cmdshell  'mkdir  c:\bank',no_output  --创建文件夹c:\bank
    exec  xp_cmdshell  'dir c:\bank\'               --查看文件 

    ユーザ定義ストアド・プロシージャ:
    完全なストレージ・プロセスが含まれ

  • 入力および出力パラメータ
  • ストアドプロシージャのT-SQL文で実行
  • 戻り値ストアドプロシージャは、
    保存処理SSMSを作成する
    :完全なストレージ・プロセスは、次の3つのパーツ含ま
    1、入力及び出力パラメータ
    記憶処理T-SQLステートメントで実行、2
    3、ストアドプロシージャの戻り値
    T-SQLステートメントを使用してストアドプロシージャの構文を作成することです:
    CREATE  PROC[EDURE]  存储过程名 
        [ {@参数1  数据类型 } [= 默认值] [OUTPUT],
           ……,
          {@参数n  数据类型 } [= 默认值] [OUTPUT]
        ]
    AS
        SQL语句

    構文は、ストアドプロシージャを削除し、次のとおりです。
    DROP PROC[EDURE] 存储过程名
    たとえば、クエリの平均スコアは、最近の検査のコース:

    use schoolDB
    go
    if exists  (select  *  from  sysobjects where name='usp_getaverageresult')
    drop  procedure  usp_getaverageresult
    go
    create  procedure  usp_getaverageresult
    as
    declare  @subjectid  nvarchar(4)
    select  @subjectid=subjectid  from  dbo.TSubject where subJectName='网络管理'
    declare  @avg decimal (18,2)
    select  @avg=AVG(mark)  from  dbo.TScore where subJectID=@subjectid
    print  '网络管理专业平均分是:'+convert(varchar(5),@avg)
    go

    書き込みの実行が完了した後:exec usp_getaverageresult
    トリガ:
    表に増加して、ストアドプロシージャを自動的に変更又は削除操作時に実行される
    ビジネス・ルールを適用するために、より複雑な制約のチェック制約よりも定義することが可能
    で実行されるトリガ・イベントによって
    トリガ3つのカテゴリに分類される:
    INSERTトリガー:トリガーときにテーブルに挿入するデータ
    更新トリガ:列は、複数行のトリガがテーブル更新
    テーブル内のレコードを削除するときトリガー:トリガーを削除を
    挿入、削除テーブルを
    することによってあなたが直接その変更することはできませんので、メモリ内にはなく、データベースに格納されているシステム管理、
    テーブルのデータ行の情報を変更するための一時的な記憶を
    トリガが完了したときには、彼らはまた、削除されます
    SQL Serverクエリの最適化とトランザクション処理で

トリガーの役割はにある:制約を強化し、トラックの変更、実行カスケード
トリガーの構文を作成することです:

create trigger *triggername(触发器名)*
on *tablename(表名)*
[with encryption]
for {[delete,insert,update]}
as SQL 语句

例:表の管理者にデータを変更禁止、トリガーを作成

create  trigger  reminder
on  admin
for  update
as
print  '禁止修改,请联系DBA'
rollback  transaction
go

そして、エラーメッセージを参照するには文を実行します。

update Admin set  LoginPwd='123'  where  LoginId='benet'
select  *  from  Admin

SQL Serverクエリの最適化とトランザクション処理で
事務(一般に、転送など、この点で銀行取引に使用される)
作業の不可分の論理単位で
実行するかまたは実行しないコマンドのセット
作業の単一の論理ユニットとして実行されるトランザクションの一連の動作を、論理ユニットなければなりません:それは4つのプロパティを持つ原子性、一貫性、独立性、耐久性、一般に呼ばれるこれらのプロパティACIDを
例えば、どちら転送する
:最初のテーブルという名前のバンクを作成し、
SQL Serverクエリの最適化とトランザクション処理で
チェック制約のためCurrentmoney列を:
SQL Serverクエリの最適化とトランザクション処理で
二つのデータを挿入します。

INSERT INTO bank(customerName,currentMoney) VALUES('张三',1000)
INSERT INTO bank(customerName,currentMoney) VALUES('李四',1)

そして、コードのトランザクションの実行を入力します。

select customername,currentmoney as 转帐事务前的余额 from bank    --查看转账事务前的余额
go
begin transaction     -- 开始事务(指定事务从此开始,后续的T-SQL语句是一个整体)
declare @errorsum int   --定义变量,用于累计事务执行过程中的错误 
set @errorsum=0    --初始化为0,即无错误
update bank set currentmoney=currentmoney-1000  --转账,张三账户少1000 李四账户多1000 
where customername='张三'
set @errorsum=@errorsum+@@ERROR    --累计是否有错误
update bank set currentmoney=currentmoney+1000
where customername='李四'
set @errorsum=@errorsum+@@ERROR   --累计是否有错误
select customername,currentmoney as 转帐事务过程中的余额 from bank    --查看那转账过程中的余额
if @errorsum<>0  --如果有错误
begin 
print '交易失败,回滚事务'
rollback transaction 
end
else 
begin 
print '交易成功,提交事务,写入硬盘,永久的保存'
commit transaction 
end
go
select customername,currentmoney as 转帐事务后的余额 from bank   --查看转账后的余额

転送に失敗しました:
SQL Serverクエリの最適化とトランザクション処理で
成功を転送:
SQL Serverクエリの最適化とトランザクション処理で
ロック
複数のユーザーが同時に同じデータベース内のデータを操作することができ、データの不整合が発生する可能性があり、ロックは、マルチユーザー環境でデータの整合性と一貫性を確保できるようにすることです
三つのモードのロックを:
共有します(Sロック)をロック:読み取りリソースロックを適用しました。
排他ロック(Xロック)と他のロックは、他の排他ロックを含む、互換性がありません。
更新ロック(Uロック):U Sラッチロックとは、更新データのXロックに関連して見ることができます。
ビューロック:
使用sys.dm_tran_locks動的管理ビュー
情報ロックキャプチャするためにプロファイラを使用して
デッドロック
デッドロックは、本体が発生するリソースの競合が複数で構成され、基本的に膠着状態です。
デッドロック状態が形成されている:
1、相互に排他的な条件:リソースは、排他体である
2、要求待ち状態
3、剥奪しない
4、ループ待機状態の
デッドロック防止:
破壊排他条件
破壊要求待ち状態の
破壊ない剥奪

おすすめ

転載: blog.51cto.com/14227204/2416342