一直听说存储过程的效率高,但一直没验证过。
现在验证了一下,发现好像并不是那么回事。测试数据库:MySQL 5.1
数据量:2W多
存储过程:单表(2W多记录)select 4列
测试方法:使用Java程序通过JDBC连接数据库,一个是使用一般的SQL语句,用Statement查询;另一个使用存储过程,用CallableStatement查询。测试结果:
使用SQL语句的查询时间100多ms
用存储过程的查询时间超过200ms,差不多上面的2倍问题:为什么存储过程没有体现出它的优势呢?是数据量还不够庞大吗?

解决方案 »

  1.   

    存储过程的优点在于:1 存储过程自动把所有的字母大写.2 存储过程自动收缩空格和tab。
    这样在你多次执行的时候就不会产生多个执行计划,避免了逻辑读,所以才会建议使用存储过程,至于我们的选择主要还是看业务和前期的设计
      

  2.   

    -- 10.1 存储过程基础 ( P273 )(摘录于 SQL Server 2008实战\第10章_存储过程(P273页)
    -- 这几年,我已经形成了一个只要有可能就使用存储过程的强烈偏好。根据我的经验,使用存储过程有很多好处,而没什么坏处。通常,
    -- 反对使用存储过程的理由来自某些应用程序开发者,他们更喜欢在应用层使用即席SQL (adhoc SQL),并且没有训练过使用存储过程。与独立的应用程序和数据库管理员一起,
    -- 存储过程同样面临着开发人员到数据库管理员对T-SQL代码的失控。假设你们的数据库管理团队很强,并且乐意及时提供向存储过程转移的帮助,
    -- 那么使用存储过程的优势会比失去控制大很多。-- 使用存储过程有以下一些好处。
    -- *1) 存储过程帮助在数据库层聚集T-SQL代码。嵌入即席SQL的网站或应用程序在应用环境下很难修改,当即席SQL嵌入在应用程序内的时候,你可能会花费太多时间试图找到和调试嵌入的SQL。
    -- 一旦找到了bug,你可能就需要重新编译可执行程序,引起不必要的应用程序临时停止或痛苦的应用程序部署。如果把T-SQL集中到存储过程中去,
    -- 你就只需要集中在一个地方来查询SQL代码或SQL批处理。如果你能正确地为代码建立文档并对代码标准化,存储过程就会提升整个应用程序的可支持性。
    -- *2) 存储过程帮助大的即席查询减少网络流量。编写应用程序调用而不是500行的SQL调用来执行存储过程,对网络以及应用程序的性能有正面影响,特别是当调用在一分钟内重复数千次时。
    -- *3) 存储过程促进代码的可利用性。例如,如果你的网站应用程序使用一个下拉菜单来包含一组城市,并且这个下拉菜单用于很多网页,
    -- 你可以在每个页面调用存储过程而不是在多个地方嵌入相同的SQL。
    -- *4) 存储过程淡化数据获取的方法。如果你修改了提供源数据的基本表,存储过程(和视图相似)能让应用程序对这个修改透明。这样就不需要修改应用程序底层的代码就能修改。
    -- 你可以把老的表换成新的,而且只要同样的列和数据类型返回给应用程序,则应用程序完全不知情。
    -- *5) 与视图不同,存储过程可以利用流控制技术、临时表、表变量等。
    -- *6) 存储过程对查询响应时间的影响比较稳定。如果你使用大量的即席查询,可能会注意到有时候从查询中返回结果所花的时间变化很大。
    -- 这可能由诸如对表(锁)的并发活动或者资源问题(内存、CPU)等外部因素引起的。从另外一面来说,即席查询可能执行得不稳定,因为SQL Server有时候会选择效率较低的执行计划。
    -- 而存储过程提供了更可靠的查询计划缓存,因此可以重用。注意到,这里我使用的是“可靠”这个单词,而不是“快速”。即席查询有时候确实比存储过程执行得更好,
    -- 但是它完全依赖执行计划被缓存的环境(“被发觉”的参数),以及看你怎么测试、调优以及实现代码了。-- 如果前面的这些理由还不能让你相信存储过程是非常好的,那么让我们再来看一下安全方面的好处。直接访问SQL Server实例和它的数据库的表(更坏的情况是访问sysadmin)会引起安全隐患。
    -- 内联即席代码特别容易遭受SQL注入(injection)攻击。如果在T-SQL发送到SQL Server实例之前,有害的T-SQL就插入到了既有应用程序的T-SQL代码,那么就会发生SQL注入。除了SQL注入攻击,
    -- 如果一些人得到了内联代码,他们就能收集数据库中基础架构的信息,从而指导他们尝试攻击。让所有SQL在存储过程内能保证只有存储过程被应用程序引用----而不是每一个列和表名。-- 存储过程的另外一个安全方面的好处就是可以授予数据库用户和/或数据库角色对它们的访问而不是授予对表的直接访问权限。存储过程能作为控制层,
    -- 你可以选择哪些列和行能被存储过程(和调用者)修改,哪些不能。
      

  3.   


    是啊, 单次查询不能说明问题的啊,比如:。如果你使用大量的即席查询,可能会注意到有时候从查询中返回结果所花的时间变化很大。google,资料:
    即席查询  即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不同是普通的应用查询是定制开发的,而即席查询是由用户自定义查询条件的。   浅析即席查询 在数据仓库领域有一个概念叫Ad hoc queries,中文一般翻译为“即席查询”。即席查询是指那些用户在使用系统时,根据自己当时的需求定义的查询。即席查询生成的方式很多,最常见的就是使用即席查询工具。一般的数据展现工具都会提供即席查询的功能。通常的方式是,将数据仓库中的维度表和事实表映射到语义层,用户可以通过语义层选择表,建立表间的关联,最终生成SQL语句。即席查询与通常查询从SQL语句上来说,并没有本质的差别。它们之间的差别在于,通常的查询在系统设计和实施时是已知的,所有我们可以在系统实施时通过建立索引、分区等技术来优化这些查询,使这些查询的效率很高。而即席查询是用户在使用时临时生产的,系统无法预先优化这些查询,所以即席查询也是评估数据仓库的一个重要指标。即席查询的位置通常是在关系型的数据仓库中,即在EDW或者ROLAP中。多维数据库有自己的存储方式,对即席查询和通常查询没有区别。在一个数据仓库系统中,即席查询使用的越多,对数据仓库的要求就越高,对数据模型的对称性的要求也越高。对称性的数据模型对所有的查询都是相同的,这也是维度建模的一个优点。
      

  4.   

    理论上说肯定是比sql快的,因为存储过程它是编译过后的,你调用它的时候就直接用的,而sql语句还要通过mysql编译,再返回结果,编译其实也需要很多时间的。这个问题只能说你写的存储过程效率没有优化好。
      

  5.   


    我测试的存储过程,只是一个简单的select,单表
    过程里包含的sql语句和我通过Statement调用的sql是完全一样的。
    这样的存储过程貌似没什么好优化的吧?
      

  6.   

    MARK一下,看看大家的解答。
    我对这个理解也不是很透彻
    我觉得,为了安全性,就有用各种存储过程的必要性
      

  7.   


    这种情况根本不要使用存储过程,而且部分DBMS由于存储过程已经编译过,不再进行查询策略分析,反而影响效果。