新聞中心
在SQL Server數(shù)據(jù)庫開發(fā)中,涉及多表數(shù)據(jù)聯(lián)合查詢時(shí),一般都會(huì)想當(dāng)然的Inner Join、Left Join,也經(jīng)常出現(xiàn)數(shù)據(jù)量一大查詢就特別慢的問題。如果不關(guān)聯(lián)表,而是在循環(huán)中,需要時(shí)再查詢數(shù)據(jù)庫,獲取其他表的數(shù)據(jù)。本文通過以下的例子來驗(yàn)證查詢的方式和速度的關(guān)系。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),鄂州企業(yè)網(wǎng)站建設(shè),鄂州品牌網(wǎng)站建設(shè),網(wǎng)站定制,鄂州網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,鄂州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
首先看看在游標(biāo)中,關(guān)聯(lián)表循環(huán)和循環(huán)中再查詢單個(gè)數(shù)據(jù)比較:
(PS:Order表中數(shù)據(jù)共5000多一點(diǎn),Member表中數(shù)據(jù)近16000)
SQL代碼 關(guān)聯(lián)表
- Declare @idx int,@idxCount int,@MbCd varchar(20)
- Set @idxCount = 0
- Declare Cur_Test Cursor For
- Select M.MB_CD From Order O Inner Join Member M On O.MB_CD=M.MB_CD
- Open Cur_Test
- Fetch Next From Cur_Test Into @MbCd
- While (@@FETCH_STATUS = 0)
- Begin
- Set @idx = 1
- Set @idxCount = @idxCount + @idx
- Fetch Next From Cur_Test Into @MbCd
- End
- Close Cur_Test
- DEALLOCATE Cur_Test
- print @idxCount
執(zhí)行時(shí)間:34秒
SQL代碼 不關(guān)聯(lián)表
- Declare @idx int,@idxCount int,@MbCd varchar(20)
- Set @idxCount = 0
- Declare Cur_Test Cursor For
- Select MB_CD From ORDER
- Open Cur_Test
- Fetch Next From Cur_Test Into @MbCd
- While (@@FETCH_STATUS = 0)
- Begin
- Set @idx = 0
- Select @idx = COUNT(*) From MEMBER Where MB_CD=@MbCd
- Set @idxCount = @idxCount + @idx
- Fetch Next From Cur_Test Into @MbCd
- End
- Close Cur_Test
- DEALLOCATE Cur_Test
- print @idxCount
執(zhí)行時(shí)間:18秒
確實(shí),不關(guān)聯(lián)表快了將近一倍。
不過,考慮到實(shí)際使用中,如果是代碼中循環(huán)執(zhí)行查詢語句去查詢單個(gè)數(shù)據(jù),打開數(shù)據(jù)庫連接、關(guān)閉數(shù)據(jù)庫連接也需要消耗時(shí)間,而在游標(biāo)中是不需要的,所以,也在C#中測試了一下。
首先是未關(guān)聯(lián)表查詢數(shù)據(jù),代碼如下:
C#代碼 關(guān)聯(lián)表
- int intIdxCount = 0;
- DateTime dtmBegin = DateTime.Now;
- using (DataTable dtList = new SqlDBOperator().exeSqlForDataTable("Select M.MB_CD,O.ORD_NO From ORDER O Inner Join MEMBER M On M.MB_CD=O.MB_CD"))
- 5
- {
- foreach (DataRow dr in dtList.Rows)
- {
- intIdxCount += 1;
- }
- }
- DateTime dtmEnd = DateTime.Now;
- this.litlMsg.Text = "開始執(zhí)行:" + dtmBegin.ToString() + "
結(jié)束執(zhí)行:" + dtmEnd.ToString() + "
";
執(zhí)行結(jié)果:
開始執(zhí)行:2011/7/19 22:15:31
結(jié)束執(zhí)行:2011/7/19 22:15:31
大約 0 秒
C#代碼 不關(guān)聯(lián)表
- DataTable dtTemp = new DataTable();
- DateTime dtmBegin = DateTime.Now;
- using (DataTable dtList = new SqlDBOperator().exeSqlForDataTable("Select MB_CD From ORDER"))
- {
- foreach (DataRow dr in dtList.Rows)
- {
- dtTemp = new SqlDBOperator().exeSqlForDataTable("select count(*) From MEMBER where MB_CD='" + dr["MB_CD"].ToString().Trim() + "'");
- }
- }
- DateTime dtmEnd = DateTime.Now;
- this.litlMsg.Text = "開始執(zhí)行:" + dtmBegin.ToString() + "
結(jié)束執(zhí)行:"+dtmEnd.ToString();
執(zhí)行結(jié)果:
開始執(zhí)行:2011/7/19 21:56:22
結(jié)束執(zhí)行:2011/7/19 21:56:43
大約21秒
通過上面的實(shí)驗(yàn)得出:當(dāng)數(shù)據(jù)量過大時(shí)關(guān)聯(lián)查詢會(huì)使執(zhí)行速度過慢,我們在實(shí)際的查詢過程中應(yīng)根據(jù)實(shí)際情況來選擇使用何種查詢方式。
【編輯推薦】
- 誤刪SQL Server日志文件后怎樣附加數(shù)據(jù)庫
- SQL Server 2005數(shù)據(jù)庫用戶權(quán)限管理的設(shè)置
- 淺析SQL Server數(shù)據(jù)庫專用管理員連接DAC的使用
- 在SQL SERVER 2005執(zhí)行存儲(chǔ)過程的權(quán)限分配問題
- T-SQL行列相互轉(zhuǎn)換命令:PIVOT和UNPIVOT使用詳解
名稱欄目:查詢數(shù)據(jù)量大時(shí),關(guān)聯(lián)表查詢與循環(huán)查詢哪個(gè)更好
文章地址:http://m.jiaoqi3.com/article/dppopoc.html


咨詢
建站咨詢
