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