當前位置:首頁 » 編程語言 » sql臨時表性能
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql臨時表性能

發布時間: 2023-05-14 09:22:56

sql Server 表變數和臨時表的區別

臨時表、表變數的比較
1、臨時表
臨時表包括:以#開頭的局部臨時表,以##開廳冊逗頭的全局臨時表。
a、存儲
不管是扮賣局部臨時表,還是全局臨時表,都會放存放在tempdb資料庫中。
b、作用域
局部臨時表:對當前連接有效,只在創建它的存儲過度、批處理、動態語句中有效,類似於C語言中局部變數的作用域。
全局臨時表:在所有連接對它都結束引用時,會被刪除,對創建者來說,斷開連接就是結束引用;對非創建者,不再引用就是結束引用。
但最好在用完後,就通過drop table 語句刪除,及時釋放資源。
c、特性
與普通的表一樣,能定義約束,能創建索引,最關鍵的是有數據分布的統計信息,這樣有利於優化器做出正確的執行計劃,但同時它的開銷和普通的表一樣,一般適合數據量較大的情況。
有一個非常方便的select ... into 的用法,這也是一個特點。

2、表變數
a、存儲
表變數存放在tempdb資料庫中。
b、作用域
和普通的變數一樣,在定義表變數的存儲過程、批處理、動態語句、函數結束時,會自動清除。
c、特性
可以有主鍵,但不能直接創建索引,也沒有任何數據的統計信息。表姿鋒變數適合數據量相對較小的情況。
必須要注意的是,表變數不受事務的約束,

㈡ sqlserver中臨時表有什麼用

可以存段尺宴放一個臨時的結果集
比如某個復雜查詢【也可能不復雜 ,多表join 子查詢 多條件,多case等】被頻繁的執行來獲取某個結果集
這個結果集就困薯可以放一個臨時表,省的反復執行該復雜查詢浪握銀費時間

㈢ SQL Server 表變數和臨時表的區別

臨時表 vs. 表變數
1.存儲位置:臨時表是利用了硬碟(tempdb資料庫) ,表名變數是佔用內存,因此小數據量當然是內存中的表變數更快。當大數據量時,就不能用表變數了,太耗內存了。大數據量時適模喚雀合用臨時表。
2.性能:不能一概而論,表變數存儲數據有個性能臨界點,在這個臨界點鏈宏之內,表變數比臨時錶快,旦早表變數是存儲在內存中的。
3.索引:表變數不支持索引和統計數據,但可以有主鍵;臨時表則可以支持索引和統計數據。
參考:http://www.cnblogs.com/freshman0216/archive/2010/11/14/1868672.html

㈣ sql server中的臨時表與普通表有什麼區別

作用域不同,當你關閉sql連接的時候 臨時表就會 自動刪除,普通表不會
1、創建方法:
方法一:
create table TempTableName

select [欄位1,欄位2,...,] into TempTableName from table
方法二:
create table tempdb.MyTempTable(Tid int)
說明:
(1)、臨時表其實是放在資料庫tempdb里的一個用戶表;
(2)、TempTableName必須帶「#」,「#"可以是一個或者兩個,以#(局部)或##(全局)開頭的表,這種表在會話期間存在,會話結束則自動刪除;
(3)、如果創建時不以#或##開頭,而用tempdb.TempTable來命名它,則該表可在資料庫重啟前一直存在。
2、手動刪除
drop table TempTableName

普通表和臨時表的區別只是表名開頭無 "#"

㈤ mysql 參數調優(10)之 tmp_table_size 優化臨時表

https://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html

tmp_table_size默認16M。tmp_table_size如果困段慎過小,存不下了就會存到磁碟上。對於group by會有性能影響。

下面的sql EXPLAIN 如下,出現了Using temporary。表示查詢會利用臨時表。

在默認tmp_table_size大小16M下執行:

查看臨時表統計信息,Created_tmp_disk_tables 為0,Created_tmp_tables 為1表示上訴sql執行後生產了一張內存里的臨時表。

將tmp_table_size 調從16M調整為16K

再次執行,查詢時間從4變成了18秒

重新統計

再次查看status,這次有在燃衡磁碟上創建1個臨時表。

設汪敬置為32M

Percona Server中的臨時表信息會記錄到慢查詢日誌
由於MySQL慢查詢日誌里沒有使用臨時表的信息,這就給我們診斷性能問題帶來了一些不便,第三方的版本如Percona Server,在慢查詢里可以有更詳細的信息,將會記錄臨時表使用的情況,從而有助於我們診斷和調優。

mysql8中對臨時表有較大的優化
臨時表引擎使用innodb(default 磁碟)和temptable(default 內存)

㈥ sql server 存儲過程 臨時表 越來越慢

1、盡量優化語句,盡量少姿檔用游標。
2、修改較為常用的表要注意,最好先在臨時表中作好運算和其它處理跡伍亂,最後在修改這橘橋些表,以免較慢的存儲過程長時間鎖定表記錄,影響數據正常使用。
3、將連接超時和命令超時適當擴大,以免超時錯誤。

㈦ sql server中的臨時表與普通表有什麼區別

臨時表分為:

本地臨時表,僅限於當前訪問者訪問,創建方法去如下:
create table #TableName(表結構)
儲存於資料庫tempdb內(硬碟),當前用戶斷開連接,自動刪除
如果使用中不斷開連接,且不需要該臨時表請執行:drop table #TableName

全局臨時表,所有訪問用戶訪問,創建方法去如下:
create table ##TableName(表結構)
儲存於資料庫tempdb內,當所有訪問用戶斷開連接,自動刪除
刪除語句:drop table ##TableName

㈧ 如何進行SQL性能優化

這里分享下mysql優化的幾種方法。

1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。

㈨ sql 如何用臨時表優化性能

InnoDB 類型的臨時表存在的潛在問題

盡管使用 InnoDB 是性能最佳的,但可能會出現新的潛在問題。在某些特定情況下,您可能會出現磁碟耗盡和伺服器中斷。

與資料庫中的任何其他 InnoDB 表一樣,臨時表具有自己的表空間文件。新文件與通用表空間一起位於數據目錄中,名稱為 ibtmp1。它存儲所有 tmp 表。不運行手動運行 OPTIMIZE TABLE,表空間文件就會不斷增長。如果你不能使用 OPTIMIZE,那麼唯一能將 ibtmp1 大小縮小為零的方法,就是重新啟動伺服器。幸運的是,即使文件無法減小,在執行查詢後,臨時表也會自動刪除,表空間可回收使用。現在,我們想一想以下情境:

  • 存在未優化的查詢,需要在磁碟上創建非常大的的臨時表

  • 存在優化的查詢,但他們正在磁碟上創建非常大的臨時表,因為你正在對此數據集進行計算(統計,分析)

  • 高並發連接時,運行相同的查詢,伴隨臨時表的創建

  • 沒有很多可用空間

  • 在這些情況下,文件 ibtmp1 大大增加,很容易耗盡可用空間。這種情況每天發生幾次,並且必須重啟伺服器才能完全縮小 ibtmp1 表空間。使用不可收縮的文件可以輕松耗盡磁碟空間!
  • 那麼,如何避免磁碟耗盡和中斷呢?


    簡單的解決方案:使用更大的磁碟

  • 雖然可以暫時解決問題,但這不是最佳解決方案。實際上,您可以通過逐步增加磁碟大小,來猜測具體需要的空間。如果環境位於雲中,或者在非常大的虛擬平台,這很容易實現。但是使用這種解決方案,您可能會面臨不必要的開支。您還可以通過設置以下配置變數將 ibtmp1 文件移動到專用大型磁碟上: [mysqld] innodb_temp_data_file_path = ../../tmp/ibtmp1:12M:autoextend

  • 需要重啟 MySQL 。注意,必須將路徑指定為相對於數據目錄。

    設置 ibtmp1 大小的上限

  • 例如: [mysqld] innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:10G

  • 在這種情況下,文件不能超過 10GB。可以降低宕機概率,但也是一個危險的解決方案。當數據文件達到最大值時,會查詢失敗並顯示一個錯誤,提示表已滿。


  • 退回 MyISAM 將臨時表存儲在磁碟上
  • 這個解決方案似乎違反直覺,但它可能是快速避免中斷的最佳方法,並保證使用所有需要的臨時表。

  • internal_tmp_disk_storage_engine = MYISAM

  • 由於變數是動態的,您也可以在運行時設置它: SET GLOBAL internal_tmp_disk_storage_engine = MYISAM;

  • 回到 MyISAM,您將大大降低寫滿磁碟空間的可能性。實際上,臨時表將創建到不同的文件中,並在查詢結束時立即刪除。
  • 雖然總是有可能看到相同的問題,以防你可以在同一時間運行查詢或非常接近。在我的實際案例中,這是避免所有中斷的解決方案。

    優化你的查詢

  • 在將存儲引擎退回到 MyISAM 以減輕中斷發生後,必須花時間分析查詢。目標是減小磁碟上臨時表的大小。本文的目的不是解釋如何調查查詢,而是可以依賴慢速日誌,像 pt-query-digest 和 EXPLAIN 這樣的工具。一些技巧:
  • 在表上創建缺少的索引

  • 如果不需要,可以在查詢中添加更多過濾條件以更少收集的數據

  • 重寫查詢以優化執行計劃

  • 可以在應用程序中使用隊列管理器來序列化它們的執行或減少並發性

  • 但希望在所有優化之後,您可以返回將臨時存儲引擎設置為 InnoDB 以獲得更好的性能。

    結論

    有時這些改進會產生意想不到的副作用。用於磁碟上臨時表的 InnoDB 存儲引擎是一個很好的改進,但在某些特定情況下,例如,如果您有未優化查詢和很少的可用空間,則可能因「磁碟已滿」錯誤而中斷。將 tmp 存儲引擎退回到 MyISAM 是避免中斷的最快方法,但是為了返回到 InnoDB,查詢的優化是更重要的事情。更大或專用的磁碟也可能有所幫助。但這是一個微不足道的建議。

㈩ sql臨時表多大時會影響性能

sql臨時表為20G時會影響性能。根據查詢相關公開信息顯示,臨時表會和普通文件一樣占據一定內存,影響系統工作效率,臨時表是建立在系統臨時文件夾中的表,使用得當,可以像普通表一樣進行各種操作,在退出時自動被釋放。