查询数据量大时,关联表查询与循环查询哪个更好
1个回答
2015-07-20 · 知道合伙人软件行家
关注
展开全部
在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秒
通过上面的实验得出:当数据量过大时关联查询会使执行速度过慢,我们在实际的查询过程中应根据实际情况来选择使用何种查询方式。
首先看看在游标中,关联表循环和循环中再查询单个数据比较:
(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秒
通过上面的实验得出:当数据量过大时关联查询会使执行速度过慢,我们在实际的查询过程中应根据实际情况来选择使用何种查询方式。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
数位汇聚
2023-08-28 广告
2023-08-28 广告
常见的查询城市人口数据途径有以下几个:1. 国家统计网站:中国各级单位及公众了解全国及各地区经济社会发展和人口变动情况的重要渠道之一。其网站可以查询全国及各地各级行政区域的人口数据,包括城市总人口、年龄结构、性别比例等。2. 地方统计网站:...
点击进入详情页
本回答由数位汇聚提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询