查詢數據量大時,關聯表查詢與循環查詢哪個更好
在SQL Server數據庫開發中,涉及多表數據聯合查詢時,一般都會想當然的Inner Join、Left Join,也經常出現數據量一大查詢就特別慢的問題。如果不關聯表,而是在循環中,需要時再查詢數據庫,獲取其他表的數據。本文通過以下的例子來驗證查詢的方式和速度的關系。
首先看看在游標中,關聯表循環和循環中再查詢單個數據比較:
(PS:Order表中數據共5000多一點,Member表中數據近16000)
SQL代碼 關聯表
- 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
執行時間:34秒
SQL代碼 不關聯表
- 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
執行時間:18秒
確實,不關聯表快了將近一倍。
不過,考慮到實際使用中,如果是代碼中循環執行查詢語句去查詢單個數據,打開數據庫連接、關閉數據庫連接也需要消耗時間,而在游標中是不需要的,所以,也在C#中測試了一下。
首先是未關聯表查詢數據,代碼如下:
C#代碼 關聯表
- 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 = "開始執行:" + dtmBegin.ToString() + "<br/>結束執行:" + dtmEnd.ToString() + "<br/>";
執行結果:
開始執行:2011/7/19 22:15:31
結束執行:2011/7/19 22:15:31
大約 0 秒
C#代碼 不關聯表
- 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 = "開始執行:" + dtmBegin.ToString() + "<br/>結束執行:"+dtmEnd.ToString();
執行結果:
開始執行:2011/7/19 21:56:22
結束執行:2011/7/19 21:56:43
大約21秒
通過上面的實驗得出:當數據量過大時關聯查詢會使執行速度過慢,我們在實際的查詢過程中應根據實際情況來選擇使用何種查詢方式。
【編輯推薦】