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