翻譯|行業(yè)資訊|編輯:胡濤|2023-10-30 10:28:38.510|閱讀 100 次
概述:在本文中,我們將探討使用被認(rèn)為可以接受的各種場(chǎng)景以及可能導(dǎo)致并發(fā)癥的情況。歡迎查閱~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
簡(jiǎn)寫(xiě)命令可能是開(kāi)發(fā)階段最方便、最常用的 SQL 語(yǔ)句之一,但這真的是生產(chǎn)環(huán)境的最佳實(shí)踐嗎?在本文中,我們將探討使用被認(rèn)為可以接受的各種場(chǎng)景以及可能導(dǎo)致并發(fā)癥的情況。我們還將演示如何有效識(shí)別帶有星號(hào)的 SQL SELECT 語(yǔ)句并快速修復(fù)。
SQL 中的命令用于從表中選擇所有列。此命令從子句中指定的表名中獲取每一列的每一行。SELECT *FROM
這是如何使用的基本示例:SELECT *
SELECT * FROM table_name;
雖然該命令對(duì)于快速而臟的查詢(xún)非常方便,尤其是在開(kāi)發(fā)和測(cè)試期間,但由于各種原因(包括性能影響和未來(lái)的可維護(hù)性),通常不建議將其用于生產(chǎn)使用。
讓我們考慮下面的例子。如果您在生產(chǎn)環(huán)境中運(yùn)行查詢(xún),您將從Users表中提取所有數(shù)據(jù),其中可能包括頭像圖片等大型字段。這可能會(huì)占用大量資源,消耗大量?jī)?nèi)存和 CPU。SELECT * FROM Users;
更有效的策略是僅指定實(shí)際需要的列,從而減少查詢(xún)所需的數(shù)據(jù)庫(kù)資源。例如:
SELECT
FirstName,
LastName,
Email,
Login
FROM Users;
對(duì)于頻繁執(zhí)行的查詢(xún)(例如身份驗(yàn)證中使用的查詢(xún)),您可以通過(guò)創(chuàng)建覆蓋索引來(lái)進(jìn)一步優(yōu)化性能。覆蓋索引包含查詢(xún)所需的所有字段,這可以顯著加快查詢(xún)執(zhí)行速度。
CREATE NONCLUSTERED INDEX IDX_Users_Covering ON Users
INCLUDE (FirstName, LastName, Email, Login);
SQL Server 的查詢(xún)優(yōu)化器在可能的情況下更喜歡使用覆蓋索引,因?yàn)檫@樣可以避免篩選聚集索引。但是,如果您使用,則現(xiàn)有索引覆蓋所有列的可能性非常低。SELECT *
即使在創(chuàng)建覆蓋整個(gè)表的非聚集索引的極端情況下,如果表的大小顯著增長(zhǎng),這樣的索引也會(huì)失去效力。因此,使用不僅會(huì)導(dǎo)致性能問(wèn)題,還會(huì)破壞索引策略的優(yōu)勢(shì),使其隨著表的發(fā)展而降低效率。SELECT *
當(dāng)談到 SQL 查詢(xún)時(shí),星號(hào) ( *) 的使用經(jīng)常引發(fā)開(kāi)發(fā)人員、數(shù)據(jù)庫(kù)管理員和數(shù)據(jù)架構(gòu)師之間的爭(zhēng)論。讓我們問(wèn)問(wèn) ChatGPT-4(OpenAI 開(kāi)發(fā)的人工智能聊天機(jī)器人)是否有理由避免使用.SELECT *
我們同意 ChatGPT-4 的觀(guān)點(diǎn),即使用 SELECT ALL 可能會(huì)導(dǎo)致漏洞和性能問(wèn)題。它還會(huì)使您的代碼可讀性較差,并且更難以維護(hù)。但是,我們還應(yīng)該提到重復(fù)列名的問(wèn)題。
在 SQL 中使用多個(gè)連接表可能會(huì)導(dǎo)致重復(fù)的列名,從而使應(yīng)用程序難以解釋結(jié)果。例如,以下查詢(xún)將生成重復(fù)的Customer列:SELECT *
SELECT *
FROM Sales.Customer AS c
INNER JOIN Sales.SalesOrderHeader AS soh
ON c.CustomerID = soh.CustomerID;
當(dāng)應(yīng)用程序嘗試按列名稱(chēng)解析結(jié)果集時(shí),這可能會(huì)導(dǎo)致問(wèn)題。如果您嘗試使用創(chuàng)建臨時(shí)表,您將因重復(fù)的列名而遇到錯(cuò)誤:SELECT * INTO
SELECT * INTO TempCustomerOrders
FROM Sales.Customer AS c
INNER JOIN Sales.SalesOrderHeader AS soh
ON c.CustomerID = soh.CustomerID;
以下是我們關(guān)于在 SQL Server 中負(fù)責(zé)任且有效地使用語(yǔ)句的專(zhuān)家建議。SELECT *
何時(shí)避免SELECT *
生產(chǎn)代碼:在生產(chǎn)代碼中,您應(yīng)該顯式指定列名,以防止表結(jié)構(gòu)發(fā)生變化時(shí)發(fā)生意外更改。
性能:檢索所有列通常意味著比僅指定實(shí)際需要的列更多的磁盤(pán) I/O、傳輸?shù)臄?shù)據(jù)和更多的內(nèi)存使用量。
視圖和存儲(chǔ)過(guò)程:避免在視圖和存儲(chǔ)過(guò)程中使用。對(duì)基礎(chǔ)表的更改可能會(huì)破壞代碼。SELECT *
連接操作:當(dāng)您連接多個(gè)表時(shí),使用可能會(huì)導(dǎo)致列名不明確,并且傳輸?shù)臄?shù)據(jù)量超出必要。SELECT *
應(yīng)用程序:在與數(shù)據(jù)庫(kù)交互的應(yīng)用程序代碼中,請(qǐng)始終指定需要使用的列,以避免重大更改和性能下降。
什么時(shí)候可以接受SELECT *
臨時(shí)查詢(xún):對(duì)于快速數(shù)據(jù)檢查,只要這些查詢(xún)不進(jìn)入生產(chǎn)環(huán)境,使用通常就可以了。SELECT *
初始數(shù)據(jù)探索:當(dāng)您最初探索新的數(shù)據(jù)庫(kù)或表架構(gòu)時(shí),可以快速查看表數(shù)據(jù)。SELECT *
管理腳本:有時(shí),管理或數(shù)據(jù)遷移腳本可能需要選擇所有列。然而,即使在這種情況下,顯式指定列通常也更安全。
顯式列:始終指定您需要哪些列。
限定列名:連接表時(shí),用表名或別名限定列名以避免歧義。
索引:確保您有適當(dāng)?shù)乃饕约涌鞂?shí)際使用的列的查詢(xún)性能。
監(jiān)視和優(yōu)化:始終檢查查詢(xún)執(zhí)行計(jì)劃并使用 SQL Server Profiler 或擴(kuò)展事件來(lái)捕獲和優(yōu)化有問(wèn)題的查詢(xún)。
代碼審查:定期審查代碼是否存在可能導(dǎo)致問(wèn)題的任何情況。SELECT *
關(guān)于 dbForge 搜索
dbForge Search是 SQL Server Management Studio 的免費(fèi)插件,旨在在 SQL Server 中進(jìn)行高效的數(shù)據(jù)庫(kù)搜索。它簡(jiǎn)化了在存儲(chǔ)過(guò)程或查詢(xún)中定位 SQL 對(duì)象、數(shù)據(jù)甚至特定文本的任務(wù)。憑借其用戶(hù)友好的界面和強(qiáng)大的功能,dbForge Search 可以幫助開(kāi)發(fā)人員和數(shù)據(jù)庫(kù)管理員快速識(shí)別和管理大型復(fù)雜 SQL Server 數(shù)據(jù)庫(kù)中的元素。
如何使用 dbForge 搜索查找 SELECT * 語(yǔ)句
在 SQL Server 數(shù)據(jù)庫(kù)中定位語(yǔ)句可能是優(yōu)化和最佳實(shí)踐實(shí)施的關(guān)鍵步驟。如果您使用 dbForge Search,查找這些語(yǔ)句是一個(gè)簡(jiǎn)單的過(guò)程。操作方法如下:SELECT *
1. 在對(duì)象資源管理器中,右鍵單擊要搜索的數(shù)據(jù)庫(kù)。然后選擇“搜索” -> “查找對(duì)象”。
2. 在搜索框中,輸入您要使用的搜索短語(yǔ)。在此示例中,我們輸入SELECT *。
注意:在開(kāi)始搜索之前,請(qǐng)確保清除所有搜索選項(xiàng)。如果您選擇Use WildCards,dbForge Search 將查找數(shù)據(jù)庫(kù)中所有出現(xiàn)的 SELECT 語(yǔ)句。
3. 按Enter或單擊“開(kāi)始搜索”。
搜索完成后,您可以在 “搜索結(jié)果” 網(wǎng)格中看到找到的結(jié)果。當(dāng)您在網(wǎng)格中選擇結(jié)果時(shí), 網(wǎng)格下方的預(yù)覽 窗口將顯示與所選結(jié)果關(guān)聯(lián)的 DDL 語(yǔ)句。
找到所有包含 的語(yǔ)句后,您可以使用 dbForge SQL Complete(Devart 開(kāi)發(fā)的一個(gè)強(qiáng)大的插件)有效地優(yōu)化它們。dbForge SQL Complete是一種高級(jí) SQL 代碼完成和生產(chǎn)力工具,可與 SQL Server Management Studio (SSMS) 和 Visual Studio 無(wú)縫集成。它提供了廣泛的功能來(lái)提高 SQL 編碼速度和質(zhì)量,例如智能代碼完成、代碼片段和查詢(xún)優(yōu)化,幫助開(kāi)發(fā)人員編寫(xiě)更高效、更具可讀性的 SQL 查詢(xún)。SELECT *
如何使用 dbForge SQL Complete 優(yōu)化查詢(xún)SELECT *
要?jiǎng)h除包含 的語(yǔ)句,您可以使用功能。它使用戶(hù)只需按Tab鍵即可將星號(hào) (*) 替換為必要的表或視圖列的列表。讓我們看看如何逐步執(zhí)行此操作。SELECT *
1. 使用 dbForge Search 查找要優(yōu)化的查詢(xún)。
2. 單擊“在對(duì)象資源管理器中查找”。 ]
3. 在對(duì)象資源管理器中,右鍵單擊所需的數(shù)據(jù)庫(kù)對(duì)象并選擇修改。將打開(kāi)一個(gè)新選項(xiàng)卡,允許您對(duì)對(duì)象進(jìn)行更改。
4. 將光標(biāo)置于*in后面,然后按Tab。dbForge SQL Complete 將自動(dòng)替換為表中以逗號(hào)分隔格式的所有列的列表。SELECT **
總之,在 SQL 語(yǔ)句中用顯式列列表替換星號(hào)的做法SELECT不僅僅是風(fēng)格問(wèn)題,它具有切實(shí)的好處。它增強(qiáng)了查詢(xún)的可讀性,簡(jiǎn)化了調(diào)試,并通過(guò)減少需要檢索和處理的數(shù)據(jù)量來(lái)潛在地提高性能。
在本文中,我們演示了如何使用 dbForge 產(chǎn)品線(xiàn)中的兩個(gè)強(qiáng)大工具來(lái)識(shí)別和修復(fù)語(yǔ)句。這些實(shí)用程序使您可以比以往更輕松地優(yōu)化 SQL 查詢(xún),從而提高性能和可讀性。SELECT *
數(shù)據(jù)庫(kù)管理工具交流群:765665608 歡迎進(jìn)群交流討論
正版數(shù)據(jù)庫(kù)管理軟件下載、購(gòu)買(mǎi)、授權(quán)咨詢(xún),請(qǐng)點(diǎn)這里!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn