【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. 一切以简单高效的原则来设计,对于框架的选用也是如此,

【C#】项目优化实战的更多相关文章

  1. Java 项目优化实战

    https://blog.coding.net/blog/java-coding-performance 1 Visual VM 2 优化一 2.1 背景 2.2 原实现 2.3 剖析 2.4 方案 ...

  2. Android UI性能优化实战, 识别View中的性能问题

    出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...

  3. UNITY3d在移动设备上的一些优化实战(一)-概述

    转自:UNITY3d在移动设备上的一些优化实战(一)-概述 http://blog.csdn.net/leonwei/article/details/39233921 项目进入了中期之后,就需要对程序 ...

  4. Android UI性能优化实战 识别绘制中的性能问题

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391: 本文出自:[张鸿洋的博客] 1.概述 2015年初google ...

  5. 网站性能优化实战——从12.67s到1.06s的故事

    文章摘自https://juejin.im/post/5b0b7d74518825158e173a0c 作为互联网项目,最重要的便是用户体验.在举国“互联网+”的热潮中,用户至上也已经被大多数企业所接 ...

  6. 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架

    Taro本身实现的情况类似于mpvue,mpvue的未来展望中也包含了支付宝小程序,现在的版本中,也可以使用不同的构建命令来构建出百度小程序的支持,如第10章所示,但是现在Taro先于mpvue实现了 ...

  7. 企业级NginxWeb服务优化实战(下)

    企业级NginxWeb服务优化实战(下) 4. Nginx站点目录及文件URL访问控制 4.1 根据扩展名限制程序和文件访问 Web2.0时代,绝大多数网站都是以用户为中心多的,例如:bbs,blog ...

  8. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  9. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

随机推荐

  1. Error:The network adaptor could not establish the connection问题的解决办法

     最近在学习hibernate 5.0.4, 自然而然就需要使用数据库,由于本人工作中一直使用Oracle,于是在自己的电脑上安装了Oracle 12.1.0, 安装完成使用一直没有问题,突然有一天使 ...

  2. samba服务器搭建小记

    经常要在局域网的linux和windows主机之间共享文件,我遇到了当年samba作者同样的问题,既然人家已经写好了这个软件那就直接拿来用吧. 首先,在linux主机上执行 sudo apt-get ...

  3. WinForm DataGridView分页功能

    WinForm 里面的DataGridView不像WebForm里面的GridView那样有自带的分页功能,需要自己写代码来实现分页,效果如下图: 分页控件  .CS: 1 using System; ...

  4. tracert-命令小结

          前言:今天在阅读“Web性能权威指南”这本书的时候,发现 tracert 这个命令挺有意思的,在分析网络性能瓶颈的时候也能使用的到,在此就小记一笔以备后用. 1:作用 tracert 是一 ...

  5. html5手写签名

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta co ...

  6. Loadrunner---解决乱码问题

    在使用Loadrunner录制和回放时有时候会因为乱码问题报错,且让我们很难定位出脚本问题所在.此事我们做一下分析loadrunner为什么会出现乱码这种情况呢? 1.乱码产生的原因 1)loadru ...

  7. js正则表达式replace里有变量的解决方法用到RegExp类

    一直比较害怕使用正则表达式,貌似很深奥很复杂的样子,所以在用js操作字符串的时候,我最多使用的是replace.split.substring.indexOf等函数,这些函数有时候需要多次叠加使用,但 ...

  8. 【Python】djangorestframework 基于django框架的接口开发

    官网:http://www.django-rest-framework.org/#installation 下载:https://pypi.python.org/pypi/djangorestfram ...

  9. HTML5 中的新属性autocomplete="off"失效的解决方法(兼容firefox,IE,360)

    因为业务需求,在写一个注册页面的时候,发现浏览器会自动填充此域名下已经保存的账号密码,给用户带来不便.加了HTML5 中的新属性autocomplete="off" ,但是并没有产 ...

  10. 4T_进程与进程间通信

    ∮进程 进程与程序 进程与程序是有区别的.刚吃完炸鸡腿,拿出一张餐巾纸,擦完嘴之后,在油乎乎的纸上写下以下文字 #include <stdio.h> void main() { print ...