1. 程式人生 > >臨時表和表變數區別,SQL Server裡的檢視和臨時表在哪裡?

臨時表和表變數區別,SQL Server裡的檢視和臨時表在哪裡?

臨時表與永久表相似,但臨時表儲存在 tempdb 中,當不再使用時會自動刪除。

臨時表有兩種型別:本地和全域性。它們在名稱、可見性以及可用性上有區別。本地臨時表的名稱以單個數字元號 (#) 打頭;它們僅對當前的使用者連線是可見的;當用戶從 SQL Server 例項斷開連線時被刪除。全域性臨時表的名稱以兩個數字符號 (##) 打頭,建立後對任何使用者都是可見的,當所有引用該表的使用者從 SQL Server 斷開連線時被刪除。

例如,如果建立了 employees 表,則任何在資料庫中有使用該表的安全許可權的使用者都可以使用該表,除非已將其刪除。如果資料庫會話建立了本地臨時表 #employees,則僅會話可以使用該表,會話斷開連線後就將該表刪除。如果建立了 ##employees 全域性臨時表,則資料庫中的任何使用者均可使用該表。如果該表在您建立後沒有其他使用者使用,則當您斷開連線時該表刪除。如果您建立該表後另一個使用者在使用該 表,則 SQL Server 將在您斷開連線並且所有其他會話不再使用該表時將其刪除。

臨時表

臨時表儲存在TempDB資料庫中,所有的使用此SQL Server 例項的使用者都共享這個TempDB,因為我們應該確保用來儲存TempDB資料庫的硬碟有足夠的空間,以使之能夠自己的增長.最好能夠儲存在一個擁有獨立 硬碟控制器上.因為這樣不存在和其它的硬碟I/O進行爭用.  

我們很多程式設計師認為臨時表非常危險,因為臨時表有可能被多個連線所共享.其實在SQL Server中存在兩種臨時表:區域性臨時表和全域性臨時表,區域性臨時表(Local temp table)以#字首來標識,並且只能被建立它的連線所使用.全域性臨時表(Global temp table)以##字首來進行標識,並且可以和其它連線所共享.

區域性臨時表

區域性臨時表不能夠被其它連線所共享的原因其實是在SQL Server 2000中自動為區域性臨時表的表名後面加上了一個唯一字元來標識.如:

      CREATE TABLE [#DimCustomer_test]

      (

         [CustomerKey] [int]

         ,    [FirstName] [nvarchar](50)  

     ,[MiddleName] [nvarchar](50)  

     ,[LastName] [nvarchar](50)

         )

現在我們來檢視一下TempDB中 sysobjects表,我們會發現我們新建立的臨時表#DimCustomer_test已經被加上了字尾:

  USE TempDB

   GO

   SELECT name FROM sysobjects WHERE name LIKE ’%DimCustomer%’

the Result is:

name

#DimCustomer_test___________________________________________________________________________________________________000000000005

全域性臨時表

下面我們來看一下全域性臨時表:

      CREATE TABLE [##DimCustomer_test]

      (

         [CustomerKey] [int]

         ,       [FirstName] [nvarchar](50)  

     ,[MiddleName] [nvarchar](50)  

     ,[LastName] [nvarchar](50)

         )

現在我們來檢視一下TempDB中 sysobjects表,我們會發現我們新建立的臨時表##DimCustomer_test沒有被加上了字尾:

  USE TempDB

   GO

   SELECT name FROM sysobjects WHERE name LIKE ’%DimCustomer%’

The Result are:

#DimCustomer_test___________________________________________________________________________________________________000000000005

##DimCustomer_test

--Drop test temp tables

                               DROP TABLE [##DimCustomer_test]

                               DROP TABLE [#DimCustomer_test]

可以看到我們剛才建立的全域性臨時表名字並沒有被加上標識.

表變數

表變數和臨時錶針對我們使用人員來說並沒有什麼不同,但是在儲存方面來說,他們是不同的,表變數儲存在記憶體中.所以在效能上和臨時表相比會更好些!

另一個不同的地方是在表連線中使用表變數時,要為此表變數指定別名.如:

  USE AdventureWorksDW

   GO

   DECLARE @DimCustomer_test TABLE

   (

      [CustomerKey] [int]

      ,       [FirstName] [nvarchar](50)  

,[MiddleName] [nvarchar](50)  

,[LastName] [nvarchar](50)

      )

   ---insert data to @DimCustomer_test

   INSERT @DimCustomer_test

   (

      [CustomerKey]  

      ,       [FirstName]  

,[MiddleName]  

,[LastName]

      )

   SELECT  

      [CustomerKey]  

      ,       [FirstName]  

,[MiddleName]  

,[LastName]

   FROM DimCustomer

   SELECT [@DimCustomer_test].CustomerKey,SUM(FactInternetSales.OrderQuantity)

FROM @DimCustomer_test   INNER JOIN FactInternetSales    ON

@DimCustomer_test.CustomerKey = FactInternetSales.CustomerKey

Group BY CustomerKey

Result:

Server: Msg 137, Level 15, State 2, Line 32

如果我們對上面的查詢進行更改,對查詢使用別名(並且找開IO):

-----in the follow script,we used the table alias.

DECLARE @DimCustomer_test TABLE

(

     [CustomerKey] [int]

     ,       [FirstName] [nvarchar](50)  

,[MiddleName] [nvarchar](50)  

,[LastName] [nvarchar](50)

     )

INSERT @DimCustomer_test

(

     [CustomerKey]  

     ,       [FirstName]  

,[MiddleName]  

,[LastName]

     )

SELECT  

     [CustomerKey]  

     ,       [FirstName]  

,[MiddleName]  

,[LastName]

FROM DimCustomer

SELECT t.CustomerKey,f.OrderQuantity

FROM @DimCustomer_test t INNER JOIN FactInternetSales   f ON

t.CustomerKey = f.CustomerKey

where t.CustomerKey=13513

表變數在批處理結束時自動被系統刪除,所以你不必要像使用臨時表表一樣顯示的對它進行刪除.
表變數主要開銷系統的記憶體,而臨時表則使用tempdb。對於小資料量的中間資料儲存,可以使用表變數,而當需要臨時儲存的資料量很龐大時,建議使用臨時表。具體使用表變數還是臨時表,可以根據系統的執行狀況來調整。

====================================================

例如,如果建立名為   employees   的表,則任何人只要在資料庫中有使用該表的安全許可權就可以使用該表,除非它已刪除。如果建立名為   #employees   的本地臨時表,只有您能對該表執行操作且在斷開連線時該表刪除。如果建立名為   ##employees   的全域性臨時表,資料表中的任何使用者均可對該表執行操作。如果該表在您建立後沒有其他使用者使用,則當您斷開連線時該表刪除。如果該表在您建立後有其他使用者使 用,則   SQL   Server在所有使用者斷開連線後刪除該表。

=====================================================

非索引檢視只是一個定義, 不儲存資料, 查詢的時候才從基礎表拿資料

索引檢視會儲存資料

索引檢視和臨時表的資料都儲存在硬碟

其中索引檢視的資料儲存在檢視所在的資料庫檔案中

臨時表的資料儲存在tempdb這個資料庫檔案中

相關推薦

臨時變數區別SQL Server檢視臨時哪裡

臨時表與永久表相似,但臨時表儲存在 tempdb 中,當不再使用時會自動刪除。 臨時表有兩種型別:本地和全域性。它們在名稱、可見性以及可用性上有區別。本地臨時表的名稱以單個數字元號 (#) 打頭;它們僅對當前的使用者連線是可見的;當用戶從 SQL Server 例項斷開連

sql servermy sql 命令(語句)的區別sql server與mysql的比較

  sql與mysql的比較 1、連線字串 sql  :Initial Catalog(database)=x;  --資料庫名稱       Data S

關於js中return false、event.preventDefault()event.stopPropagation()區別以及阻止事件冒泡阻止預設事件

在平時專案中,如果遇到需要阻止瀏覽器預設行為,大家經常會用return false;和event.preventDefault()來阻止,但對它倆的區別還是模糊,這裡順便帶上event.stopPropagation()一起區分下。 事件處理程式的返回值只對通過屬性註冊的處理程式才有意義,如果我

SQL Server檢視當前連線的線上使用者數

use master select loginame,count(0) from sysprocesses group by loginame order by count(0) desc select nt_username,count(0) from sysproce

連接時USINGON的區別USING會去掉重復列ON顯示重復列。

images alt logs 分享 多表 cnblogs log 連接 http 多表連接時USING和ON的區別,USING會去掉重復列,ON顯示重復列。

python下類物件例項物件區別變數例項變數區別

Y14 一、類物件和例項物件 簡短理論: 類物件是將具有相似屬性和方法的物件總結抽象為類物件,可以定義相似的一些屬性和方法,不同的例項物件去引用類物件的屬性和方法,能減少程式碼的重複率。 例項物件又稱例項化物件,不是抽象而是一類物件中具體的一例物件。 比

SQL Server 查詢樹結構的首節點尾節點案例

一.建立表 DECLARE @t Table(id CHAR(1),parentId CHAR(1)) INSERT INTO @t values('a','') INSERT INTO @t values('b','a') INSERT INTO @t values('c','b') INSE

好用的資料庫結構匯出工具,支援OracleMySQLSQL SERVER

好用的資料庫表結構匯出工具 之前遇到公司需要匯出表結構的word文件,在網上找了一大堆關於匯出資料庫表結構成word文件的工具,發現只有一款DBExportDoc,而且還需要操作巨集,而且還需要2003的word版本,所以我就自己搞了一個開源工具.(支援 Ora

詳講:C#快速匯出多個sheet到excel的兩種方法(CellRange方法) 解決了(匯入時外部不是預期的格式)

C# 匯出的表載入時報錯:外部表不是預期的格式。的解決方案 在網絡卡找了一些Excel匯出的方法,大部分能匯出,但時不能將匯出的Excel匯入。總是報:外部表不是預期的格式 找了好久終於找到了解決方案。 這是本人整理修改後的的可以實現匯出匯入的方法。供大家學習參考,方法就是用一個沒問題的

JPA中多對多關係的刪除操作如何只刪除一方中間的紀錄

資料庫中的表 使用者表: 角色表: 中間表: 需求:刪除t_user表中的user_id 為1的使用者,並刪除相關的中間表紀錄。 程式碼: @Test public void testRemove() {

阿里P8架構師談:NoSQLSQL區別NoSQL的使用場景選型比較

什麼是NoSQL NoSQL,指的是非關係型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱,它具有非關係型、分散式、不提供ACID的資料庫設計模式等特徵。 NoSQL用於超大規模資料的儲存。(例如谷歌或Facebook每天為他們的使用者

SQL SERVER 觸發器 inserteddeleted

在觸發器語句中用兩個特殊的表一個是deleted表和inserted。它們是通過觸發器操作自動建立駐留在記憶體中的臨時表。 Deleted表用於儲存 DELETE和 UPDATE語句所影響的行的複本。在執行DELETE或 UPDATE語句時,行從觸發器表中刪除,並傳輸到

sql server判斷是否存在sql server判斷欄位是否存在

sql server判斷表是否存在 select COUNT(*) from  dbo.sysobjects where name='t_sys_para'; sql server判斷欄位是否存在 s

SQL SERVER欄位添加註釋

-- 表加註釋 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'註釋內容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N

JavaScript中var let的區別四個概念變數提升作用域重複宣告暫時死區以及從生命週期去看它

前言 今天無意當中遇到了js中的變數宣告,發現除了var居然還有let宣告方法,比較新奇,特地記錄下來它們兩者的區別!絕對能讓你理解清楚,PS 後面有重頭戲 思路 主要從四個角度來講述它們的區別 變數提升 作用域 重複宣告 暫時死區 變數提

GETPOST請求中url中的引數form單中的引數怎麼區分

在和web前端開發過程中,經常會遇到使用form表單提交POST請求和GET請求。 一般GET請求格式如下: http://xxx../path?key1=value1&key2=value2 而POST請求的引數一般在請求體中。 但是有時會發現,web端提交的PO

SQL SERVER 拼字串方式 固定名 遊標變數範例

這裡一定注意這個地方,拼引數的時候,有單引號的問題: set @str='declare  mycursor  cursor  for  select  id,name  from  test where sex='''+@sex+''''  declare @col1

SQL SERVER 拼字串方式 動態名 遊標變數範例

儲存過程1: CREATE PROCEDURE [dbo].[pro_get_cursor]     @In_TableName nvarchar(200),    @Out_CurrencyCursor CURSOR VARYING OUTPUTAS    declare

C筆記A01 _tmain() main() 的區別

c++ 編譯器 tro ron 編譯速度 class 字符 nap har 最近開始用VS寫程序,創建了一個C++控制臺程序,發現和以前的裸機C還是有很大的區別 _tmain()是unicode版本的的main() _tmain這個符號多見於VC++創建的控制

任務目標的區別以及怎樣完成任務、實現目標

獲得 可能性 都是 一個 結合 意誌力 試驗 專家 www https://www.douban.com/note/524880185/?type=like 使用Todoist工作了一段時間,完成了一些工作,也造成了一些拖延。造成拖延的原因是,我實在是沒有辦法在設定的dea