各位朋友好,和大家探讨一个问题。我对SQL执行过程的理解比较肤浅,对于一个select操作,我的理解是:
客户端发送一个select sql语句给服务器端,服务器端进行检查、执行、生成结果集,然后返回给客户端一个结果集的句柄(或者游标之类),供客户端进行后面自己所需要的操作。在这个过程中,处理压力都在服务器端,客户端除了发送一个sql语句,接收返回执行状态结果和结果集句柄外,不会有什么压力,客户端机器的cpu、内存、网络等都会很空闲。但是我现在遇到一个问题,对我这个理解产生很大挑战。我在和一个客户讨论数据库测试方案时(针对多种不同的数据库),期中有一个测试用例,是一个简单的select操作(select * from table1),结果集很大,会有几千万记录。客户的疑惑是,这样的测试用例,会对发送这个sql的客户端压力很大(说主要是网络方面),执行该语句后,客户端会一条一条的返回结果集数据。因为对方的技术也很好,所以我现在很疑惑。这对我以前对sql的理解完全不一样。我的问题是:当我执行一个会产生很大结果集的select * from table1这样的操作时,对发送sql的客户端,是否会有这么大的压力?或者不同的数据库厂商策略不同?对这个问题很疑惑,向大家请教,谢谢大家了!
客户端发送一个select sql语句给服务器端,服务器端进行检查、执行、生成结果集,然后返回给客户端一个结果集的句柄(或者游标之类),供客户端进行后面自己所需要的操作。在这个过程中,处理压力都在服务器端,客户端除了发送一个sql语句,接收返回执行状态结果和结果集句柄外,不会有什么压力,客户端机器的cpu、内存、网络等都会很空闲。但是我现在遇到一个问题,对我这个理解产生很大挑战。我在和一个客户讨论数据库测试方案时(针对多种不同的数据库),期中有一个测试用例,是一个简单的select操作(select * from table1),结果集很大,会有几千万记录。客户的疑惑是,这样的测试用例,会对发送这个sql的客户端压力很大(说主要是网络方面),执行该语句后,客户端会一条一条的返回结果集数据。因为对方的技术也很好,所以我现在很疑惑。这对我以前对sql的理解完全不一样。我的问题是:当我执行一个会产生很大结果集的select * from table1这样的操作时,对发送sql的客户端,是否会有这么大的压力?或者不同的数据库厂商策略不同?对这个问题很疑惑,向大家请教,谢谢大家了!
解决方案 »
- ORA-01033: ORACLE initialization or shutdown in progress
- 最基础的问题
- 怎么登陆服务器
- 关于partition!高手请进!
- 新手 :一个触发器里游标问题,请各位高手年看看啊
- 如何启动在window下打开dos,执行oracle的命令?如imp。。。。
- oracle 8和9在联想开天4600上无法安装,清高手指点!(在线等)
- 如何将oracle数据库转换(导入)mysql数据库??请指点!
- 请问如何查找在SQL*PLUS中所使用的命令的帮助信息
- 数据泵导入报错
- 跪求高人指点!怎样合并几种情况的记录!
- oracle PLS-00103: 出现符号 "MRID1"在需要下列之一时:language
“当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作”这个‘专门负责数据提取的一段代码’是一个守候进程吗?客户端如果不发出下面的请求,不会主动返回什么数据?
而如果你执行的不是select显示的。而只是一个大数据量处理的问题。那发送SQL后就在服务端处理了。由于你执行的是select所以对客户端是有影响的。
从客户端提升SQL Server数据库性能
把selcet * 改为select count(*),在数据库端,还会做那么多的运算和临时表的构建吗?我是担心起不到测试的效果
现在彻底糊涂了
select * from table1
改为
select count(*) from (select * from table1)
后者是否就不会向客户端返回结果集了呢?
试试就知道了,SQLPLUS里你用SELECT * 不加限制的话是一次返回所有的数据,而我们常用的开发工具,如PL SQL DEV,TOAD都是先返回部分数据,即是加了行数限制,类似于分页,当然,JDBC驱动的优化参考http://hi.baidu.com/lovemywolf/blog/item/b2e3a912e22e67cfc2fd78a3.html