`
lwcheng1985
  • 浏览: 95633 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)使用数据库的几点建议

阅读更多
(From:http://stanlyy.iteye.com/blog/509506)
1、避免将字段设为“允许为空”

2、数据表设计要规范

3、深入分析数据操作所要对数据库进行的操作

4、尽量不要使用临时表

5、多多使用事务

6、尽量不要使用游标

7、避免死锁

8、要注意读写锁的使用

9、不要打开大的数据集

10、不要使用服务器端游标

11、在程序编码时使用大数据量的数据库

12、不要给“性别”列创建索引

13、注意超时问题

14、不要使用Select *
15、在细节表中插入纪录时,不要在主表执行Select MAX(ID)

16、尽量不要使用TEXT数据类型

17、使用参数查询

18、不要使用Insert导入大批的数据

19、学会分析查询

20、使用参照完整性

21、用INNER JOIN 和LEFT JOIN代替Where


1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0
3. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20
5. in 和 not in 也要慎用,否则会导致全表扫描,如: select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3
6. .下面的查询也将导致全表扫描: select id from t where name like '%abc%' 若要提高效率,可以考虑全文检索。
7. 如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描: select id from t where num=@num 可以改为强制查询使用索引: select id from t with(index(索引名)) where num=@num
8. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如: select id from t where substring(name,1,3)='abc'--name以abc开头的id select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id 应改为: select id from t where name like 'abc%' select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
9. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
11. 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 1=0 这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样: create table #t(...)
12. 很多时候用 exists 代替 in 是一个好的选择: select num from a where num in(select num from b) 用下面的语句替换: select num from a where exists(select 1 from b where num=a.num)
13. 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
14. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
15. 应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存
储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
16. .尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了
17. 尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
18. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段
19. 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
20. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
21. 应尽量避免在where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: select id from t where num/2=100 应改为: select id from t where num=100*2
22. 临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
23. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
24. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
25. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26. 使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效
27. 与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28. 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
29. 尽量避免大事务操作,提高系统并发能力。
30. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理
31. 注意union和union all的区别。union比union all多做了一步distinct操作。能用union all的情况下尽量不用union
32. 查询时尽量不要返回不需要的行、列。另外在多表连接查询时,尽量改成连接查询,少用子查询
33. 尽量少用视图,它的效率低。
34. 创建合理的索引,对于插入或者修改比较频繁的表,尽量慎用索引。因为如果表中存在索引,插入和修改时也会引起全表扫描。索引一般使用于where后经常用作条件的字段上。
35. Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围。
select * from chineseresume where title in ('男','女') Select * from chineseresume where between '男' and '女'
36. WHERE后面的条件顺序影响WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,尽量将范围小的条件放在前面
37. 没有必要时不要用DISTINCT和ORDER BY
38. 慎用临时表,临时表存储于tempdb库中,操作临时表时,会引起跨库操作。尽量用结果集和表变量来代替它。
分享到:
评论

相关推荐

    达梦数据库使用,包括安装,配置,适配Mysql、备份与还原

    1. 除主键索引外都建议使用单独语句进行索引新建。 2. 不能使用 USE BTREE。 3. int 相关字段类型不能标注长度。 4. json 字段转换为 varchar 并添加检查约束 CHECK("array_json" IS JSON),需要根据字段标识长度 ...

    学生绩点管理系统(C# 数据库)

    本文将深入探讨一个使用C#编程语言构建的学生绩点管理系统,该系统结合了数据库技术,实现了对学生成绩的智能化管理,包括查询、添加、修改和删除功能,并具备计算平均绩点以及对不及格科目给出重修建议的能力。...

    实验十 使用SQLite数据库存储数据

    SQLite数据库在Android中的使用主要包括以下几个关键知识点: 1. **SQLiteOpenHelper**: 这是Android提供的一个抽象类,用于创建、升级和打开数据库。你需要创建它的子类,并重写`onCreate()`和`onUpgrade()`方法。...

    使用C#开发数据库

    - **Trim**:处理用户输入时,建议使用`Trim()`去除两端的空白字符。 **4.2 随机数生成** 使用`System.Random`类生成随机数: ```csharp Random r = new Random(); int randomNumber = r.Next(1, 100); // 生成1到...

    提高SQL Server数据库安全性的几点思考.pdf

    在文章《提高SQL Server数据库安全性的几点思考》中,作者王桃群就如何提高SQL Server数据库的安全性提出了几个实用的建议。 首先,文章指出了SQL Server数据库的安全隐患主要来源于其默认的网络配置。为了减少安全...

    Libreoffice 数据库 教程

    ### LibreOffice 数据库教程知识点详解 #### 一、引言 在开源办公套件领域,LibreOffice 是一个广受欢迎的选择。它不仅包含了文字处理、电子表格等常见工具,还包含了一个功能强大的数据库管理组件——LibreOffice...

    广西数据库容灾方案建议.pdf

    在实施容灾方案时,还需要考虑以下几点: - 定期演练:确保在实际故障发生时,能够迅速、正确地切换到备库。 - 监控与报警:设置监控系统,及时发现并处理网络延迟、同步失败等问题。 - 容灾策略:结合业务连续性...

    使用plsqldev对oracle数据库做备份还原操作

    在备份和还原过程中,需要注意以下几点: 1. 确保在进行备份和还原操作时,数据库处于非活动状态,避免数据丢失或冲突。 2. 定期备份是数据库管理的关键,以防意外数据丢失。 3. 导出和导入文件的过程中,确保有足够...

    数据库评审检查单

    - **检查点**:是否合理使用SEQUENCE、PROCEDURE、TRIGGER、FUNCTION等数据库对象。 - **重要性**:适当的数据库对象可以提高程序的执行效率和代码的可维护性。 - **建议**:评估每个对象的实际需求,确保它们被正确...

    orcale数据库中文汉化

    在进行Oracle数据库中文汉化时,需要注意以下几点: - **备份数据**:在进行任何重大更改之前,都应该先备份数据库,以防万一出现问题导致数据丢失。 - **验证兼容性**:确保所选的汉化版本与当前运行的Oracle...

    数据库日志收缩工具

    在使用日志收缩工具前,需要了解几个关键点: 1. **理解事务日志的工作原理**:日志记录了所有事务的详细信息,包括每个事务的开始和结束。如果日志文件过大,可能是因为存在未提交或长时间运行的事务,需要先解决...

    软考-中级 数据库系统工程师 历年真题大汇总

    在"数据库系统工程师"的考试中,主要涉及以下几个核心知识点: 1. 数据库基础理论:这包括数据库的概念、数据模型(如关系模型、网状模型、层次模型等)、数据的逻辑结构和物理结构、数据独立性等基本概念。理解...

    ACCESS数据库转SQL工具

    本篇文章将详细讲解如何利用"ACCESS数据库转SQL工具"进行数据库迁移,以及这一过程中的关键知识点。 ACCESS是由微软公司开发的一款小型关系型数据库管理系统,它适合个人或小团队进行数据管理,具有易于上手、操作...

    2016数据库运维安全现状调查报告 数据库运维(02).pdf

    《2016数据库运维安全现状调查报告》揭示了当时中国各行业在数据库运维安全方面的现状,主要包括以下几个关键知识点: 1. **参与人员概况**:调研涵盖了政府、金融、能源等多个行业的技术人员,其中工程师和技术...

    恢复账套提示备份文件无效或有其它软件正在使用要覆盖的数据库.ppt

    通过处理恢复账套提示“备份文件无效或有其它软件正在使用要覆盖的数据库”这样的问题,我们可以总结出以下几点: 1. 建立各年度账套时,把各年度的账套数据库存放路径放在一个文件下,例如:D:\UFSMART\ADMIN ...

    数据库笔试知识点汇总

    数据库系统(DBS)是计算机系统中引入数据库后形成的系统,它通常由四个...以上总结的知识点覆盖了数据库系统基础、数据库设计流程、SQL连接操作以及数据完整性管理等核心内容,是数据库相关职位笔试中重要的考察范围。

    thinkphp3.2.2备份数据库插件

    在使用ThinkPHP3.2.2备份数据库插件时,开发者需要注意以下几点: 1. 确保有足够的磁盘空间用于存放备份文件,因为备份过程可能会消耗大量存储资源。 2. 为了防止数据丢失,建议定期检查备份文件的完整性,避免因...

    access数据库论文下载

    对于想要撰写关于Access数据库的论文的学生来说,需要注意以下几点: 1. **明确研究目的**:确定论文的研究方向和目标,比如是探讨Access在特定领域的应用还是对比不同数据库管理系统之间的优劣。 2. **文献综述**...

    数据库查询数据库查询数据库查询

    根据提供的文件信息,我们可以提炼出以下几个关键的知识点: #### 1. 数据库查询的重要性 - **定义**:数据库查询是指从数据库中检索特定数据的过程。通过SQL(Structured Query Language)等查询语言,用户可以对...

    膳食数据库营养师.zip

    对于营养师来说,使用这样的数据库有以下几点重要性: 1. 制定个性化饮食建议:通过查询数据库,营养师可以了解患者日常摄入的食物营养成分,从而为其提供个性化的饮食建议,帮助改善营养状况或管理特定疾病。 2. ...

Global site tag (gtag.js) - Google Analytics