zoukankan      html  css  js  c++  java
  • 【C#】项目优化实战

    【C#】项目优化实战

     一. 数据库设计

      1. 常量的枚举值直接存中文不要存数字(注意是常量,如果显示值可变就不能)

        例如:男女,在数据库中不要存1和0,直接存男和女。

        这样的好处:读取数据的时候可以避免不必要的转换,每次转换肯定会带来性能开销

      2. 允许字段冗余

        例如:在需要统计的表里面都会有时间字段,一般都是设默认GETDATE(),但有的时候我们需要按年、按月、按周、按天统计,这时可以把年、月、周、天用4列来存储

        这样的好处:在统计查询的时候性能会比用 sql 函数高出非常多

      3. 索引的建立

        在查询列和关联列上建立索引,可以极大的提高查询性能

      4. 尽量不要存 null, 用空字符串或0来替代

      5. 查询字段最好全部走索引,如果不能走索引考虑其他方案来替代(如全文索引)

      6. 历史数据的迁移或清理,定时把无用的历史数据删除掉或备份到其他表里

      7. 对系统中读操作远大于写操作的表做读写分离

      8. 按照业务模块将数据库切分成多个数据库

      总结:表的设计尽量简单,尽量减少关联表。能用一张表做的事就不用两张表,能存原始数据就存原始数据,虽然会违反设计范式,但可以提高性能

     二. 死锁的隐患

      1. 事务可能带来的死锁:当需要对多张表进行修改操作时,都会加事务,有一点是非常需要注意的:操作表的顺序要一致

        例如:事务1,先修改表a再修改表b。事务2,先修改表b再修改表a。这种情况就会死锁,需要注意

      2. WITH(NOLOCK):在查询时如果加上WITH(NOLOCK)可以在一定程度上提升查询性能,相对的它会带来脏读的影响

     三.语句的优化

      1. 慎用 INNER JOIN (INNER JOIN 的表数量不应过多,表越多查询性能越低)

        a. 通过字段的冗余来减少 INNER JOIN, INNER JOIN 如果是用于查询条件,可以把查询的字段放到查询的主表里来免除联查.

        b. 对于枚举值,要么直接存显示值,要么在数据查出来后进行匹配,不要用数据库联查

        c. 当联查的表数据都很大的时候,就得慎重使用 INNER JOIN,当出现查询慢的时候可以使用临时表

          例子:表A和表B联查时,表B通过条件筛选后数据不多,可以把筛选的数据放入临时表中,再使用INNER JOIN,可以很大程度上提升性能

      2. 尽量不要使用 LEFT/RIGHT JOIN

        a. 可以通过使用 INNER JOIN 来替代 LEFT JOIN

            例如: 性别的枚举值,一般会使用1代表男,0代表女,但用户可能不设置性别信息,数据库中就会是空或null,这时可以在数据库中保存空字符串非null,枚举里创建空字符串枚举来表示用户不输入性别.这样就可以使用 INNER JOIN 来替代 LEFT JOIN

      3. 查询条件列一定要走索引

     四. 通过使用 Sql Server Profiler 来定位性能慢的语句

      1. 主要看 cpu 和 IO

     五. 缓存

      1. 缓存一切可以缓存的数据,尤其是那些在短时间内改变不多的数据

     六. 界面数据显示

      1. 先显示主要数据,次要数据通过异步方式显示或通过用户点击按钮按需显示

      2. 如果一次请求需要查好几次数据库才能获取到数据,可以通过多线程的方式来访问数据库,以此减短请求的时间

      3. 尽量使用轻服务端重客户端的方式设计页面,以此将部分压力转移到客户电脑上以此减轻服务器压力

      4. 尽量做到前后端分离

     七. 异常捕捉

      1. 禁止使用全局异常捕捉,因为很难定位发生异常的位置

      2. 使用代码重构将代码功能粒子化,对可能出现的代码块加上异常捕捉,异常信息输入: 类名, 函数名, 函数参数值,异常信息.异常信息越详细越好

     八. 设计思路

      1. 一切以简单高效的原则来设计,对于框架的选用也是如此,

  • 相关阅读:
    0713学期末了
    Oracle Redo日志的状态
    crontab调用shell访问sqlplus失败原因
    Solaris下批量杀进程
    oracle用户管理的完全恢复4:在ARCHIVELOG 模式(恢复打开的数据库)
    oracle用户管理的完全恢复3:在ARCHIVELOG 模式(恢复关闭的数据库)
    shell删除所有空行(忽略编码格式)
    oracle用户管理的完全恢复1:在NOARCHIVELOG 模式下执行恢复
    查看oracle用户权限
    OLTP与OLAP介绍
  • 原文地址:https://www.cnblogs.com/fzz2727551894/p/5803639.html
Copyright © 2011-2022 走看看