mysql表变量临时表_sql server 临时表详细讲解及简单示例
一.概述
在sql server里臨時(shí)表存儲(chǔ)在TempDB庫中,TempDB是一個(gè)系統(tǒng)數(shù)據(jù)庫,它只有Simple恢復(fù)模式,也是最小日志記錄操作。主要用于存放局部臨時(shí)表,全局臨時(shí)表,表變量,都是基于臨時(shí)特征,每次服務(wù)器或服務(wù)重啟后,都會(huì)按照Model庫的配置重新創(chuàng)建TempDB庫。在sql server 2012中TempDB表可以配置在故障轉(zhuǎn)移中。在TempDB庫中存放三類對(duì)象包括:用戶對(duì)象, 內(nèi)部對(duì)象, 行版本存儲(chǔ)。TempDB庫只有一個(gè)文件組,就是primary文件組,增加其它文件組會(huì)提示報(bào)錯(cuò)。在權(quán)限方面,所有用戶默認(rèn)都具有訪問TempDB庫權(quán)限。
1.1 Tempdb 的物理屬性
下表列出了?tempdb?數(shù)據(jù)和日志文件的初始配置值。?對(duì)于不同版本的?SQL Server,這些文件的大小可能略有不同。
文件
邏輯名稱
物理名稱
文件增長
主數(shù)據(jù)
tempdev
tempdb.mdf
按 10% 自動(dòng)增長,直到磁盤已滿
日志
templog
templog.ldf
以 10% 的速度自動(dòng)增長到最大 2 TB
1.2 使用Tempdb的作用
(1) 通過tempdb庫可以緩存臨時(shí)表和表變量,用于減少數(shù)據(jù)表的查詢次數(shù)以及鎖問題。緩存允許刪除和創(chuàng)建臨時(shí)對(duì)象的操作能快速地執(zhí)行,并減少頁分配的爭用問題。
(2) 分配頁閂鎖協(xié)議得到改善。?從而減少使用的 UP(更新)閂鎖數(shù)。
(3) 減少了?tempdb?的日志開銷。?從而減少了?tempdb?日志文件上的磁盤 I/O 帶寬消耗。
(4) 分配混合的頁中的算法tempdb得到了改進(jìn)。
1.3 使用tempdb的限制, 不能對(duì)?tempdb?數(shù)據(jù)庫執(zhí)行以下操作:
(1)添加文件組。
(2)備份或還原數(shù)據(jù)庫。
(3)更改排序規(guī)則。 默認(rèn)排序規(guī)則為服務(wù)器排序規(guī)則。
(4)更改數(shù)據(jù)庫所有者。 tempdb 的所有者是 sa。
(5)創(chuàng)建數(shù)據(jù)庫快照。
(6)刪除數(shù)據(jù)庫。
(7)從數(shù)據(jù)庫中刪除 guest 用戶。
(8)啟用變更數(shù)據(jù)捕獲。
(9)參與數(shù)據(jù)庫鏡像。
(10)刪除主文件組、主數(shù)據(jù)文件或日志文件。
(11)重命名數(shù)據(jù)庫或主文件組。
(12)運(yùn)行 DBCC CHECKALLOC。
(13)運(yùn)行 DBCC CHECKCATALOG。
(14)將數(shù)據(jù)庫設(shè)置為 OFFLINE。
二. TempDB存儲(chǔ)的三類對(duì)象
在SQL 2005以后,引入了一張新的管理視圖:sys.dm_db_file_space_usage。通過查詢這張視圖,能了解tempdb的空間使用情況,能知道tempdb的空間是被哪一塊對(duì)象使用掉的,是用戶對(duì)象(user_object_reserved_page_count字段),還是系統(tǒng)對(duì)象(internal_object_reserved_page_count字段),還是版本存儲(chǔ)區(qū)(version_store_reserved_page_count字段。在了解這個(gè)dmv視圖之前,先了解tempdb庫的三類對(duì)象。
2.1 用戶臨時(shí)對(duì)象(user_object_reserved_page_count)
由用戶會(huì)話顯示創(chuàng)建的對(duì)象,可以在系統(tǒng)表目錄中找到,用戶臨時(shí)對(duì)象主要包括以下內(nèi)容:
(a) 創(chuàng)建臨時(shí)表和索引,不過這些表在重啟后清空。
(b) 全局臨時(shí)表以 ##開頭的表。適用于所有會(huì)話操作該表信息。需要顯示的刪除或重啟服務(wù)才能清除表。
(c) 局部臨時(shí)表以 #開頭的表。適用于當(dāng)前會(huì)話操作該表信息。會(huì)話結(jié)束清除表。
(d) 表變量, 以@開頭。
下面是簡單示例,演示局部臨時(shí)表,臨時(shí)表索引,全局臨時(shí)表,表變量,腳本如下:
--創(chuàng)建局部臨時(shí)表
CREATE TABLE #TempTable(id INT,NAME VARCHAR(10))--根據(jù)已有表,創(chuàng)建臨時(shí)表
SELECT * INTO #TempTable2 FROMtablename--創(chuàng)建局部臨時(shí)表, 帶有聚集索引
CREATE TABLE #tempWithCLUSTERED([SID] INT PRIMARY KEY CLUSTERED, model VARCHAR(50))--創(chuàng)建全局臨時(shí)表
CREATE TABLE ##TempTable3(id INT,NAME VARCHAR(10))--根據(jù)已有表創(chuàng)建全局臨時(shí)表
SELECT * INTO ##TempTable4 FROMdbo.ACT_AnswerTab--刪除全局臨時(shí)表
DROP TABLE##TempTable4--創(chuàng)建表變量
DECLARE @tablevar TABLE (id int,NAME varchar(10))
下面簡單介紹一下,臨時(shí)對(duì)象中表變量與臨時(shí)表區(qū)別
(1)統(tǒng)計(jì)信息
表變量沒有統(tǒng)計(jì)信息,統(tǒng)計(jì)信息要么為0,要么為1。sql server查詢優(yōu)化器只會(huì)把表變量當(dāng)作里面只有1條數(shù)據(jù)或沒有數(shù)據(jù)的表對(duì)待,腳本演示如下所示:
--創(chuàng)建表變量示例
DECLARE @tablevar TABLE (id int,NAME varchar(10))INSERT INTO @tablevar(id,name)SELECT TOP 1000 ROW_NUMBER() OVER(ORDER BY number ) AS id, number FROMmaster..spt_valuesSELECT * FROM @tablevar
(2) 索引
表變量使用索引,只能是主鍵(可以是聚集和非聚集索引)或者唯一約束,需要預(yù)先定義好,定義后不能再添加索引了,注意:即使是有索引,也沒有統(tǒng)計(jì)信息。表變量使用聚集索引如下所示:
DECLARE @tablevar TABLE (id INT PRIMARY KEY CLUSTERED,NAME varchar(10))INSERT INTO @tablevar(id,name)SELECT TOP 1000 ROW_NUMBER() OVER(ORDER BY number ) AS id, number FROMmaster..spt_valuesSELECT * FROM @tablevar WHERE id=1
(3) 架構(gòu)修改
架構(gòu)修改可以出現(xiàn)在臨時(shí)表上,但不會(huì)出現(xiàn)在表變量上面,修改會(huì)產(chǎn)生重編譯,非預(yù)期的重編譯不是好事。下面是臨時(shí)表架構(gòu)修改,將name字段長改為50, 腳本如下:
ALTER TABLE #TempTable ALTER COLUMN name NVARCHAR (50) NULL
USEtempdbgosp_help #TempTable
(4) 對(duì)比表格
特征
臨時(shí)表
變量表
命名
以#開頭
以@開頭
統(tǒng)計(jì)信息
有
無
索引
有
僅約束可用
架構(gòu)修改
允許
不允許
在sp_executesql中使用
可以
不可以
使用insert into xxx exec
可以
不可以
存在于內(nèi)存中
否
否
總結(jié): 建議:小于100行使用表變量。數(shù)據(jù)都不是存入于內(nèi)存中,而是存放在TempDB表中,通過sys.dm_db_session_space_usage這個(gè)dmv可查看空間占用情況。后面監(jiān)控時(shí)再說這dmv。
2.2 內(nèi)部對(duì)象(internal_object_reserved_page_count)
內(nèi)部對(duì)象是根據(jù)需要 由?SQL Server?數(shù)據(jù)庫引擎創(chuàng)建的,用于處理?SQL Server?語句。主要是查詢過程中存儲(chǔ)臨時(shí)數(shù)據(jù)的對(duì)象,這些臨時(shí)數(shù)據(jù)的對(duì)象可以在語句的作用域中自動(dòng)創(chuàng)建和刪除。?內(nèi)部對(duì)象主要包括以下內(nèi)容:
(a) 游標(biāo)
(b) 哈希(Hash)聯(lián)接或哈希聚合操作的查詢
(c) 某些?GROUP BY、ORDER BY?或?UNION?查詢的中間排序結(jié)果.
在內(nèi)部對(duì)象中比較常見的是Worktable, 這個(gè)臨時(shí)表是自動(dòng)生成,自動(dòng)銷毀,主要用于游標(biāo),假脫機(jī),臨時(shí)大對(duì)象的數(shù)據(jù)類型(LOB)存儲(chǔ),這個(gè)內(nèi)部臨時(shí)表用于返回查詢的中間結(jié)果,監(jiān)視分析Worktable可以通過打開statistics io 選項(xiàng),執(zhí)行sql語句再查看,要注意的是:高效的查詢下很少出現(xiàn)這種現(xiàn)象。
2.3 版本存儲(chǔ)(version_store_reserved_page_count)
版本存儲(chǔ)區(qū)主要用來支持Snapshot事務(wù)隔離級(jí)別,以及SQL 2005以后推出的一些其他提高數(shù)據(jù)庫并發(fā)度的新功能。這類并發(fā)模式會(huì)借用TempDB來存放修改前的版本數(shù)據(jù),第一行數(shù)據(jù)被修改前,都會(huì)在TempDB中創(chuàng)建一個(gè)相同的行,并加上14bytes的長度,包含: (1)修改前的事務(wù)序列號(hào)(XSN)長度為6 bytes (2) TempDB的行標(biāo)識(shí)符(RID)長度為8bytes。版本存儲(chǔ)用于存儲(chǔ)行版本、MARS、聯(lián)機(jī)索引、觸發(fā)器、基于快照的隔離級(jí)別。如果開啟了樂觀并發(fā)模式(已提交讀快照和快照二種隔離級(jí)別),可能造成Tempdb庫的非預(yù)期增長, 需要對(duì)Tempdb庫進(jìn)行監(jiān)控。
總結(jié)
以上是生活随笔為你收集整理的mysql表变量临时表_sql server 临时表详细讲解及简单示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 错误码设计_JAVA端的错误码
- 下一篇: druid不能close mysql连接