翻譯|使用教程|編輯:吉煒煒|2024-11-04 13:55:24.213|閱讀 122 次
概述:在數(shù)據(jù)庫管理中,有效限制查詢結(jié)果對于優(yōu)化性能和確保檢索相關(guān)數(shù)據(jù)至關(guān)重要。本文將帶領(lǐng)大家仔細(xì)看看LIMITSQL Server 中的替代方案,重點(diǎn)介紹它們的獨(dú)特功能和局限性。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在數(shù)據(jù)庫管理中,有效限制查詢結(jié)果對于優(yōu)化性能和確保檢索相關(guān)數(shù)據(jù)至關(guān)重要。許多 SQL 數(shù)據(jù)庫系統(tǒng)(例如 MySQL 和 PostgreSQL)都使用LIMIT子句來指定查詢返回的記錄數(shù)。但是,SQL Server 不支持該LIMIT子句,而是選擇諸如TOP、和 之類的替代方案。這種設(shè)計(jì)選擇反映了 SQL Server 對靈活性和性能的關(guān)注,提供了各種方法來實(shí)現(xiàn)類似的功能,同時(shí)滿足不同的用例和場景。
讓我們仔細(xì)看看LIMITSQL Server 中的替代方案,重點(diǎn)介紹它們的獨(dú)特功能和局限性。
dbForge Studio for SQL Server官方正版下載
使用 SELECT TOP 子句
在 SQL Server 中,該SELECT TOP子句充當(dāng)子句的替代LIMIT。同樣,它用于限制查詢返回的行數(shù)。當(dāng)您處理大型數(shù)據(jù)集并且只想檢索記錄的子集時(shí),它特別有用。基本語法是:
SELECT TOP (number | percent) column_names FROM table_name;
此處,number代表要返回的確切行數(shù),是percent返回的行數(shù)占總結(jié)果集的百分比。請根據(jù)需要使用這些參數(shù)之一。
您可以通過添加其他子句(比如WHERE or ORDER BY )來進(jìn)一步優(yōu)化結(jié)果。
例如,以下查詢返回按受雇日期排序的前五名員工(此處和下面,我們將在示例中使用 AdventureWorks2022 示例數(shù)據(jù)庫):
USE AdventureWorks2022; SELECT TOP 5 * FROM HumanResources.Employee ORDER BY HireDate;
或者,此查詢檢索休假時(shí)間超過 20 小時(shí)的前 10% 員工的國家 ID 和職位:
USE AdventureWorks2022; SELECT TOP 10 PERCENT NationalIDNumber, JobTitle FROM HumanResources.Employee WHERE VacationHours > 20;
使用該SELECT TOP子句有很多好處。首先,性能優(yōu)化——它限制了結(jié)果集的大小,當(dāng)只需要部分?jǐn)?shù)據(jù)時(shí),可以減少內(nèi)存和處理負(fù)載。其次,它可用于通過僅檢索當(dāng)前頁面所需的行來為大型結(jié)果集創(chuàng)建高效的分頁。此外,通過限制返回的行數(shù),它在測試大型表上的查詢時(shí)也很有用。
請注意,SELECT TOP不提供隨機(jī)行。要實(shí)現(xiàn)隨機(jī)性,您可以將其與 結(jié)合使用,但這對于大型數(shù)據(jù)集來說效率低下。另一方面,如果不指定子句,結(jié)果可能是不可預(yù)測的,因?yàn)?SQL Server 不保證返回行的順序。
使用 OFFSET-FETCH 實(shí)現(xiàn)分頁
說到分頁,另一個(gè)子句——OFFSET-FETCH——可以在 SQL Server 中使用來實(shí)現(xiàn)分頁,它允許您通過跳過一定數(shù)量的行然后獲取定義數(shù)量的行來檢索特定的記錄子集。此子句具有以下語法:
SELECT column_names FROM table_name ORDER BY column_name OFFSET number_of_rows_to_skip ROWS FETCH NEXT number_of_rows_to_return ROWS ONLY;
該OFFSET子句允許您指定在返回行之前需要跳過多少行,并FETCH NEXT定義在跳過的行之后返回多少行。
為了說明這一點(diǎn),假設(shè)您需要跳過按 BusinessEntityID 排序的前 10 條記錄并返回后 10 條記錄,從而有效地獲取分頁結(jié)果中的第 2 頁。您的查詢將如下所示:
USE AdventureWorks2022; SELECT * FROM HumanResources.Employee ORDER BY BusinessEntityID OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
您還可以使用OFFSET-FETCH動(dòng)態(tài)頁面大小和頁碼。例如,此動(dòng)態(tài)查詢獲取第 3 頁的記錄,假設(shè)每頁大小為 10 行:
USE AdventureWorks2022; DECLARE @PageSize INT = 10; DECLARE @PageNumber INT = 3; SELECT BusinessEntityID, JobTitle, HireDate FROM HumanResources.Employee ORDER BY BusinessEntityID OFFSET (@PageSize * (@PageNumber - 1)) ROWS FETCH NEXT @PageSize ROWS ONLY;
這種子句組合非常棒,因?yàn)樗梢宰屇_控制分頁 — 這是一種簡潔高效的分頁處理方法,尤其適用于 Web 應(yīng)用程序。此外,它遵循 SQL 標(biāo)準(zhǔn),因此對于來自其他 RDBMS 的開發(fā)人員來說,它具有可移植性且易于理解。最重要的是,與其他方法(例如使用子查詢)不同,它直接跳過并獲取行,而無需復(fù)雜的解決方法。
但值得注意的是,對于大型數(shù)據(jù)集,分頁越深(例如,第 1000 頁),查詢可能會(huì)變得越慢,因?yàn)?SQL Server 必須跳過更多行。另一個(gè)需要考慮的問題是,不返回總行數(shù),因此如果您需要顯示分頁元數(shù)據(jù)(例如總頁數(shù)),則需要額外的查詢——來獲取總行數(shù)。并且不要忘記,使用時(shí)必須使用子句;否則,結(jié)果是不可預(yù)測的。
使用 SET ROWCOUNT 命令
您可以使用SET ROWCOUNTSQL Server 中的命令來限制語句返回的行數(shù)SELECT或受UPDATE或影響的行數(shù)DELETE。該命令的語法如下:
SET ROWCOUNT { number | 0 }
而不是number您指定要返回或處理的行數(shù),而是0重置行數(shù)。
如果將SET ROWCOUNTandSELECT與其他命令(例如ORDER BYand WHERE)一起使用,它們的交互作用會(huì)非常強(qiáng)大。在此組合中,WHERE子句首先篩選行,ORDER BY子句對篩選出的行進(jìn)行排序,然后SET ROWCOUNT限制從排序結(jié)果集返回的行數(shù)。
下面是一個(gè)示例,我們只想檢索按字母順序排序(按職位)且休假時(shí)間超過 50 小時(shí)的員工的前五條記錄,然后重置行數(shù)限制,以便將來的查詢返回所有匹配的行:
USE AdventureWorks2022; SET ROWCOUNT 5; SELECT * FROM HumanResources.Employee WHERE VacationHours > 50 ORDER BY JobTitle; SET ROWCOUNT 0;
SET ROWCOUNT使用數(shù)據(jù)修改命令(例如UPDATE或)DELETE的工作原理類似。讓我們考慮一個(gè)更新數(shù)據(jù)的示例。運(yùn)行此腳本將僅將具有 Stocker 職位的第一位員工的職位更改為 Chief Stocker,然后重置行數(shù)限制,并顯示結(jié)果:
USE AdventureWorks2022; SET ROWCOUNT 1; UPDATE HumanResources.Employee SET JobTitle = 'Chief Stocker' WHERE JobTitle = 'Stocker'; SET ROWCOUNT 0; -- To see the result of the update SELECT * FROM HumanResources.Employee WHERE JobTitle LIKE ('%Stocker%') ORDER BY JobTitle;
如您所見,SET ROWCOUNT提供了一種簡單的方法來限制結(jié)果,而無需復(fù)雜的語法。與TOP有時(shí)需要子查詢來實(shí)現(xiàn)更復(fù)雜的邏輯的命令不同,它SET ROWCOUNT可以直接與語句一起使用SELECT。但是,該SET ROWCOUNT命令被認(rèn)為已棄用,因?yàn)樗拗屏私Y(jié)果集,而傾向于TOP使用提供更清晰語義的子句。
缺點(diǎn)是, 的效果SET ROWCOUNT是特定于會(huì)話的,這意味著必須在每個(gè)需要它的會(huì)話中設(shè)置它。此外,SET ROWCOUNT如果不小心使用,在更復(fù)雜的查詢中使用可能會(huì)導(dǎo)致意想不到的結(jié)果。
請注意SET ROWCOUNT,現(xiàn)在越來越少使用了。SQL 標(biāo)準(zhǔn)已經(jīng)發(fā)展,現(xiàn)代 SQL 實(shí)踐更傾向于對結(jié)果集和數(shù)據(jù)操作進(jìn)行更明確的控制。因此,Microsoft 建議改用子句TOP,因?yàn)镾ET ROWCOUNT不會(huì)影響SQL Server 2022 版本之后的未來版本中的DELETE和UPDATE語句。
使用 dbForge Studio 親自嘗試
我們將在 dbForge Studio for SQL Server 中嘗試上述用例之一。
讓我們首先檢查 AdventureWorks2022 數(shù)據(jù)庫的 HumanResources.Employee 表中有多少名員工擔(dān)任營銷專家職位。我們按如下方式執(zhí)行此操作:
SELECT COUNT(*) AS Count FROM HumanResources.Employee WHERE JobTitle = 'Marketing Specialist';
我們可以看到,共有五個(gè):
我們想知道哪三位專家的未使用休假時(shí)間最多。我們使用以下查詢:
SET ROWCOUNT 3; SELECT * FROM HumanResources.Employee WHERE JobTitle = 'Marketing Specialist' ORDER BY VacationHours DESC; SET ROWCOUNT 0;
dbForge Studio 返回結(jié)果(為了演示的目的,我們改變了列的順序):
為什么選擇dbForge Studio for SQL Server?
我們相信,dbForge Studio 憑借其增強(qiáng)的用戶界面和高級功能,比 SQL Server Management Studio (SSMS) 更出色。雖然 SSMS 圍繞基礎(chǔ)功能展開,但 dbForge Studio 提供了復(fù)雜的工具,如可視化查詢構(gòu)建、數(shù)據(jù)庫比較和同步、數(shù)據(jù)聚合和分析、自動(dòng)單元測試以及與版本控制系統(tǒng)的集成。這種對用戶體驗(yàn)和強(qiáng)大功能的關(guān)注使 dbForge Studio 成為SQL Server 管理中SSMS 的有力替代方案。
總而言之,讓我們簡單比較一下LIMIT上面討論的子句的 SQL Server 替代方案:
因此,根據(jù)使用情況,每種方法都有其獨(dú)特的優(yōu)勢。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn