个人觉得做为一个程序开发人员对SQL Server中应该知道的几个方面的知识。
1.建立数据库集群 (Master - Slave)
根据实际的环境应用进行读写分离部署,Master数据库一般用于写入操作,由于数据录入频繁的变动所以Master数据库的表结构尽量不要设置太多约束,比如索引等,在Master数据库上建立job将数据定时分发到各Slave进行数据同步。
Slave数据库一般多用于读,为提高查询效率在slave数据库中我们可以建立多个索引保证索引查询的中标率。
2. 有关查询:
select 无论何时都应该用with(nolock)来标注以避免一个性能不好的查询语句长时间运行而导致表锁住不能被更新。
当使用Top限定查询选项时在查询条件中应与Order By配合。
避免使用Seclect * 的查询,它很有可能引起不能命中索引的问题。
避免使用游标,游标相当于多次查询。
避免使用动态sql,可以使用CASE WHEN + 参数巧妙规避动态SQL;
避免在查询时使用函数作为条件。
临时数据集CTE(即通过with(temp name)as { select ......}) 只有只做查询操作,CTE才是较好的选择。
Not in & Not Exists 集合取反操作时当使用Not in取反集合时如果所查询的列中有Null值,则起不到任何作用,在取反集合的子集查询中要明确过滤掉null值。
Not Exists则灵活的多。
3. 有关SP
命名 : [TableName]_[Action]_P
注明引用的数据库名: User [DBName]
在不需要返回相应行数的SP中,注明: SET NOCOUNT ON.
SP中的select语句要遵循第二条规则。
注明SP 的Permistion: Grant to [特定SP-Account]
注意语句运行的适当的分割:Go(尤其在SP创建时用Grant语句时)
SP的 优点: 微软说了很多话在这里
需要重点说名的是以下这句话,要理解SP的执行权限:
如果执行链中的所有对象的所有者相同,则 SQL Server 只检查调用方的 EXECUTE 权限,而不检查调用方对其他对象的权限。 因此,只需对存储过程授予 EXECUTE 权限;可以撤消或拒绝对基础表的所有权限。
以后如果有更多的理解再继续记录下来。
浙公网安备 33010602011771号