当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:20:00  来源:本站整理

关于SQLServer的若干注意事项[MSSQL防范]

赞助商链接



  本文“关于SQLServer的若干注意事项[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

关于sql server的若干注意事项www.想自杀iTbulo.comhZ04f

        假如你正在负责一个基于SQL Server的项目,大概你方才接触SQL Server,你都有大概要面对一些数据库性能的问题,这篇文章会为你供应一些有效的指导(此中大大都也可以用于别的的DBMS).www.想自杀iTbulo.comhZ04f

        在这里,我不打算介绍利用SQL Server的诀窍,也不能供应一个包治百病的筹划,我所做的是总结一些经验----关于若何形成一个好的计划.这些经验来自我过去几年中承受的教导,一向来,我看到很多一样的计划错误被一次又一次的反复.www.想自杀iTbulo.comhZ04f

你理解你的工具吗?www.想自杀iTbulo.comhZ04f

        不要轻蔑这一点,这是我在这篇文章中报告的最关键的一条.大概你也看到有很多的SQL Server程序员没有掌握全部的T-SQL号令和SQL Server供应的那些有效的工具.www.想自杀iTbulo.comhZ04f

        "什么?我要浪费一个的时间来学习那些我永久也不会用到的SQL号令???",你大概会这样说.对的,你不需求这样做.但是你应当用一个周末浏览全部的T-SQL号令.在这里,你的任务是理解,将来,当你计划一个查询时,你会记起来:"对了,这里有一个号令可以完好实现我需求的功效",于是,到MSDN查看这个号令的切当语法.www.想自杀iTbulo.comhZ04f

不要利用游标www.想自杀iTbulo.comhZ04f

       让我再反复一遍:不要利用游标.假如你想破坏整个系统的性能的话,它们倒是你最有效的首选办法.大大都的初学者都利用游标,而没有意识到它们对性能造成的影响.它们占用内存,还用它们那些难以想象的方法锁定表,别的,它们简直就像蜗牛.而最糟糕的是,它们可以使你的DBA所能做的一切性能优化等于没做.不知你能否知道每履行一次FETCH就等于履行一次SELECT号令?这意味着假如你的游标有10000条记录,它将履行10000次SELECT!假如你利用一组SELECT、UPDATE大概DELETE来完成呼应的工作,那将有效率的多.www.想自杀iTbulo.comhZ04f

       初学者普通认为利用游标是一种对比熟习和舒服的编程方法,可很不幸,这会招致糟糕的性能.明显,SQL的总体目的是你要实现什么,而不是怎样实现.www.想自杀iTbulo.comhZ04f

       我曾经用T-SQL重写了一个基于游标的存储历程,那个表只有100,000条记录,本来的存储历程用了40分钟才履行完毕,而新的存储历程只用了10秒钟.在这里,我想你应当可以看到一个不称职的程序员毕竟在干了什么!!!www.想自杀iTbulo.comhZ04f

       我们可以写一个小程序来获得和处理数据并且更新数据库,这样做有时会更有效.记着:关于循环,T-SQL无能为力.www.想自杀iTbulo.comhZ04f

        我再重新提醒一下:利用游标没有好处.除了DBA的工作外,我历来没有看到过利用游标可以有效的完成任何工作.www.想自杀iTbulo.comhZ04f

标准化你的数据表www.想自杀iTbulo.comhZ04f

       为什么不标准化数据库?大约有两个捏词:出于性能的考虑和纯粹因为怠惰.至于第二点,你早晚得为此付出代价.而关于性能的问题,你不需求优化根本就不慢的东西.我常常看到一些程序员"反标准化"数据库,他们的来由是"本来的计划太慢了",可后果却常常是他们让系统更慢了.DBMS被计划用来处理标准数据库的,因此,记着:按照标准化的要求计划数据库.www.想自杀iTbulo.comhZ04f

不要利用SELECT *www.想自杀iTbulo.comhZ04f

        这点不太简单做到,我太理解了,因为我自己就常常这样干.但是,假如在SELECT中指定你所需求的列,那将会带来以下的好处:www.想自杀iTbulo.comhZ04f

1 削减内存耗费和网络的带宽www.想自杀iTbulo.comhZ04f

2 你可以得到更安全的计划www.想自杀iTbulo.comhZ04f

3 给查询优化器机会从索引读取全部需求的列www.想自杀iTbulo.comhZ04f

理解你将要对数据举行的操作www.想自杀iTbulo.comhZ04f

       为你的数据库成立一个结实的索引,那但是功德一件.可要做到这一点简直就是一门艺术.每当你为一个表增添一个索引,SELECT会更快了,可INSERT和DELETE却大大的变慢了,因为成立了保护索引需求很多额外的工作.明显,这里问题的关键是:你要对这张表举行什么样的操作.这个问题不太好掌控,分外是触及DELETE和UPDATE时,因为这些语句常常在WHERE部份包含SELECT号令.www.想自杀iTbulo.comhZ04f

不要给"性别"列成立索引www.想自杀iTbulo.comhZ04f

       首先,我们必须理解索引是若何加快对表的拜候的.你可以将索引理解为基于一定的尺度上对表举行划分的一种方法.假如你给近似于"性别"这样的列成立了一个索引,你仅仅是将表划分为两部份:男和女.你在处理一个有1,000,000条记录的表,这样的划分有什么意义?记着:保护索引是对比费时的.当你计划索引时,请遵守这样的法则:按照列大概包含差别内容的数目从多到少布列,比方:姓名+省份+性别.www.想自杀iTbulo.comhZ04f

利用事件www.想自杀iTbulo.comhZ04f

       请利用事件,分外是当查询对比耗时.假如系统呈现问题,这样做会救你一命的.普通有些经验的程序员都有领会-----你常常会碰到一些不可意料的情形会招致存储历程崩溃.www.想自杀iTbulo.comhZ04f

当心死锁www.想自杀iTbulo.comhZ04f

       按照一定的次序来拜候你的表.假如你先锁住表A,再锁住表B,那么在全部的存储历程中都要按照这个次序来锁定它们.假如你(不经意的)某个存储历程中先锁定表B,再锁定表A,这大概就会招致一个死锁.假如锁定次序没有被预先具体的计划好,死锁是不太简单被发现的.www.想自杀iTbulo.comhZ04f

不要翻开大的数据集www.想自杀iTbulo.comhZ04f

       在CSDN技术论坛中 :),一个常常被提出的问题是:我怎样才能疾速的将100000条记录增添到ComboBox中?这是不对的,你不能也不需求这样做.很简单,你的用户要浏览100000条记录才能找到需求的记录,他一定会咒骂你的.在这里,你需求的是一个更好的UI,你需求为你的用户显示不超越100或200条记录.www.想自杀iTbulo.comhZ04f

不要利用服务器端游标www.想自杀iTbulo.comhZ04f

       与服务器端游标比起来,客户端游标可以削减服务器和网络的系统开销,并且还削减锁按时间.www.想自杀iTbulo.comhZ04f

利用参数查询www.想自杀iTbulo.comhZ04f

       有时,我在CSDN技术论坛看到近似这样的问题:"SELECT * FROM  a WHERE a.id='A'B,因为单引号查询发生非常,我该怎么办?",而广泛的答复是:用两个单引号替换单引号.这是错误的.这样治标不治本,因为你还会在其他一些字符上碰到这样的问题,更何况这样会招致严重的bug,除此以外,这样做还会使SQL Server的缓冲系统无法施展应有的作用.利用参数查询, 釜底抽薪,这些问题通通不存在了.www.想自杀iTbulo.comhZ04f

在程序编码时利用大数据量的数据库www.想自杀iTbulo.comhZ04f

       程序员在开辟中利用的测试数据库普通数据量都不大,可常常的是终究用户的数据量都很大.我们普通的做法是不对的,缘由很简单:目前硬盘不是很贵,可为什么性能问题却要等到已经无可挽回的时刻才被注意呢?www.想自杀iTbulo.comhZ04f

不要利用INSERT导入大批的数据www.想自杀iTbulo.comhZ04f

       请不要这样做,除非那是必须的.利用UTS大概BCP,这样你可以一举而兼得机动性和速度.www.想自杀iTbulo.comhZ04f

注意超时问题www.想自杀iTbulo.comhZ04f

       查询数据库时,普通数据库的缺省都对比小,比方15秒大概30秒.而有些查询运行时间要比这长,分外是当数据库的数据量不断变大时.www.想自杀iTbulo.comhZ04f

不要忽视同时改正同一记录的问题www.想自杀iTbulo.comhZ04f

       有时刻,两个用户会同时改正同一记录,这样,后一个改正者改正了前一个改正者的操作,某些更新就会丧失.处理这种情形不是很难:成立一个timestamp字段,在写入前查抄它,假如答应,就归并改正,假如存在冲突,提醒用户.www.想自杀iTbulo.comhZ04f

在细节表中插入记录时,不要在主表履行SELECT MAX(ID)www.想自杀iTbulo.comhZ04f

       这是一个广泛的错误,当两个用户在同一时间插入数据时,这会招致错误.你可以利用SCOPE_IDENTITY,IDENT_CURRENT@@IDENTITY.假如大概,不要利用@@IDENTITY,因为在有触发器的情形下,它会惹起一些问题(详见这里的谈论).www.想自杀iTbulo.comhZ04f

避免将列设为NULLablewww.想自杀iTbulo.comhZ04f

    假如大概的话,你应当避免将列设为NULLable.系统会为NULLable列的每一行分配一个额外的字节,查询时会带来更多的系统开销.别的,将列设为NULLable使编码变得复杂,因为每一次拜候这些列时都必须先举行查抄.www.想自杀iTbulo.comhZ04f

    我并非说NULLS是麻烦的本源,固然有些人这样认为.我认为假如你的业务法则中答应"空数据",那么,将列设为NULLable有时会施展很好的作用,但是,假如在近似下面的情形中利用NULLable,那简直就是自讨苦吃.www.想自杀iTbulo.comhZ04f

CustomerName1
CustomerAddress1
CustomerEmail1
CustomerName2
CustomerAddress2
CustomerEmail3
CustomerName1
CustomerAddress2
CustomerEmail3
www.想自杀iTbulo.comhZ04f

   假如呈现这种情形,你需求标准化你的表了.www.想自杀iTbulo.comhZ04f

尽大概不要利用TEXT数据范例www.想自杀iTbulo.comhZ04f

   除非你利用TEXT处理一个很大的数据,不然不要利用它.因为它不易于查询,速度慢,用的不好还会浪费大量的空间.普通的,VARCHAR可以更好的处理你的数据.www.想自杀iTbulo.comhZ04f

尽大概不要利用暂时表www.想自杀iTbulo.comhZ04f

   尽大概不要利用暂时表,除非你必须这样做.普通利用子查询可以替换暂时表.利用暂时表会带来系统开销,假如你是用COM+举行编程,它还会给你带来很大的麻烦,因为COM+利用数据库衔接池而暂时表却自始至终都存在.SQL Server供应了一些替换筹划,比方Table数据范例.www.想自杀iTbulo.comhZ04f

学会解析查询www.想自杀iTbulo.comhZ04f

SQL Server查询解析器是你的好搭档,通过它你可以理解查询和索引是若何影响性能的.www.想自杀iTbulo.comhZ04f

利用参照完好性www.想自杀iTbulo.comhZ04f

定义主健、唯一性约束和外键,这样做可以节俭大量的时间.www.想自杀iTbulo.comhZ04f

 www.想自杀iTbulo.comhZ04f

 www.想自杀iTbulo.comhZ04f

  以上是“关于SQLServer的若干注意事项[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
  • 关于SQL Server中几个未公布的拜候注册表的扩大存储过
  • 关于SQL Server中几个未公布的拜候注册表的扩大存储历程
  • 关于SQL Server数据库备份和恢复特点介绍
  • 关于SQL SERVER的一些安全问题
  • 关于SQLServer的若干注意事项
  • 四种关于SQL查询信息分页的代码
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .