Rocho.J

人脑是不可靠的, 随时记录感悟并且经常重复!

 

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

 


 

 

posted on 2012-03-08 12:47  RJ  阅读(...)  评论(... 编辑 收藏

导航

统计