翻譯|使用教程|編輯:楊鵬連|2020-12-23 11:51:49.840|閱讀 452 次
概述:SELECT…INTO是開發工作特別是創建臨時表的有用捷徑。但是,它不再具有明顯的性能優勢,應在生產代碼中避免使用。最好使用CREATE TABLE語句,在該語句中您可以預先指定約束和數據類型,這樣就可以減少不一致情況潛入數據的可能性。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
SQL Prompt是一款實用的SQL語法提示工具。SQL Prompt根據數據庫的對象名稱、語法和代碼片段自動進行檢索,為用戶提供合適的代碼選擇。自動腳本設置使代碼簡單易讀--當開發者不大熟悉腳本時尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據需要進行自定義,使之以預想的方式工作。
我們可以SELECT…INTO在SQL Server中使用表源創建新表。SQL Server使用SELECT列表中表達式的屬性來定義新表的結構。
在SQL Server 2005之前,SELECT…INTO在生產代碼中使用性能是一種“代碼味道”,因為它獲取了數據庫系統表上的架構鎖,從而導致SQL Server在執行查詢時顯得無響應。這是因為它是隱式事務中的DDL語句,由于將數據插入同一SQL語句中,因此不可避免地要長時間運行。但是,當鎖定模型更改時,此行為已在SQL Server 2005中修復。
SELECT…INTO之所以變得流行是因為它是一種比使用插入數據更快的方式INSERT INTO…SELECT…。這主要是由于SELECT…INTO在可能的情況下對該操作進行了大容量日志記錄。盡管INSERT INTO現在可以批量登錄,但您仍可以在SQL Server 2012和2014中看到這種性能優勢,因為SELECT…INTO可以在這些版本上進行并行化,而對并行化的支持INSERT INTO僅在SQL Server 2016中出現。但是,使用SELECT…INTO,您仍然具有在新表上定義所有必需的索引和約束等任務。
SELECT…INTOSQL Prompt(PE003)中的代碼分析規則中包含了避免對生產代碼使用的建議。
使用SELECT INTO語句創建表
SELECT…INTOSQL Server中的功能旨在將表源存儲或“持久化”作為流程的一部分。這是一個簡單的示例:
但是,表源可以是常規表以外的很多東西,例如用戶定義的函數,an OpenQuery,an OpenDataSource,OPENXML子句,派生表,聯接表,數據透視表,遠程數據源,表變量或可變函數。正是這些更奇特的表源使SELECT…INTO語法變得更加有用。
SELECT INTO是否是ANSI標準的一部分?ANSI標準確實支持SELECT…INTO構造。它稱為單例選擇(singleton select),它會在單行中加載值,但很少使用(感謝Joe Celko指出了這一點)。
人們常常SELECT…INTO誤以為這是復制表的一種快速方法,因此令人驚訝的是,沒有將源表中定義的索引,約束,計算列或觸發器都轉移到新表中。也不能在SELECT…INTO語句中指定它們。它還對可空性或保留計算列沒有任何作用。必須使用適當的數據來回顧性地完成所有這些任務,這不可避免地要花費時間。
但是,您可以使用函數IDENTITY(數據類型,種子,增量)來設置標識字段,并且當源是單個表時,可以將目標表的列設置為標識列。正是這一事實可能導致開發人員假設它將轉移其他列屬性。
此外,它也不能創建分區表,稀疏列或從源表繼承的任何其他屬性。當數據可能來自涉及許多聯接的查詢或來自某些外部數據源的數據時,該怎么辦?
自SQL 2012 SP1 CU10起,SELECT…INTO可以并行執行,但是,自SQL Server 2016起,在常規語句中允許并行插入INSERT INTO…SELECT,但有一定的限制,因此使用SELECT…的任何性能優勢INTO現在都大大減少了。INSERT INTO如果可以批量記錄而不是完全恢復,則可以加快該過程,方法是將恢復模型設置為簡單記錄或批量記錄,插入空表或堆中,并TABLOCK為表設置提示。
以下總結了使用時的一些限制和限制SELECT…INTO。
該SELECT語句包含聯接的表(使用JOIN或UNION),GROUP BY子句或聚合函數。如果您需要避免將一個IDENTITY屬性轉移到新表中,但需要該列的值,則值得JOIN在永遠不成立的條件下將a添加到表源中,或者UNION不提供任何行。
該IDENTITY列在SELECT列表中被多次列出
該IDENTITY列是表達式的一部分
該IDENTITY列來自遠程數據源
概要
總而言之,SELECT…INTO如果您不關心約束,索引或特殊列,則是使表源作為過程的一部分臨時持久化的好方法。這不是復制表的好方法,因為只能復制表架構的最重要的要素。多年來,有一些因素增加或減少了的吸引力SELECT…INTO,但總的來說,最好避免使用它。而是顯式地創建一個表,該表具有表所具有的全部功能,這些功能旨在確保數據一致。
試用下載>>>本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: