• SqlServer规范, 标记下


    MySql:

    只允许使用存储过程访问数据库

    应用中调用MySQL存储过程的方式

    存储过程编写规范

    存储过程入口参数命名规则

    临时表命名规则

    慎用临时表

    Session级变量(@前缀)的使用

    使用ON DUPLICATE KEY UPDATE子句

    MySQL的时间类型

    字符集处理注意事项

    Rowcount相关

    对于SQLServer中单列XML的替换

    对GROUP BY子句的优化

    SELECT * 相关

    关于往表添加新字段或索引

    Delete中别名的使用

    注释项说明 (“--  ...”)

    版本控制规范

    更新规范  内部wiki

    范例:

    View Code
    DELIMITER $$
    DROP PROCEDURE IF EXISTS `USP_GetScore`$$
    CREATE DEFINER=`admin`@`%` PROCEDURE `USP_GetScore`(
    v_UserId INT
    )
    BEGIN
    DECLARE v_score INT;
    DECLARE v_bScore INT;
    SET v_score = 0;
    SET v_bScore = 0;
    SELECT Score INTO v_score FROM UP_User
    WHERE UserId = v_UserId;
    SELECT BussinessScore INTO v_bScore FROM UP_ServiceEx
    WHERE UserId = v_UserId;
    SELECT v_score,v_bScore;
    END$$
    DELIMITER ;
     
    -- 索引顺序需要注意

    案例2:

    UPDATE CF_TransferCache SET

      CurrentState=v_State WHERE

      CacheId = CONCAT(CAST(v_OwnerId AS CHAR), v_FileId, v_Target) AND

      OwnerId=v_OwnerId AND

      FileId=v_FileId AND

      ServiceCode=v_ServiceCode AND

      Target=v_Target;

    KEY `IX_CF_TransferCache_OFTS` (`OwnerId`,`FileId`,`Target`,`ServiceCode`)

    --别名要写全

     SELECT  a.Col1,a.Col2,b.Col3,b.Col4

       FROM a INNER JOIN b

          ON a.FileId = b.FileId

       WHERE a.GroupId = v_GroupId AND 

           ExpireTime > v_ExpireTimePoint  -- 缺失别名

       ORDER BY a.CreateTime DESC;

    SqlServer

    存储过程要有异常处理部分,确保过程的可执行;
    尽量在脚本加入设计思路的概要注释
    无法参数化的SQL会造成的不良影响:
    •每次执行都会造成SQL Server重新编译生成执行计划, 浪费CPU
    执行计划不可重用, 造成SQL Server缓存大量无用的执行计划, 从而浪费内存空间
    •有些情况下, 可能生成不稳定的执行计划, 可能生成非期望的执行计划(比如生成低效的Index Scan或者Table Scan), 从而导致DB突然缓慢。
     

    谨慎使用where子句中效率比较低的条件

    <> 操作符

    不等于操作符无法利用索引, 慎用

    条件字段中的计算表达式

    如果在条件字段中使用计算, 那么将无法利用索引, 慎用

    Like子句

    索引字段为varchar类型,前缀匹配索引无效

    Like ‘abc%’会利用索引, 但like ‘%abc’不会利用索引

    时间字段

    在要约束时间范围时,若要大于某个时间时,尽量使用>=?

    “>”需要全扫描索引比较, “=”能快速定位到指定的值,再比较大小,

    这能减少检索的时间,快速定位记录。

    慎用in语句, 使用join语句代替
     
    严格匹配where子句中的数据类型

    Select * from SMS_MoLog where SrcMobileNo = 13820120305,这里SrcMobileNo为varchar(64),后面值是整型,类型匹配,索引不起作用,导致一个Index Scan,非常缓慢。

    对于复合的条件, 使用索引暗示指定使用的索引

    某些情况下, 由于统计信息的变化,导致执行计划不合理,特别是在多索引的情况下,这时尽量使用索引暗示,如:

    Select  * from SMS_MoLog with(nolock, INDEX(IX_SMS_MoLog_SrcMobileNo)) where SrcMobileNo = @MobileNo and Time > @Time


     

  • 相关阅读:
    Git 历史/术语/命令/基本操作
    SQL 术语/语法/基本操作-必知必会
    bootstrap cdn地址
    IDEA 快捷键 大幅提高工作效率
    Django3 模版配置/过滤器/markdown=9
    Django3 路由文件位置/文件格式/路由传值=8
    Django3 创建项目/app全流程=7
    VS Code Django解决不必要报错
    Django3 如何使用静态文件/如何自定义后台管理页面=6
    Django3 如何编写单元测试和全面测试=5
  • 原文地址:https://www.cnblogs.com/cs_net/p/2385047.html
Copyright © 2020-2023  润新知