SQLサーバーの一時テーブル

一時テーブルの定義

	SQL Server临时表是临时对象的一种,临时对象是以#或者##为前缀的,
诸如临时存储过程、临时函数等都是临时对象,临时对象都存储在tempdb数据库中。
当我们关闭数据库时,临时表会自动删除。

一時的なテーブル分類

	临时表分为本地临时表和全局临时表,它们在名称、可见性以及可用性上有区别。
以一个#号为前缀的临时表是本地的,只有当前用户会话才可以访问,以两个#号
也就是##为前缀的临时表是全局的。

一時テーブルの特徴

	本地临时表就是用户在创建表的时候添加了"#"前缀的表,其特点是根据数据库
连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问
该表;不同的数据库连接中,创建的本地临时表虽然"名字"相同,但是这些表之间
相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证本地临时表在数
据库连接上的独立性,意思是你可以在不同的连接里使用相同的本地临时表名称。
	全局临时表是用户在创建表的时候添加"##"前缀的表,其特点是所以数据库连接
均可使用该全局临时表,当所有引用该临时表的数据库连接断开后自动删除。
	全局临时表相比本地临时表,命名上就需要注意了,与本地临时表不同的是,全
局临时表名不能重复。
	临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了物理
表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此
也提高了系统效率。临时表在事务完毕或会话完毕数据库会自动清空,不必记得用完
后删除数据。

ローカル一時テーブルローカル一時テーブル
の名前は、単一の数字記号「#」で始まります。現在のユーザー接続(つまり、ローカル一時テーブルを作成した接続)にのみ表示されます。ユーザーがSQLServerインスタンスから切断すると削除されます。 。
ここでは、例としてCustomersテーブルを取る、次のようにテーブルのデータは次のとおりです。
ここに写真の説明を挿入
私たちは、新しい接続を作成する「新しいクエリ」は、接続が開かれて表したびに、接続IDは、SAの後数であり、私たちの接続IDが57である。
ここに写真の説明を挿入
我々はここでクエリページは一時テーブルを作成します。

SELECT * INTO #Customers FROM Customers

一時テーブルを作成したので、一時テーブル#Customersのデータをクエリできます。顧客のコンテンツと一致している。
ここに写真の説明を挿入
別のページを開いて、#Customersテーブルもクエリするとどうなりますか?
ここに写真の説明を挿入
新しく開いたクエリページで上記のクエリステートメントを実行すると、結果は次のようになります。これ
ここに写真の説明を挿入
は、ローカル一時テーブルが相互接続クエリをサポートしていないことを意味します。現在の接続(または現在のクエリページ)でのみアクセスできます。
ローカル一時テーブルはどこにありますか?どのように保存されますか?
ここに写真の説明を挿入
これは先ほど作成した一時テーブルであり、システムでは#Cusomtersで表されていません。

グローバル一時テーブルグローバル一時テーブル
の名前は、2つの数字記号「##」で始まります。作成後、すべてのデータベース接続に表示されます。テーブルを参照するすべてのデータベース接続がSQL Serverから切断されると、それらは削除されます。
グローバル一時テーブルの例
上記の手順に従いましょう。
最初にクエリページを開き、次のクエリステートメントを入力します。

SELECT * INTO ##Customers FROM Customers

上記のクエリステートメントを実行した後、クエリページを閉じてページを再度開き、## Customersのコンテンツをクエリします。

SELECT * FROM ##Customers

結果は次のとおりです。
ここに写真の説明を挿入
現時点では、ローカル一時テーブルのようなエラーは報告されません。
グローバル一時テーブルの場所は次のとおりです。
ここに写真の説明を挿入
その名前はカスタマイズされた名前と一致しており、システムは追加情報を追加しません。

一時テーブルの使用

一時テーブルを紹介した後、それを使用して最適化する方法について説明しましょう

一時テーブルの最適化は、ネストされたクエリとも呼ばれるサブクエリが多数ある場合に一般的に使用されます。次のサブクエリを記述します。

SELECT * FROM sales.Temp_Salesorder
WHERE SalesOrderDetailID IN 
(SELECT SalesOrderDetailID FROM sales.SalesOrderDetail
WHERE UnitPrice IN
(SELECT UnitPrice FROM sales.SalesOrderDetail WHERE UnitPrice>0)
)

これは比較的単純な2レベルのネストされたサブクエリです。実行を見てみましょう。
ここに写真の説明を挿入
ここでの論理読み取りは比較的高いことがわかります。

一時テーブルを使用して実行状況を再確認します。第1レベルと第2レベルのクエリ結果を#tempに挿入してから、一時テーブルから結果をクエリします。

SELECT SalesOrderDetailID INTO #temp FROM sales.SalesOrderDetail
WHERE UnitPrice IN (SELECT UnitPrice FROM sales.SalesOrderDetail WHERE UnitPrice>0)

SELECT * FROM sales.Temp_Salesorder
WHERE SalesOrderDetailID IN 
(SELECT SalesOrderDetailID FROM #temp)

実装は次のとおりです。
ここに写真の説明を挿入ここに写真の説明を挿入
最後の論理読み取りと比較して、論理読み取りの数は2倍になります。クエリのパフォーマンスを調整するときに、論理読み取り値が低下すると、クエリで使用されるサーバーリソースが減少し、クエリのパフォーマンスが向上したことを示します。論理読み取り値が増加した場合は、調整手段によってクエリのパフォーマンスが低下したことを意味します。他の条件を変更せずに、クエリが使用する論理読み取りが少ないほど、効率が高くなり、クエリ速度が速くなります。

したがって、一時テーブルを使用すると、より複雑なネストされたクエリのクエリ効率が向上することがわかります。

注釈付きの
一時テーブルは、SQL Serverまたは他のプラットフォームで使用されます。クエリの最適化におけるクエリの効率を大幅に向上させることができます。SQLServerプラットフォームの一時テーブルは、他のプラットフォームよりも作成と使用が簡単であり、その優位性は言うまでもありません。ゆう。したがって、作業中または勉強中の場合は、必要なスキルとして一時テーブルを頻繁に使用できます。

おすすめ

転載: blog.csdn.net/Y_6155/article/details/105843242