当前位置:首页 » 文件传输 » 访问效率从高到低
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

访问效率从高到低

发布时间: 2022-09-14 21:11:37

‘壹’ 堆和栈访问效率哪个更高

1. 栈分配的软件优势: 栈分配算法简单,所以高效;堆分配算法相对比较复杂。 栈分配的硬件优势: 主要两点,cache和内存映射。 如果在栈上分配小块内存,因为cache和内存映射已经建立 ,则效率会非常高,远远优于堆分配。 如果在栈上分配大块内存,在不考虑爆栈的情况下,其实两者效率差不到哪去 。因为cache命中和内存映射总是在有限的大小进行的,其在栈中分配的大块内存照样cache不命中,而且映射未建立,所以这样的时间相差其实并不太多。2. 1.分配和释放,堆在分配和释放时都要调用函数(MALLOC,FREE),比如分配时会到堆空间去寻找足够大小的空间(因为多次分配释放后会造成空洞),这些都会花费一定的时间,具体可以看看MALLOC和FREE的源代码,他们做了很多额外的工作,而栈却不需要这些。 2.访问时间,访问堆的一个具体单元,需要两次访问内存,第一次得取得指针,第二次才是真正得数据,而栈只需访问一次。另外,堆的内容被操作系统交换到外存的概率比栈大,栈一般是不会被交换出去的。 综上所述,站在操作系统以上的层面来看,栈的效率比堆高。3. 栈快,以下原因: 栈有专门的寄存器,压栈和出栈的指令效率很高,而堆需要由OS动态调度,堆内存可能被OS调度在非物理内存中,或是申请内存不连续,造成碎片过多等问题。 另外,分配方式上,堆都是动态分配的,栈是编译器完成的。栈的分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现4. 由于栈和堆使用的都是用户空间的虚拟内存,而且你说那个用法是作为函数参数,通过指针引用。非要说有区别,可能是第一次访问该内存的时候有可能更快些,理由是当你调用函数是,只想的栈内存一定已经加载到物理内存里面了,页表也已经建好了(在该页没有被置换出去的情况下);指向堆的内存不一定已经映射到物理内存,因此需要处理缺页,建立页表。至于指向的内存都已经加载到物理内存的情况,应该没有区别。5. 栈内存更快,栈是和代码段一同被载入到CPU内存中的,用C写得程序在被编译成机器指令之后,同一个函数栈上的变量会被保存在寄存器中的,并且栈上的内存基本上都是在编译的时候就确定了得,由于CPU的运算原理明显依赖寄存器的,所以栈上的内存访问速度明显比堆上快,现在CPU的设计一、二级缓存的大小已经最后栈内存的使用,所以效率明显要高很多,而堆上的内存由于和函数栈不在同一个地址段,所以堆上的内存很有可能不在寄存器或者CUP缓存中,访问命中率就低,同时效率也就会低很多,因为要出发好多系统内核调用,内存需要从硬盘到内存到CUP缓存再到寄存器。6. 栈效率更高,因为堆分配分配了之后还要与存储器之间建立映射,而栈分配则是之前就建立好了。

‘贰’ 数组和链表的优缺点

数组

一、数组的特点

1.在内存中,数组是一块连续的区域
2.数组需要预留空间

在使用前需要提前申请所占内存的大小,这样不知道需要多大的空间,就预先申请可能会浪费内存空间,即数组空间利用率低
ps:数组的空间在编译阶段就需要进行确定,所以需要提前给出数组空间的大小(在运行阶段是不允许改变的)

3.在数组起始位置处,插入数据和删除数据效率低。

插入数据时,待插入位置的的元素和它后面的所有元素都需要向后搬移
删除数据时,待删除位置后面的所有元素都需要向前搬移

4.随机访问效率很高,时间复杂度可以达到O(1)

因为数组的内存是连续的,想要访问那个元素,直接从数组的首地址处向后偏移就可以访问到了

5.数组开辟的空间,在不够使用的时候需要扩容,扩容的话,就会涉及到需要把旧数组中的所有元素向新数组中搬移
6.数组的空间是从栈分配的

二、数组的优点

随机访问性强,查找速度快,时间复杂度为O(1)

三、数组的缺点

1.头插和头删的效率低,时间复杂度为O(N)
2.空间利用率不高
3.内存空间要求高,必须有足够的连续的内存空间
4.数组空间的大小固定,不能动态拓展

链表

一、链表的特点

1.在内存中,元素的空间可以在任意地方,空间是分散的,不需要连续
2.链表中的元素都会有两个属性,一个是元素的值,另一个是指针,此指针标记了下一个元素的地址

每一个数据都会保存下一个数据的内存的地址,通过此地址可以找到下一个数据

3.查找数据时效率低,时间复杂度为O(N)

因为链表的空间是分散的,所以不具有随机访问性,如要需要访问某个位置的数据,需要从第一个数据开始找起,依次往后遍历,直到找到待查询的位置,故可能在查找某个元素时,时间复杂度达到O(N)

4.空间不需要提前指定大小,是动态申请的,根据需求动态的申请和删除内存空间,扩展方便,故空间的利用率较高
5.任意位置插入元素和删除元素效率较高,时间复杂度为O(1)
6.链表的空间是从堆中分配的

二、链表的优点

1.任意位置插入元素和删除元素的速度快,时间复杂度为O(1)
2.内存利用率高,不会浪费内存
3.链表的空间大小不固定,可以动态拓展

三、链表的缺点

随机访问效率低,时间复杂度为0(N)

数组和链表操作空间复杂度表格对比图

综上:

对于想要快速访问数据,不经常有插入和删除元素的时候,选择数组。

对于需要经常的插入和删除元素,而对访问元素时的效率没有很高要求的话,选择链表。

‘叁’ 如何提高访问客户的有效率

第一、要善于反思以前的工作,总结经验,吸取教训 一个优秀的推销员要善于反思以往的工作,并从中总结出成功的经验和失败的教训,以便将以后的工作做的更好。失败乃成功之母,没有失败的教训,就没有以后的成功。不管你以前的推销工作是成功的,还是失败的,你都要认真的加以剖析,从中总结经验教训。因为只有这样,你才能更好的改进以往的不足,更好的做好以后的推销工作。 第二、向优秀的推销员学习 工作效果不好,比什么都糟糕。不论什么时候,都应该向他人学习。不要怕犯错误,只有傻瓜才以为自己不犯错误,自以为是,完全是出于显示自己的目的。要有知难而进,奋发努力和知错必改的工作态度,任何知识和天才都不能代替这种良好的工作态度和进取精神。推销工作比其它任何工作都更需要这种态度和精神。一个推销员要想提高自己的推销效率,应该具有空杯之心,倒空自己(并非全盘否定),不断地学习各种业务知识及销售技巧 ,不断地学习其它推销员(前人、同事及竞争对手)的成功经验,吸取他们失败的教训。 第三、要制定出切实可行的销售计划 推销员每天都有很多事情要做:私事、琐事、突发事件,然后才是与推销有关之事。那么怎样才能不让自己沉沦于每天的私事与琐事中,有更充沛的时间去完成自己的销售工作呢?这就要制定计划,安排好每天的工作,并有计划地去实施每次拜访工作。准备工作是推销工作的一部分。在拜访一位顾客前,认真地思考一下,并制定出具体的计划:首先,你要清楚你的顾客是谁,他是干什么的;他有什么特点和爱好;他有没有决定权;他有什么需求。另外还要分析一下自己能否满足顾客的需求。和怎样去进行推销才能满足顾客的需求。最重要的是要弄清楚你这次拜访准备达到什么目的,因为只有这样,才能对此次拜访是否成功进行评价,才能总结经验教训,才能为下次拜访做好准备。 第四、进一步提高拜访客户的效率如果所有的顾客都敞开办公室的大门,热情地欢迎推销员,早已准备好笔墨与你签合同,那么推销工作就真是轻而易举而又一本万利的事情了。但事实并非如此,推销员在推销产品的过程中,往往会碰到很多意想不到的事情:客户迟迟不肯做购买决定、客户的拒绝购买、甚至是对产品毫无兴趣,还有的时候,你跑了很远的路去拜访你的客户白跑一趟,见不到顾客。所有的推销员都希望自己拜访的客户能接受自己的产品,希望提高客户拜访的成功率,那么怎样才能做到这些呢? ①是线而不是点的拜访客户 ②明确告诉客户每次拜访的目的 ③要做好客户访问记录 ④更有效地利用推销时间 第五、增大客户拜访量 不要坐等顾客前来拜访你,如果你想得到更多的订单,就必须更多地拜访客户。因为一个优秀的推销员只有通过两种方法才能增加他的销售量:拜访更多的客户,或者多次拜访客户。一个推销员拜访的客户越多,就会有越多的人有可能购买他的产品。如果一个推销员一天到晚躺在被窝里懒得出去、懒得见人、懒得与人沟通,那么请问,客户从何而来呢?会从天上掉下来吗?或者客户会自动找到你的门上吗?我们大家都很清楚地知道,这是绝对不可能的。 第六、正确处理客户的拒绝 有人说:成交=多次拒绝+最后一次努力。逆境不久,强者永存。如果面对客户的一次拒绝就退缩,或无计可施,那么只能失去这个客户了。如果你不是采用强硬的态度进行推销,那么即使你遭到客户的拒绝,也应友好言别。经过一段时间,你自然还要去拜访他,因为经过这段时间,也许顾客已改变了自己的决定。即使他没有改变态度,你也要去友好的面对,逃避不是解决问题的办法。 客户拒绝的真正理由有以下几点:①本能的反应;②对你的产品了解不够;③对推销员不信任(推销本身的推销方法有问题);④自己拿不定主意;⑤想和其它同类产品做比较;⑥没钱。其实,客户的这些拒绝理由,都是可以妥善解决的,如果你处理的好,他就最终会购买你的产品。 第七、争夺竞争对手的客户 市场是有限的,客户资源也是有限的,所以,一种产品的销售空间也是有限的。而目前,这有限的市场空间,已被越来越多的品牌挤的水泄不通, 销售员要想占领更大的销售空间、得到更多的客户,就必须从竞争对手的手中去争夺。否则,推销工作将无从下手,更无法提高自己的推销效率。 第八、防止竞争对手抢夺自己的客户 即使推销员已经得到了顾客的定单,但他们推销工作还没有结束。一个有责任感的推销员,在得到定单后,对所发生的一切还应该继续承担责任,还要尽可能向顾客提供各种服务。 推销员在售出产品后,为了给以后的工作奠定良好的基础,他们还应该时刻关心老客户,保持同他们的良好关系。因为不管他们承认与否,在这方面的任何失误都会使推销工作受到损失。而如果顾客对一切都感到满意的话,他就会成为你的忠实的客户和朋友,也会给你介绍一些新的顾客。推销员定期的对老客户进行回访,对自己的推销工作会有很大的帮助。

‘肆’ java Web项目访问效率问题

启动服务的时候就将xml配置文件读取出来,放在内存中,那么读取效率绝对比数据库来得生猛,且500条数据,如果name和value都不是那种长字符串的话,也不算太大,内存可抗得住;
关键是,并发量,10000人同时在线去访问,考虑到每一个访问所产生的内存消耗,估计你也不会认为1000是个小数目了,况且这是java不是C,Java在内存中运算效率非常好,就是控制内存空间的效率差

‘伍’ 如何提高网络资源共享的效率

我们需要提高共享资源访问效率的话,就必须对目标共享资源进行有效管理。
1. 设置共享资源为只读属性

很多时候,在将自己的重要资料共享给局域网中的其他用户访问时,我们往往有很大的随意性,动不动就将目标共享文件夹设置成完全共享。这种做法不但会危及到共享资源的安全性,而且还会降低共享资源的访问效率,因为一旦将目标共享资源的属性设置为完全共享时,系统就会耗费时间对每一次共享访问的各种权限进行搜索确认,很显然这会降低共享资源的访问速度。为了尽可能提高共享资源访问效率,我们平时只需要将自己的共享资源设置成只读属性就可以了,下面就是修改共享资源访问属性的具体操作步骤:

首先打开本地工作站中的“我的电脑”窗口,从中找到目标共享资源所在的文件夹,并用鼠标单击该共享文件夹图标,从弹出的快捷菜单中执行“属性”命令,在其后出现的共享资源属性设置窗口中单击“共享”标签;

接着在对应标签设置页面中单击“权限”按钮,打开如图1所示的权限设置对话框,检查其中的“完全控制”复选项是否处于选中状态,要是发现该选项已经被选中时,我们需要及时取消它的选中状态,同时选中“读取”选项,最后单击“确定”按钮结束共享资源属性设置操作,如此一来我们就能有效提高目标共享资源的访问速度了。

图1

当然,要是本地工作站的自身硬件性能配置不是很高时,我们还可以对目标共享资源的并发连接访问数量进行适当控制,以避免局域网中的多个用户同时访问目标共享资源时,导致本地系统无法响应或者响应速度缓慢,从而降低共享访问速度。在控制共享资源的并发连接访问数量时,我们只要在目标共享资源的共享标签设置页面中,找到“用户数限制”设置选项,并将该选项数值设置成不能超过5个或10个,最后单击“确定”按钮就能使设置生效了。

2. 移动共享资源让属性不变

为了提高共享资源的访问效率,我们时常需要将目标共享资源从运行速度慢的服务器系统中移动到运行速度快的服务器系统中,可是通过简单拷贝、复制的方法来移动共享资源时,我们会发现共享资源的属性信息会在移动过程中发生丢失现象,这样一来我们就需要面临重新设置共享属性信息的麻烦,很显然这样会降低网络管理员的工作效率。那么我们如何才能有效保留目标共享资源的各种属性信息,而不需要对它进行重新设置呢?其实很简单,我们只要按照如下操作步骤进行移动共享资源就可以了:

首先在移动共享资源之前,进入到目标共享资源所在的源服务器系统中,依次单击“开始”/“运行”命令,在弹出的系统运行对话框中,输入字符串命令“regedit”,单击“确定”按钮后,打开对应系统的注册表编辑窗口;

其次在注册表编辑窗口中,用鼠标依次选中“HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/lanmanserver/Shares”注册表分支选项,之后用鼠标右键单击“Shares”分支选项,从弹出的快捷菜单中执行“导出”命令(如图2所示),以便将对应系统中的所有共享资源及其属性信息导出保存为reg格式的注册表文件;

图2

下面登录进目标服务器系统中,并将前面生成的reg格式注册表文件拷贝到该系统中,同时将目标共享资源拷贝到该系统的对应目录中,接着用鼠标双击reg格式注册表文件,如此一来目标共享资源的属性信息也就一并被导入到新服务器系统中了;

最后,我们还需要在新服务器系统重新启动一下Server服务,才能使共享资源属性正确显示出来。在重启Server服务时,我们可以依次单击“开始”/“运行”命令,在弹出的系统运行对话框中,输入字符串命令“services.msc”,单击“确定”按钮后,打开新服务器系统的服务列表窗口;找到其中的Server服务选项,并用鼠标双击该选项,打开该服务的属性设置窗口,在该设置窗口中先单击“停止”按钮,之后再重新单击“启动”按钮,如此一来Server服务的重新启动操作就算完成了。

3. 提高共享资源打开速度

每次访问Vista工作站中的共享资源时,我们发现尝试进入目标共享资源的目录窗口时,Vista系统总要自动先计算共享资源的打开剩余时间,等到计算出结果后才会将共享内容显示出来,很明显Vista系统的计算剩余时间功能会降低共享资源的打开速度。为了让共享资源打开速度不受影响,我们不妨按照如下操作将Vista系统新增加的计算剩余时间功能给关闭掉:

首先在Vista工作站系统桌面中打开“开始”菜单,依次选择“设置”/“控制面板”选项,打开对应系统的控制面板窗口,用鼠标双击其中的“程序”选项,再单击其后窗口中的“程序和功能”选项,进入对应工作站系统的程序和功能设置窗口;

其次单击该设置窗口左侧显示区域中的“打开或关闭Windows功能”项目,打开如图3所示的设置对话框,取消“Remove Differential Compression”项目的选中状态,并单击对应设置框中的“确定”按钮,这样的话Vista系统的计算剩余时间功能就被关闭掉了,日后我们再次尝试打开目标共享资源时,就会感觉到速度明显快了许多。

‘陆’ j2ee中有哪几种远程调用协议,这几种通信效率从高到低分别是什么

1、直接调用
直接调用的所有毫时都接近0,这说明程序处理几乎没有花费时间,记录的全部时间都是远程调用耗费的。
2、RMI调用
与设想的一样,RMI理所当然是最快的,在几乎所有的情况下,它的毫时都是最少的。特别是在数据结构复杂,数据量大的情况下,与其他协议的差距尤为明显。
为了充分发挥RMI的性能,另外做了测试类,不使用Spring,用原始的RMI形式(继承UnicastRemoteObject对象)提供服务并远程调用,与Spring对POJO包装成的RMI进行效率比较。结果显示:两者基本持平,Spring提供的服务还稍快些。
初步认为,这是因为Spring的代理和缓存机制比较强大,节省了对象重新获取的时间。
3、Hessian调用
caucho公司的resin服务器号称是最快的服务器,在java领域有一定的知名度。Hessian做为resin的组成部分,其设计也非常精简高效,实际运行情况也证明了这一点。平均来看,Hessian较RMI要慢20%左右,但这只是在数据量特别大,数据结构很复杂的情况下才能体现出来,中等或少量数据时,Hessian并不比RMI慢。
Hessian的好处是精简高效,可以跨语言使用,而且协议规范公开,我们可以针对任意语言开发对其协议的实现。目前已有实现的语言有:java, c++, .net, python, ruby。还没有delphi的实现。
另外,Hessian与WEB服务器结合非常好,借助WEB服务器的成熟功能,在处理大量用户并发访问时会有很大优势,在资源分配,线程排队,异常处理等方面都可以由成熟的WEB服务器保证。而RMI本身并不提供多线程的服务器。而且,RMI需要开防火墙端口,Hessian不用。
4、Burlap调用
Burlap与Hessian都是caucho公司的开源产品,只不过Hessian采用二进制的方式,而Burlap采用xml的格式。
测试结果显示,Burlap在数据结构不复杂,数据量中等的情况下,效率还是可以接受的,但如果数据量大,效率会急剧下降。平均计算,Burlap的调用毫时是RMI的3倍。
我认为,其效率低有两方面的原因,一个是XML数据描述内容太多,同样的数据结构,其传输量要大很多;另一方面,众所周知,对xml的解析是比较费资源的,特别对于大数据量情况下更是如此。
5、HttpInvoker调用
HttpInvoker是SpringFramework提供的JAVA远程调用方法,使用java的序列化机制处理对象的传输。从测试结果看,其效率还是可以的,与RMI基本持平。
不过,它只能用于JAVA语言之间的通讯,而且,要求客户端和服务端都使用SPRING框架。
另外,HttpInvoker 并没有经过实践的检验,目前还没有找到应用该协议的项目。
6、web service调用
本次测试选用了apache的AXIS组件作为WEB SERVICE的实现,AXIS在WEB SERVICE领域相对成熟老牌。
为了仅测试数据传输和编码、解码的时间,客户端和服务端都使用了缓存,对象只需实例化一次。但是,测试结果显示,web service的效率还是要比其他通讯协议慢10倍。
如果考虑到多个引用指向同一对象的传输情况,web service要落后更多。因为RMI,Hessian等协议都可以传递引用,而web service有多少个引用,就要复制多少份对象实体。
Web service传输的冗余信息过多是其速度慢的原因之一,监控发现,同样的访问请求,描述相同的数据,web service返回的数据量是hessian协议的6.5倍。另外,WEB SERVICE的处理也很毫时,目前的xml解析器效率普遍不高,处理xml <-> bean很毫资源。从测试结果看,异地调用比本地调用要快,也从侧面说明了其毫时主要用在编码和解码xml文件上。这比冗余信息更为严重,冗余信息占用的只是网络带宽,而每次调用的资源耗费直接影响到服务器的负载能力。(MS的工程师曾说过,用WEB SERVICE不能负载100个以上的并发用户。)

‘柒’ 如何提高数据库访问效率

查询速度慢的原因很多,常见如下几种:

1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)

2、I/O吞吐量小,形成了瓶颈效应。

3、没有创建计算列导致查询不优化。

4、内存不足

5、网络速度慢

6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)

7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)

8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。

9、返回了不必要的行和列

10、查询语句不好,没有优化

可以通过如下方法来优化查询 :

1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,sql2000不在支持。数据量(尺寸)越大,提高I/O越重要.

2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)

3、升级硬件

4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段

5、提高网速;

6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。

7、增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT,DELETE还不能并行处理。

8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。

9、DB Server 和APPLication Server 分离;OLTP和OLAP分离

10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件'分区视图')

a、在实现分区视图之前,必须先水平分区表

b、在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。

11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。 在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:

1、 查询语句的词法、语法检查

2、 将语句提交给DBMS的查询优化器

3、 优化器做代数优化和存取路径的优化

4、 由预编译模块生成查询规划

5、 然后在合适的时间提交给系统处理执行

6、 最后将执行结果返回给用户其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。

12、Commit和rollback的区别 Rollback:回滚所有的事物。 Commit:提交当前的事物. 没有必要在动态SQL里写事物,如果要写请写在外面如: begin tran exec(@s) commit trans 或者将动态SQL 写成函数或者存储过程。

13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。

14、SQL的注释申明对执行没有任何影响

15、尽可能不使用光标,它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在客户端循环,用临时表,Table变量,用子查询,用Case语句等等。游标可以按照它所支持的提取选项进行分类: 只进 必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是默认方式。可滚动性 可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(Update),且在组成结果集的行中没有锁。 OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新某一行。当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。如果用户试图修改某一行,则此行的当前值会与最后一次提取此行时获取的值进行比较。如果任何值发生改变,则服务器就会知道其他人已更新了此行,并会返回一个错误。如果值是一样的,服务器就执行修改。 选择这个并发选项�OPTIMISTIC WITH ROW VERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server 中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有 timestamp 列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某 个表具有 timestamp 列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需比较 timestamp 列即可。如果应用程序对没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。 SCROLL LOCKS 这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁的读取。滚动锁根据在游标定义的 SELECT 语句中指定的锁提示,这些游标并发选项可以生成滚动锁。滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务器为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一个提交或回滚操作之后。如果提交时关闭游标的选项为关,则 COMMIT 语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项和游标 SELECT 语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定 未锁定 更新 NOLOCK 未锁定 未锁定 未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新 UPDLOCK 错误 更新 更新 更新 TABLOCKX 错误 未锁定 未锁定 更新其它 未锁定 未锁定 未锁定 更新 *指定 NOLOCK 提示将使指定了该提示的表在游标内是只读的。

16、用Profiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引

17、注意UNion和UNion all 的区别。UNION all好

18、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的

19、查询时不要返回不需要的行、列

20、用sp_configure 'query governor cost limit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。SET LOCKTIME设置锁的时间

21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行

22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'",因为他们不走索引全是表扫描。也不要在WHere字句中的列名加函数,如Convert,substring等,如果必须用函数的时候,创建计算列再创建索引来替代.还可以变通写法:WHERE SUBSTRING(firstname,1,1) = 'm'改为WHERE firstname like 'm%'(索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,"NOT", "NOT EXISTS", "NOT IN"能优化她,而"<>"等还是不能优化,用不到索引。

23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。

24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引:

SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN ('男','女')

25、将需要查询的结果预先计算好放在表中,查询的时候再SELECT。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。

26、MIN() 和 MAX()能使用到合适的索引。

27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers, Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procere.这样不仅维护工作小,编写程序质量高,并且执行的速度快。

28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌INsert来插入(不知JAVA是否)。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作: 方法:

Create procere p_insert as insert into table(Fimage) values (@image)

在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。

29、Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别。

select * from chineseresume where title in ('男','女')
Select * from chineseresume where title between '男' and '女'
是一样的。由于in会在比较多次,所以有时会慢些。

30、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源。他的创建同是实际表一样。

31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用它。

32、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。

33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored procere来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。

34、没有必要时不要用DISTINCT和ORDER BY,这些动作可以改在客户端执行。它们增加了额外的开销。这同UNION 和UNION ALL一样的道理。

select top 20 ad.companyname,comid,position,ad.referenceid,worklocation,
convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM
jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345',
'JCNAD00333138','JCNAD00303570','JCNAD00303569',
'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',
'JCNAD00254567','JCNAD00254585','JCNAD00254608',
'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',
'JCNAD00279196','JCNAD00268613') order by postdate desc

35、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。

36、当用SELECT INTO时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创建临时表时用显示申明语句,而不是

select INTO. drop table t_lxh begin tran select * into t_lxh from chineseresume
where name = 'XYZ' --commit

在另一个连接中SELECT * from sysobjects可以看到 SELECT INTO 会锁住系统表,Create table 也会锁系统表(不管是临时表还是系统表)。所以千万不要在事物内使用它!!!这样的话如果是经常要用的临时表请使用实表,或者临时表变量。

37、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快

38、一次更新多条记录比分多次更新每次一条快,就是说批处理好

39、少用临时表,尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好

40、在SQL2000下,计算字段是可以索引的,需要满足的条件如下:

a、计算字段的表达是确定的

b、不能用在TEXT,Ntext,Image数据类型

c、必须配制如下选项 ANSI_NULLS = ON, ANSI_PADDINGS = ON, …….

41、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持,所以不得不将这个工作放在其他的层上而增加网络的开销。SQL2000支持UDFs,现在支持复杂的数学计算,函数的返回值不要太大,这样的开销很大。用户自定义函数象光标一样执行的消耗大量的资源,如果返回大的结果采用存储过程

42、不要在一句话里再三的使用相同的函数,浪费资源,将结果放在变量里再调用更快

43、SELECT COUNT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别: select count(Field of null) from Table 和 select count(Field of NOT null) from Table 的返回值是不同的!!!

44、当服务器的内存够多时,配制线程数量 = 最大连接数+5,这样能发挥最大的效率;否则使用 配制线程数量<最大连接数启用SQL SERVER的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务器的性能。

45、按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好,死锁很难被发现

46、通过SQL Server Performance Monitor监视相应硬件的负载 Memory: Page Faults / sec计数器如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。

Process:

1、% DPC Time 指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在运行的为比标准间隔优先权低的间隔)。 由于 DPC 是以特权模式执行的,DPC 时间的百分比为特权时间 百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间百分比的平均忙时。

2、%Processor Time计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。

3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。 特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显示。

4、% User Time表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。 Physical Disk: Curretn Disk Queue Length计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。 SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。 注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。

47、分析select emp_name form employee where salary > 3000 在此语句中若salary是Float类型的,则优化器对其进行优化为Convert(float,3000),因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。同样字符和整型数据的转换。

48、查询的关联同写的顺序

select a.personMemberID, * from chineseresume a,personmember b where personMemberID
= b.referenceid and a.personMemberID = 'JCNPRH39681' (A = B ,B = '号码')

select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID
= b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' (A = B ,B = '号码', A = '号码')

select a.personMemberID, * from chineseresume a,personmember b where b.referenceid
= 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' (B = '号码', A = '号码')

49、

(1)IF 没有输入负责人代码 THEN code1=0 code2=9999 ELSE code1=code2=负责人代码 END IF 执行SQL语句为: SELECT 负责人名 FROM P2000 WHERE 负责人代码>=:code1 AND负责人代码 <=:code2

(2)IF 没有输入负责人代码 THEN SELECT 负责人名 FROM P2000 ELSE code= 负责人代码 SELECT 负责人代码 FROM P2000 WHERE 负责人代码=:code END IF 第一种方法只用了一条SQL语句,第二种方法用了两条SQL语句。在没有输入负责人代码时,第二种方法显然比第一种方法执行效率高,因为它没有限制条件;在输入了负责人代码时,第二种方法仍然比第一种方法效率高,不仅是少了一个限制条件,还因相等运算是最快的查询运算。我们写程序不要怕麻烦

50、关于JOBCN现在查询分页的新方法(如下),用性能优化器分析性能的瓶颈,如果在I/O或者网络的速度上,如下的方法优化切实有效,如果在CPU或者内存上,用现在的方法更好。请区分如下的方法,说明索引越小越好。

begin
DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))
insert into @local_variable (ReferenceID)
select top 100000 ReferenceID from chineseresume order by ReferenceID
select * from @local_variable where Fid > 40 and fid <= 60
end



begin
DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))
insert into @local_variable (ReferenceID)
select top 100000 ReferenceID from chineseresume order by updatedate
select * from @local_variable where Fid > 40 and fid <= 60
end

的不同

begin
create table #temp (FID int identity(1,1),ReferenceID varchar(20))
insert into #temp (ReferenceID)
select top 100000 ReferenceID from chineseresume order by updatedate
select * from #temp where Fid > 40 and fid <= 60 drop table #temp
end

‘捌’ 在顺序表和链表中实现顺序访问,哪个效率高

顺序访问顺序表和链表时间复杂度是一样的 实际应用的时候顺序表应该会比链表速度快些,除了链表的指针操作比数组下标操作略慢外,还有CPU流水线,cache失效,内存缺页等问题,顺序表都比链表好很多