新聞中心
如果當(dāng)SQL數(shù)據(jù)庫(kù)中select語(yǔ)句數(shù)目過(guò)多,就會(huì)影響數(shù)據(jù)庫(kù)的性能,如果需要查詢n個(gè)Customer對(duì)象,那么必須執(zhí)行n+1次select查詢語(yǔ)句,下文就將為您講解這個(gè)n+1次select查詢問(wèn)題。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)白城,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
在Session的緩存中存放的是相互關(guān)聯(lián)的對(duì)象圖。默認(rèn)情況下,當(dāng)Hibernate從數(shù)據(jù)庫(kù)中加載Customer對(duì)象時(shí),會(huì)同時(shí)加載所有關(guān)聯(lián)的Order對(duì)象。以Customer和Order類(lèi)為例,假定ORDERS表的CUSTOMER_ID外鍵允許為null,圖1列出了CUSTOMERS表和ORDERS表中的記錄。
以下Session的find()方法用于到數(shù)據(jù)庫(kù)中檢索所有的Customer對(duì)象:
List customerLists=session.find("from Customer as c");
運(yùn)行以上find()方法時(shí),Hibernate將先查詢CUSTOMERS表中所有的記錄,然后根據(jù)每條記錄的ID,到ORDERS表中查詢有參照關(guān)系的記錄,Hibernate將依次執(zhí)行以下select語(yǔ)句:
select * from CUSTOMERS;
select * from ORDERS where CUSTOMER_ID=1;
select * from ORDERS where CUSTOMER_ID=2;
select * from ORDERS where CUSTOMER_ID=3;
select * from ORDERS where CUSTOMER_ID=4;#p#
通過(guò)以上5條select語(yǔ)句,Hibernate最后加載了4個(gè)Customer對(duì)象和5個(gè)Order對(duì)象,在內(nèi)存中形成了一幅關(guān)聯(lián)的對(duì)象圖,參見(jiàn)圖2。
Hibernate在檢索與Customer關(guān)聯(lián)的Order對(duì)象時(shí),使用了默認(rèn)的立即檢索策略。這種檢索策略存在兩大不足:
(1) select語(yǔ)句的數(shù)目太多,需要頻繁的訪問(wèn)數(shù)據(jù)庫(kù),會(huì)影響檢索性能。如果需要查詢n個(gè)Customer對(duì)象,那么必須執(zhí)行n+1次select查詢語(yǔ)句。這就是經(jīng)典的n+1次select查詢問(wèn)題。這種檢索策略沒(méi)有利用SQL的連接查詢功能,例如以上5條select語(yǔ)句完全可以通過(guò)以下1條select語(yǔ)句來(lái)完成:
select * from CUSTOMERS left outer join ORDERS
on CUSTOMERS.ID=ORDERS.CUSTOMER_ID
以上select語(yǔ)句使用了SQL的左外連接查詢功能,能夠在一條select語(yǔ)句中查詢出CUSTOMERS表的所有記錄,以及匹配的ORDERS表的記錄。
(2)在應(yīng)用邏輯只需要訪問(wèn)Customer對(duì)象,而不需要訪問(wèn)Order對(duì)象的場(chǎng)合,加載Order對(duì)象完全是多余的操作,這些多余的Order對(duì)象白白浪費(fèi)了許多內(nèi)存空間。
為了解決以上問(wèn)題,Hibernate提供了其他兩種檢索策略:延遲檢索策略和迫切左外連接檢索策略。延遲檢索策略能避免多余加載應(yīng)用程序不需要訪問(wèn)的關(guān)聯(lián)對(duì)象,迫切左外連接檢索策略則充分利用了SQL的外連接查詢功能,能夠減少select語(yǔ)句的數(shù)目。
【編輯推薦】
SQL語(yǔ)句中的鎖定語(yǔ)句
SQL中SELECT INTO和INSERT INTO SELECT語(yǔ)句介紹
如何解決SQL Server中傳入select語(yǔ)句in范圍參數(shù)
使用SQL中SELECT語(yǔ)句的使用條件邏輯
SQL語(yǔ)句中的嵌套SELECT語(yǔ)句
文章名稱:SQL中的n+1次select語(yǔ)句查詢問(wèn)題
本文來(lái)源:http://fisionsoft.com.cn/article/dhighih.html


咨詢
建站咨詢
