如何最有效的编写sql -买球官网平台

0顶
0踩

如何最有效的编写sql

2017-07-11 16:05 by 副主编 jihong10102006 评论(0) 有11730人浏览
sql
引用
原文:
作者: emrah mete
翻译:黑色巧克力

译者注:解决数据库级(sql)工作上的问题,应该采用的是set方法(整体的)而不是过程式的方法。下面来看看作者为什么这么说。

编写有效的sql查询是企业软件世界中最大的难题之一。

每个公司在数据库开发项目中所面临的最根本的问题,在于开发环境中实现的性能不能在生产环境中实现。一般来说,存在性能损失是因为生产环境中的数据量要大得多。

这些问题(运行缓慢的数据库操作)可能有各种各样的原因。本文将解释如何在编写查询时进行思考,如何思考是最基本的问题,也是解决此类问题的起点。

观察发现sql开发人员常使用过程方法编写查询。事实上,这是很自然的,因为用程序方法解决问题是最方便的人类逻辑买球软件推荐的解决方案。另一个方面,几乎所有的sql开发人员都在同时编写java、c#或其他编程语言的代码。java、c#等可以用来训练开发人员以一种程序化的方式来培养他们的思维方式,因为当使用这些语言开发应用程序时,会使用很多类似的东西,比如if .. then .. else,for .. loop,while .. do, case .. when。当然,在这种情况下,当将业务规则应用到一组数据时,意味着每个记录都是单独处理的(逐行处理)。这个过程方法在java、c#等语言中使用。虽然使用语言开发软件是一种正确的方法,但在编写数据库级(sql)的查询时,却不会产生同样的效果。

下面用两种不同的方法来解决同一个示例问题,并将结果进行比较。看看customers表中对应的每个客户在sales表中有多少条记录。

过程式方法如下:
set autotrace on
select 
      c.cust_id,
       (select count (*)
          from sh.sales s
         where s.cust_id = c.cust_id)
          sa_count
  from sh.customers c;
plan hash value: 881374884
statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
    2454756  consistent gets
          0  physical reads
          0  redo size
     925474  bytes sent via sql*net to client
      41104  bytes received via sql*net from client
       3701  sql*net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      55500  rows processed


现在,采用基于set的方法来编写查询。
set autotrace on
select 
        c.cust_id, count (s.cust_id) jh_count
    from sh.customers c, sh.sales s
   where c.cust_id = s.cust_id( )
group by c.cust_id;
plan hash value: 716053480
statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        742  consistent gets
          0  physical reads
          0  redo size
     925474  bytes sent via sql*net to client
      41104  bytes received via sql*net from client
       3701  sql*net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      55500  rows processed


可以看到在两个查询的consistent gets数量之间的差异(当检查缓冲区缓存读到的块数据时)是巨大的。使用两种不同方法编写的查询在运行时导致不同时间。这种差别可以用性能来解释。

在另一个例子中,常见的习惯是在sql语句中调用pl/sql函数。作为过程式工作的例子,也是一种解决问题的方法。还有其他一些影响在sql内调用pl/sql代码性能的不利因素,但在本文中,不会提到性能问题。

下面编写查找客户表中每个客户的购买金额的代码。

过程方法:

在第一步中,创建一个pl/sql函数来计算每个客户的总数,然后在代码和输出中调用这个函数。
create or replace function get_grand_total (
   p_cust_id_in in sh.customers.cust_id%type)
   return number
is
   r_grand_total   number;
begin
   select sum (amount_sold)
     into r_grand_total
     from sh.sales
    where cust_id = p_cust_id_in;
   return r_grand_total;
end;
set autotrace on
select cust_id, 
            get_grand_total (cust_id) grand_total 
from sh.customers;
statistics
----------------------------------------------------------
      55503  recursive calls
          0  db block gets
    3066293  consistent gets
          0  physical reads
          0  redo size
     890447  bytes sent via sql*net to client
      41104  bytes received via sql*net from client
       3701  sql*net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      55500  rows processed



现在,采用基于set的方法来编写查询。
set autotrace on
  select c.cust_id, sum (amount_sold)
    from sh.customers c, sh.sales s
   where c.cust_id = s.cust_id( )
group by c.cust_id;
statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       1841  consistent gets
          0  physical reads
          0  redo size
     890452  bytes sent via sql*net to client
      41104  bytes received via sql*net from client
       3701  sql*net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      55500  rows processed


在本例中,通过查看consistent gets和递归调用输出,我们可以看到相同的情况。

我们的查询也是生成更高效的数据库操作的第一步,它考虑的是批处理,而不是逐行思考。在进行数据库操作时,批处理的方法会让你在一天结束时消耗更少的资源,从而提高工作效率。
  • 大小: 112.9 kb
  • 大小: 55.6 kb
  • 大小: 47.9 kb
  • 大小: 57.5 kb
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 1.日期属性列,不会因为有分秒差别而减慢查询速度 2. 使用like比较进行查询时,如果模式以特定字符串如“abc%”开头,使用索引则会提高效率;如果模式以通配符如“%xyz”开头,则... order by按聚集索引列排序效率最

  • sql语句编写规范

  • mysql - sql优化干货总结(吐血版),别辜负了自己的梦想,欢迎白嫖、点赞、收藏。

  • 本文我们来谈谈项目中常用的mysql优化方法,共19条,具体如下:1、explain做mysql优化,我们要善用explain查看sql执行计划。下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据:type列,连接类型。一个...

  • jooq是“数据库优先”类型的安全sql api,使您可以直观地用java编写sql,就像java编译器本身支持sql语言一样。 所有数据库模式,表,列,过程和其他对象均作为java对象提供,可以直接在jooq sql api中使用。 让...

  • sql优化

  • sql注入攻击是黑客对数据库进行攻击常用的手段之一,随着b/s模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对...

  • 第 1 课:创建数据库对象 本课将介绍如何创建数据库,在数据库中创建...可以使用下列方法编写 transact-sql 语句并将其提交到数据库引擎: 通过使用 sql server management studio。本教程假定您使用的是

  • 1.sqlserver 编写脚本示例代码 --部分脚本规范 --一、创建存储过程 --1、判断数据库中是否存在要创建的存储过程,如果存在先drop掉 if exists (select * from dbo.sysobjects where id = object_id(n'[dbo]....

  • sql语句编写规则 1.查询语句的使用原则 (1)索引的正确使用 合理的使用正确的索引是提高系统执行效率的关键因素,对索引的使用需要注意以下一些问题: ①过度索引 一般情况下,使用索引可以缩短查询语句的...

  • 在性能问题中sql语句的编写又是重中之重。因此,为提高各个事业部相应产品的执行效率,提高软件的性能,实现从功能要求到性能要求的转变,特编写此专题文章。 二. sql的优化器执行分析 在oracle rdbms server软件...

  • sql注入是较为普遍的互联网攻击方法,它并不是通过电脑操作系统的bug来完成攻击,而是对于程序编写时的疏漏,利用sql语句,达到无帐号登录,乃至改动数据库的目的。 sql注入产生的原因便是:没经查验或是未充分检验...

  • 第11章 编写脚本和批处理   本章内容简介: • 如何在脚本和批处理中结合t-sql语句 • 变量和identity值的作用域 • 在脚本中进行错误处理 • 如何从命令行运行批处理 • 如何构建和运行动态sql语句 ...

  • ...数据库sql优化原则 1. sql语句的执行过程 2. 选用适合的oracle优化器 oracle的优化器共有3种: a. rule (基于规则) b. cost (基于成本) c. choose (选择性) 可以

  • 看到别人总结的sql server的存储过程觉得写的很好 ,就拿过来了,希望对大家有帮助。 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) drop proc pro_name go...

  • 结构化查询语言(sql)是数据挖掘分析行业不可或缺的一项技能。对于sql来说,编写查询语句只是第一步,确保查询语句高效并且适合于你的数据库操作工作,才是最重要的。

  • 目录第一章 数据库概述1.1、数据库的好处1.2、数据库的常见概念1.3、数据库的存储特点1.4、数据库的常见分类1.5、sql语言的分类第二章 sql server概述2.1、sql server的概述2.2、sql server的下载2.3、sql server的...

  • sql性能优化:sql server 怎么添加全文索引 语法深度剖析 测试

  • sql 注入 (sqli) 是一种可以访问敏感或私有数据的隐蔽攻击形式,它们最早是在上世纪末被发现的,尽管它们的年龄很大,但它们经常被用作黑客工具包中的一种有效技术。今天,给大家介绍一下顶级 sqli 检测工具。 顶级 ...

  • 背景:boss需要我写一个工厂采集端到服务器端的数据同步触发器,数据库采用的是sqlserver2008 需求:将多台采集机的数据同步到服务器中,如果采集端数据库与服务器数据库连接失败则将数据保存到记录表中 前期思路...

global site tag (gtag.js) - google analytics