顺丰科技面试准备

SQL调优及函数

随着数据库数据增多,SQL语句的效率会变的越来越重要。

索引

索引可以大幅度增加SQL查询的速度,通常用B树实现,这样在严格B树下,n个数据最多只需要log(n)次查询就可以访问到。

缺点:

  • 表数据改变时,索引表也需要改变
  • 额外磁盘空间,1.2倍表大小

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致(聚集索引一致)

  • 定义主键的数据列一定要建立索引
  • 定义有外键的数据列一定要建立索引
  • 对于经常查询的数据列最好建立索引

存储过程

我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

存储过程通常有以下优点:

  • 存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
  • 存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
  • 存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
  • 存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
  • 存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

进程调度

  • 非抢占式
  • 抢占式

评价指标

CPU利用率

CPU是计算机系统中的稀缺资源,所以应在有具体任务的情况下尽可能使CPU保持忙,从而使得CPU资源利用率最高。
CPU利用率 = CPU利用的时间 / 开机运行的总时间

吞吐量

CPU运行时的工作量大小是以每单位时间所完成的进程数目来描述的,即称为吞吐量。

周转时间

指从进程创建到作进程结束所经过的时间,这期间包括了由于各种因素(比如等待I/O操作完成)导致的进程阻塞,处于就绪态并在就绪队列中排队,在处理机上运行所花时间的总和。

作业的周转时间:

  • 周转时间 = 作业完成时间 - 作业提交时间
  • 平均周转时间是指多个作业周转时间的平均值:
  • 平均周转时间 = (作业1的周转时间 + … + 作业 n 的周转时间) / n
  • 带权周转时间是指作业周转时间与作业实际运行时间的比值:
  • 带权周转时间 = 作业周转时间 / 作业实际运行时间
  • 平均带权周转时间是指多个作业带权周转时间的平均值:
  • 平均带权周转时间 = (作业1的带权周转时间 + … + 作业 n 的带权周转时间) / n

等待时间

即进程在就绪队列中等待所花的时间总和。因此衡量一个调度算法的简单方法就是统计进程在就绪队列上的等待时间。

响应时间

指从事件(比如产生了一次时钟中断事件)产生到进程或系统作出响应所经过的时间。在交互式桌面计算机系统中,用户希望响应时间越快越好,但这常常要以牺牲吞吐量为代价。

常用算法

  • FCFS(First come first serve)
  • SJF(Short job first)
  • RR(Round Robin)
  • PR(Priority First)

Spring

Spring是怎么控制事物的

spring的事务是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序。最大的好处是大大减少了代码量,简化了程序,提高了工作效率。

  • IoC控制反转:控制权由对象本身转向容器,由容器对bean对象进行控制。
  • AOP面向切面编程:把具体的类创建对应的代理类,通过代理类来对具体类进行操作。

spring是一个容器,通过spring这个容器来对对象进行管理,根据配置文件来实现spring对对象的管理。

常见的锁

自旋锁

自旋锁可以使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环,(即所谓的自旋,就是自己执行空循环),若在若干个空循环后,线程如果可以获得锁,则继续执行。若线程依然不能获得锁,才会被挂起。

偏向锁

如果程序没有竞争,则取消之前已经取得锁的线程同步操作。也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式。

同步方式

参考资料

http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
http://blog.csdn.net/guoweimelon/article/details/50847532
http://bbs.csdn.net/topics/390632361