SQL Server数据库开发的二十一条军规

合集下载

sqlserver数据库安全配置规范

sqlserver数据库安全配置规范

sqlserver数据库安全配置规范竭诚为您提供优质文档/双击可除sqlserver数据库安全配置规范篇一:sqlserver2000的安全配置sqlserver2000的安全配置sqlserver2000的安全配置在进行sqlserver2000数据库的安全配置之前,首先你必须对操作系统进行安全配置,保证你的操作系统处于安全状态。

然后对你要使用的操作数据库软件(程序)进行必要的安全审核,比如对asp、php等脚本,这是很多基于数据库的web应用常出现的安全隐患,对于脚本主要是一个过滤问题,需要过滤一些类似,‘;@/等字符,防止破坏者构造恶意的sql语句。

接着,安装sqlserver2000后请打上补丁sp1以及最新的sp2。

下载地址是:/sql/downloads/2000/sp1.asp和/sql/downloads/2000/sp2.asp在做完上面三步基础之后,我们再来讨论sqlserver的安全配置。

1、使用安全的密码策略我们把密码策略摆在所有安全配置的第一步,请注意,很多数据库帐号的密码过于简单,这跟系统密码过于简单是一个道理。

对于sa更应该注意,同时不要让sa帐号的密码写于应用程序或者脚本中。

健壮的密码是安全的第一步!sqlserver2000安装的时候,如果是使用混合模式,那么就需要输入sa的密码,除非你确认必须使用空密码。

这比以前的版本有所改进。

同时养成定期修改密码的好习惯。

数据库管理员应该定期查看是否有不符合密码要求的帐号。

比如使用下面的sql语句:usemasterselectname,passwordfromsysloginswherepasswordisnull2、使用安全的帐号策略由于sqlserver不能更改sa用户名称,也不能删除这个超级用户,所以,我们必须对这个帐号进行最强的保护,当然,包括使用一个非常强壮的密码,最好不要在数据库应用中使用sa帐号,只有当没有其它方法登录到sqlserver实例(例如,当其它系统管理员不可用或忘记了密码)时才使用sa。

SQLServer中创建规则

SQLServer中创建规则

SQL Server中创建规则规则(Rule)就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制。

规则是单独存储的独立的数据库对象。

规则与其作用的表或用户自定义数据类型是相互独立的,即表或用户自定义对象的删除、修改不会对与之相连的规则产生影响。

规则和约束可以同时使用,表的列可以有一个规则及多个CHECK 约束。

规则与CHECK 约束很相似,相比之下,使用在ALTERTABLE 或CREATE TABLE 命令中的CHECK 约束是更标准的限制列值的方法,但CHECK 约束不能直接作用于用户自定义数据类型。

1 创建规则(1)用CREATE RULE 命令创建规则CREATE RULE 命令用于在当前数据库中创建规则,其语法如下:CREATE RULE rule_name AS condition_expression其中condition_expression 子句是规则的定义。

condition_expression 子句可以是能用于WHERE 条件子句中的任何表达式,它可以包含算术运算符、关系运算符和谓词(如IN、LIKE、BETWEEN 等)。

注意:condition_expression子句中的表达式必须以字符“@”开头。

(2)用Enterprise Manager 创建规则在Enterprise Manager 中选择数据库对象“Rules”,单击右键从快捷菜单中选择“NewRule”选项,即会弹出如图9-1 所示的创建规则属性对话框。

输入规则名称和表达式之后,单击“确定”按钮,即完成规则的创建。

2 查看规则(1)用Enterprise Manager 查看规则在Enterprise Manager 中选择“Rules” 对象,即可从右边的任务板中看到规则的大部分信息,包括规则的名称、所有者、创建时间,等如图9-2 所示。

在SQL Server 2000 中不像7.0 版本可以直接在任务板中看到规则的表达式,这需要查看规则的属性。

sql server用法

sql server用法

sql server用法SQL Server是一种关系型数据库管理系统,常用于存储和管理数据。

在使用SQL Server时,可以通过SQL语言编写指令来操作数据库。

以下是SQL Server的用法和相关参考内容。

1. 数据库连接与创建:- 使用SQL Server Management Studio(SSMS)连接到SQL Server数据库。

- 使用CREATE DATABASE语句创建新的数据库。

2. 数据表的创建与操作:- 使用CREATE TABLE语句创建新的数据表,定义表的字段名和数据类型。

- 使用ALTER TABLE语句修改已存在的数据表结构,如添加、修改或删除字段。

- 使用SELECT语句从数据表中检索数据。

- 使用INSERT语句将新数据插入到数据表中。

- 使用UPDATE语句更新已存在的数据。

- 使用DELETE语句删除数据表中的数据。

3. 数据查询与筛选:- 使用SELECT语句查询数据库,可以使用WHERE子句进行筛选。

- 使用ORDER BY子句对查询结果进行排序。

- 使用GROUP BY子句对查询结果进行分组。

- 使用HAVING子句对分组结果进行筛选。

- 使用JOIN子句连接多个数据表,进行复杂的查询操作。

- 使用子查询(Subquery)嵌套查询语句。

- 使用聚合函数(如COUNT、SUM、AVG等)对数据进行统计。

4. 数据库索引与优化:- 使用CREATE INDEX语句创建索引,提高查询性能。

- 使用ALTER INDEX语句修改或删除已存在的索引。

- 使用EXECUTION PLAN分析查询执行计划,优化查询性能。

- 使用物化视图(Materialized View)缓存查询结果,提高查询速度。

- 使用索引提示(Index Hint)指定查询使用的索引。

5. 数据备份与恢复:- 使用BACKUP DATABASE语句进行数据库备份。

- 使用RESTORE DATABASE语句进行数据库恢复。

T-SQL:SQLServer定义数据完整性6大约束(三)

T-SQL:SQLServer定义数据完整性6大约束(三)

T-SQL:SQLServer定义数据完整性6⼤约束(三)1.创建⼀客户张表1IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL2DROP TABLE dbo.Employees;34CREATE TABLE dbo.Employees5(6 empid INT NOT NULL,7 firstname VARCHAR(30) NOT NULL,8 lastname VARCHAR(30) NOT NULL,9 hiredate DATE NOT NULL,10 mgrid INT NULL,11 ssn VARCHAR(20) NOT NULL,12 salary MONEY NOT NULL13 );2.主键约束-- Primary keyALTER TABLE dbo.EmployeesADD CONSTRAINT PK_EmployeesPRIMARY KEY(empid);对于主键约束后台将创建⼀个唯⼀索引,以物理机制强制逻辑的唯⼀性约束3.唯⼀约束-- UniqueALTER TABLE dbo.EmployeesADD CONSTRAINT UNQ_Employees_ssnUNIQUE(ssn);4.外键约束创建⼀张订单表插⼊外键IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULLDROP TABLE dbo.Orders;CREATE TABLE dbo.Orders(orderid INT NOT NULL,empid INT NOT NULL,custid VARCHAR(10) NOT NULL,orderts DATETIME2 NOT NULL,qty INT NOT NULL,CONSTRAINT PK_OrdersPRIMARY KEY(orderid));-- Foreign keysALTER TABLE dbo.OrdersADD CONSTRAINT FK_Orders_EmployeesFOREIGN KEY(empid)REFERENCES dbo.Employees(empid);5.CHECK约束-- CheckALTER TABLE dbo.EmployeesADD CONSTRAINT CHK_Employees_salaryCHECK(salary >0.00);6.默认约束-- DefaultALTER TABLE dbo.OrdersADD CONSTRAINT DFT_Orders_ordertsDEFAULT(SYSDATETIME()) FOR orderts;-- CleanupDROP TABLE dbo.Orders, dbo.Employees;。

MySQL数据库开发的三十六条军规-石展

MySQL数据库开发的三十六条军规-石展

避免负向查询和% 前缀模糊查询
• 避免负向查询
NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、 NOT LIKE等
• 避免 % 前缀模糊查询
B+ Tree 使用不了索引 导致全表扫描
• 举例
MySQL> select * from post WHERE title like ‘北京%' ; 298 rows in set (0.01 sec) MySQL> select * from post WHERE title like '%北京%' ; 572 rows in set (3.27 sec)
• 注意控制IN的个数,建议n小于200 • 举例
Select * from opp WHERE phone=‘12347856' or phone=‘42242233' \G Select * from opp WHERE phone in ('12347856' , '42242233')
改写OR为UNION
• 单表多少字段合适? • 单表1G体积 500W行评估
顺序读1G文件需N秒 单行不超过200Byte 单表不超50个纯INT字段 单表不超20个CHAR(10)字段
• 单表字段数上限控制在20~50个
平衡范式与冗余
• 平衡是门艺术
严格遵循三大范式?
效率优先、提升性能
没有绝对的对与错 适当时牺牲范式、加入冗余 但会增加代码复杂度
• 不同字段,将or改为union
• 减少对不同字段进行 "or" 查询 • Merge index往往很弱智 • 如果有足够信心:set global optimizer_switch='index_merge=off';

SQL编写规范

SQL编写规范

SQL编写规范**公司ERP组SQL编写规范Author by DB小组1.写SQL注意事项1.1书写规范:1)S QL语句大小写: 所有数据库关键字和保留字均使用大写2)不允许把多个语句写在一行中,一行只写一条语句3)避免将复杂的SQL 语句写到同一行,建议要在关键字和谓词处换行4)相对独立的程序块之间必须加空行。

5)I NSERT语句中必须指定字段列表,防止表结构变化导致的错误1.2命名规范:1)不要使用数据库关键字和保留字创建对象名(如select 等)2)命名中不要使用中文和特殊字符,下划线可以使用.3)严禁使用空格给表和字段来命名4)创建对象时,对象名注意不要加双引号5)对象名称不要超过30个字符6)变量命名规定如下:i.函数或过程中所接收变量名称以P_开头,如create proc aaa(P_branchid in varchar2) ii.过程中所定义变量以V_开头,如declare v_branchid varchar2(3)7)E RP数据库对象命名必须加前缀以标识对象类型,规范如下:表(table)tb_视图(view) vw_ `序列(sequence) seq_簇(cluster) c_触发器(trigger) trg_存储过程(procedure) sp_函数(function) fun_物化视图(materialized view) mv_包和包体(package & package body) pkg_类和类体(type & type body) typ_主键(primary key) pk_外键(foreign key) fk_唯一索引(unique index) uk_普通索引(normal index) ix_位图索引(bitmap index) bi_同义词(synonym)依据所分配的表所属模块数据库链接(database link)根据所连接服务器特点指定名称1.3注释规范:1)在一般情况下,源程序有效注释量必须在30%左右,注释不宜太多也不能太少,注释语言需准确、易懂、简洁、精炼。

SQL+Server+数据库管理维护规范标准

SQL+Server+数据库管理维护规范标准

SQL Server 数据库管理维护规Version 1.02010-8-17目录1 修改记录 (3)2 简介 (3)3.数据库的物理环境 (4)3.1 网络环境 (4)3.2 目录设置 (5)3.3 文件设置 (5)4.数据库账户管理 (5)5.数据库备份和恢复 (6)5.1 开发测试环境 (8)5.2 生产环境 (8)5.2.1 用户数据库 (8)5.2.2 系统数据库 (9)5.2.3 异地备份 (9)5.2.4 恢复计划 (9)6.数据库监控 (9)7.数据库维护 (11)7.1 性能优化 (11)7.2 恢复或者切换演练 (11)附录1 数据库备份,验证备份脚本 (12)附录2 数据库恢复脚本 (14)附录3 清除备份文件脚本 (15)附录4 事件通知例子 (16)附录5 数据库账户申请表格 (17)1 修改记录2 简介数据库管理和维护是指为了保证业务系统的稳定高效运行,而对数据库系统进行全面周密的可用性,可靠性,可扩展性等方面的措施,以保证数据库系统的稳定高效运行。

数据库系统的管理和维护主要包括:Δ数据库用户以及权限的分配与维护Δ数据库的备份与恢复的设置和演练Δ数据库性能的定期巡检和优化Δ数据库高可用性,可扩展性架构方面的不断研究和应用Δ数据库方面新项目的可行性研究,根据预期规模确定合适架构Δ数据库系统包括整体架构的监控Δ不断学习和研究数据库领域最新技术,并适时投入应用该数据库管理和维护标准是一般数据库系统的管理和维护的试行标准.通过此标准,来规数据库系统的管理和维护.我们认为在数据库系统的管理和维护时遵循一定的标准是非常重要并且是必要的.标准能使我们的DBA以统一的方式和风格进行数据库系统的管理维护,从而使我们的数据库系统运行更加规,数据库结构更清晰,也使数据库系统具有高健壮性,高专业化.该标准是一个关于数据库系统的管理和维护规,我们的这个规主要应用在SQLServer2005/2008上,经过适当的修改之后也可以应用在以前的版本,以后的版本.SQLServer的数据库管理和维护是一个复杂的过程,包含了多种备份恢复技术,高可用技术,多服务器管理技术等,该文档不可能包含所有的基本容,而只能从最常用的管理维护技术入手进行简单介绍。

sql server中关于数据库权限的分类

sql server中关于数据库权限的分类

SQL Server中关于数据库权限的分类数据库权限是指在SQL Server中对数据库对象进行操作的权限。

通过授予或撤销不同级别的数据库权限,可以实现对数据库的访问和管理的控制。

SQL Server中提供了多种类型的数据库权限,可以根据需求进行灵活配置。

本文将详细介绍SQL Server中关于数据库权限的分类。

1. 登录权限登录权限是指用户登录到SQL Server实例的权限。

登录权限包括以下几种:•sysadmin:具有系统管理员角色,拥有最高级别的访问和管理权力。

•serveradmin:具有服务器管理员角色,负责管理服务器级别配置和安全性。

•securityadmin:具有安全管理员角色,可以创建、更改和删除登录、用户和角色。

•processadmin:具有进程管理员角色,可以监视和终止服务器进程。

•setupadmin:具有安装程序管理员角色,可以管理服务器上安装的组件。

•bulkadmin:具有批量操作管理员角色,可以执行BULK INSERT操作。

2. 数据库级别权限数据库级别权限是指对特定数据库进行操作的权限。

常见的数据库级别权限包括:•db_owner:拥有该角色的用户对数据库具有完全控制权,包括创建、修改、删除对象以及对所有数据进行操作。

•db_datareader:允许用户读取数据库中的所有数据。

•db_datawriter:允许用户向数据库中写入数据。

•db_ddladmin:允许用户创建、修改和删除数据库对象,如表、视图、存储过程等。

•db_securityadmin:允许用户管理数据库角色、权限和安全性设置。

3. 对象级别权限对象级别权限是指对特定数据库对象进行操作的权限。

常见的对象级别权限包括:•SELECT:允许用户查询表中的数据。

•INSERT:允许用户向表中插入数据。

•UPDATE:允许用户更新表中的数据。

•DELETE:允许用户删除表中的数据。

•EXECUTE:允许用户执行存储过程或函数。

数据库开发规范(SQL_SERVER篇)2012最新版

数据库开发规范(SQL_SERVER篇)2012最新版

数据库开发规范(SQL SERVER篇)拟制:日期:审核:日期:批准:日期:修订历史记录目录修订历史记录 (2)第一章命名规范 (5)1.命名标志法 (5)2.数据库命名 (5)3.数据库月份库、数据表日分库命名规则 (5)4.分段数据库分库命名规则 (5)5.分段分日期数据库分库命名规则 (5)6.表的命名 (6)7.字段命名 (6)8.存储过程命名 (6)9.触发器命名, (7)10.索引命名 (7)11.主键 (7)12.外键 (7)13.缺省值 (7)15.函数的命名 (7)16.其他数据库对象命名规则 (7)17.其他数据库可编程性对象命名 (7)18.数据库保留字 (7)19.禁止使用空格 (7)第二章常用数据类型 (8)第三章数据库设计规范 (10)1.三范式 (10)2.适当的冗余 (10)3.主键 (10)4.索引 (10)5.主键与聚集索引的关系 (11)第四章存储过程编写规范 (12)1.注释 (12)2.书写规范 (13)3.性能相关 (13)4.尽量使用索引 (14)5.事务和锁 (15)6.其他注意事项 (15)7.注意临时表和表变量的用法 (15)8.注意子查询的用法 (15)9.常用写法 (17)9.1. XML解析 (17)9.2.检查表是否有数据 (17)9.3.检查变量是否为空或为’’ (17)9.4.动态SQL (17)9.5.建表 (18)9.6.建索引 (18)9.7.建用户 (18)9.8.建全文索引 (18)9.9.建链接服务器 (19)9.10. SERVICE BROKER (19)9.11.分区 (20)第五章POWER DESIGNER使用规范 (22)1. PDM (22)第一章命名规范1. 命名标志法使用下面的三种大写标识符约定。

Pascal 大小写将标识符的首字母和后面连接的每个单词的首字母都大写。

可以对三字符或更多字符的标识符使用Pascal 大小写。

数据库设计规范

数据库设计规范

数据库设计规范SQL Server数据库开发规范 XX企业XX企业SQL Server数据库设计开发规范1 范围 ..................................................................... . (2)2 总体要求 ..................................................................... .............................................................. 2 2.1 数据库设计总体要求 ..................................................................... ................................... 2 2.2 数据库对象命名的总体要求 ..................................................................... ........................ 2 2.3 数据库程序编码的总体要求 ..................................................................... ........................ 3 3 数据库设计规范 ..................................................................... ................................................... 3 3.1 数据库的概念设计 ..................................................................... ....................................... 3 3.2 数据库的逻辑设计 ..................................................................... ....................................... 4 3.3 数据库物理设计 ..................................................................... . (4)4 数据库对象命名规范 ..................................................................... . (6)4.1.1 数据表模块分类 ..................................................................... .. (7)4.1.2 数据表命名方法 ..................................................................... .. (7)4.1.3 数据表属性设计 ..................................................................... ................................... 8 5 数据字典编写格式规范 ..................................................................... ....................................... 8 5.1 数据库表汇总表格式 ..................................................................... ................................... 8 5.2 数据库表详述表格式 ..................................................................... ................................... 9 5.3 编码数据表格式 ..................................................................... ......................................... 10 6 数据开发规范 ..................................................................... ..................................................... 11 6.1 数据库脚本的目录结构 ..................................................................... .............................. 11 6.2 数据库脚本的开发规范 ..................................................................... (12)6.2.1 代码书写规范 ..................................................................... . (12)6.2.2 存储过程编写规范 ..................................................................... ............................. 15 7 数据库脚本的部署规范 ..................................................................... ..................................... 19 8 数据库开发过程中要避免的问题(CHECKLIST) ............................................................ ....... 19 8.1 数据库设计 ..................................................................... ................................................. 19 8.2 SQL编写 ..................................................................... .................................................... 19 8.3 索引的使用 ..................................................................... ................................................. 20 8.4 TEMPDB的使用规范...................................................................... .. (20)1 of 21SQL Server数据库开发规范 XX企业 1 范围本规范规定了XX企业SQL Server数据库建设的规则,是检验评定软件开发者为XX企业项目开发的应用系统质量的标准尺度。

数据库开闭原则

数据库开闭原则

数据库开闭原则在软件开发领域中,开闭原则是一个重要的设计原则。

数据库开闭原则,作为该原则的一部分,是指数据库结构在扩展新功能时,不应该修改现有的数据库表结构,而是应该采用其他方法来满足新的需求。

数据库开闭原则的核心思想是,数据库应该是开放的,而不是封闭的。

这意味着,数据库应该允许我们轻松地向其添加新的功能,而不必让我们修改现有的结构。

这种设计可以大大降低系统的维护成本和风险,同时也可以增加系统的可扩展性和可重用性。

为了保持数据库的开放性,我们可以采用以下几种方法:1. 使用扩展表:当需要添加新的功能时,我们可以添加一个新的表来存储新的数据。

这样做可以保持现有表结构的完整性,并且可以使新的功能独立于现有的功能;2. 使用视图:视图是数据库中一种虚拟表,它的内容是从一个或多个现有表中派生出来的。

我们可以使用视图来展示新的数据,而无需修改现有的表结构;3. 使用存储过程:存储过程是一种数据库对象,它包含了一组可重用的SQL语句。

我们可以通过编写存储过程来实现新的功能,而无需修改现有的表结构;4. 使用触发器:触发器是一种数据库对象,它可以在特定事件发生时自动执行一些SQL操作。

我们可以通过编写触发器来实现新的功能,而无需修改现有的表结构。

需要注意的是,虽然采用以上方法可以实现数据库的开闭设计,但我们仍然需要在设计过程中保持谨慎。

特别是在使用视图、存储过程和触发器时,我们需要确保它们没有影响到现有的功能或性能。

此外,我们还需要注意注释和文档的编写,以便其他开发人员和维护人员能够快速了解数据库结构和使用方法。

总之,数据库开闭原则是一种重要的设计原则,它可以帮助我们减少系统的维护成本和风险,提高系统的可扩展性和可重用性。

在实践中,我们需要采用适当的方法来实现数据库的开放性,并在设计过程中保持谨慎,以确保系统的可靠性和稳定性。

MySQL数据库开发的三十六条军规

MySQL数据库开发的三十六条军规

MySQL数据库开发的三⼗六条军规⼀.核⼼军规尽量不在数据库做运算,cpu计算的事务必移⾄业务层;控制表、⾏、列数量(【控制单张表的数据量 1年/500W条,超出可做分表】,【单库表数据量不超过300张】、【单张表的字段个数不超过50个,多了拆表】)三⼤范式没有绝对的要使⽤,效率优先时可适当牺牲范式 https:///wdw31210/p/8574853.html拒绝3B(拒绝⼤sql语句:big sql、拒绝⼤事物:big transaction、拒绝⼤批量:big batch);⼆.字段类军规⽤好数值类型(⽤合适的字段类型节约空间); 如:⼀个字段注定就只有1跟2 要设计成 int(1) ⽽不是 int(11)字符转化为数字(能转化的最好转化,同样节约空间、提⾼查询性能); 如,⼀个字段注定就只有1跟2,要设计成int(1) ⽽不是char(1) 查询优化如:字段类型是 char(1) 查询应当where xx='1' ⽽不是 xx=1 会导致效率慢避免使⽤NULL字段(NULL字段很难查询优化、NULL字段的索引需要额外空间、NULL字段的复合索引⽆效); ,如:要设计成 `c` int(10) NOT NULL DEFAULT 0 ⽽不是 `c` int(10) NOT NULL;少⽤text/blob类型(尽量使⽤varchar代替text字段); 需要请拆表不在数据库存图⽚,请存图⽚路径,然后图⽚⽂件存在项⽬⽂件夹下。

三.索引类军规合理使⽤索引(改善查询,减慢更新,索引⼀定不是越多越好); 如:不要给性别创建索引字符字段必须建前缀索引; `pinyin` varchar(100) DEFAULT NULL COMMENT '⼩区拼⾳', KEY `idx_pinyin` (`pinyin`(8)),不在索引做列运算;如: WHERE to_days(current_date) – to_days(date_col) <= 10 改为 WHERE date_col >= DATE_SUB('2011-10- 22',INTERVAL 10 DAY);innodb主键推荐使⽤⾃增列(主键建⽴聚簇索引,主键不应该被修改,字符串不应该做主键)(理解Innodb的索引保存结构就知道了); 如:⽤独⽴亍业务的AUTO_INCREMENT不⽤外键(由程序保证约束);四.SQL类军规sql语句尽可能简单(⼀条sql只能在⼀个cpu运算,⼤语句拆⼩语句,减少锁时间,⼀条⼤sql可以堵死整个库);简单的事务;避免使⽤trig/func(触发器、函数不⽤,由客户端程序取⽽代之);不⽤select *(消耗cpu,io,内存,带宽,这种程序不具有扩展性); 如:select a ,b,c 会⽐ select * 好只取需要列OR改写为IN 如: where a=1 or a=2 改 a in(1,2)OR改写为UNION 针对不同字段 where a=1 or b=1 改 select 1 from a where a=1 union select 1 from a where b=1避免负向%; 如 where a like %北京% 改为 where a like '北京%'limit⾼效分页(limit越⼤,效率越低); 如 Limit 10000,10 改为 where id >xxxx limit 11使⽤union all替代union(union有去重开销);⾼并发db少⽤2个表以上的join;使⽤group by 去除排序加快效率; 如: group by name 默认是asc排序改 group by name order by null 提⾼查询效率请使⽤同类型⽐较; 如: where 双精度=双精度数字=数字字符=字符避免转换导致索引丢失打散⼤批量更新; 如:在凌晨空闲时期更新执⾏五.约定类军规隔离线上线下,如:开发⽤dev库测试⽤qa库模拟⽤sim库线上⽤线上库,开发⽆线上库操作权限不在程序端加锁,即外部锁,外部锁不可控,会导致⾼并发会炸,极难调试和排查统⼀字符 UTF-8 校对规则 utf8_general_ci 出现乱码 SET NAMES UTF8统⼀命名规范,库表名⼀律⼩写,索引前缀⽤idx_ 库名⽤缩写(2-7字符),不使⽤系统关键字保留字命名。

SQL Server数据库开发的二十一条军规

SQL Server数据库开发的二十一条军规

SQL Server数据库开发的二十一条军规如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导。

在这里,我不打算介绍使用SQL Server的窍门,也不能提供一个包治百病的方案,我所做的是总结一些经验----关于如何形成一个好的设计。

这些经验来自我过去几年中经受的教训,一直来,我看到许多同样的设计错误被一次又一次的重复。

一、了解你用的工具不要轻视这一点,这是我在这篇文章中讲述的最关键的一条。

也许你也看到有很多的SQL Server程序员没有掌握全部的T-SQL命令和SQL Server提供的那些有用的工具。

“什么?我要浪费一个月的时间来学习那些我永远也不会用到的SQL命令???”,你也许会这样说。

对的,你不需要这样做。

但是你应该用一个周末浏览所有的T-SQL命令。

在这里,你的任务是了解,将来,当你设计一个查询时,你会记起来:“对了,这里有一个命令可以完全实现我需要的功能”,于是,到MSDN查看这个命令的确切语法。

二、不要使用游标让我再重复一遍:不要使用游标。

如果你想破坏整个系统的性能的话,它们倒是你最有效的首选办法。

大多数的初学者都使用游标,而没有意识到它们对性能造成的影响。

它们占用内存,还用它们那些不可思议的方式锁定表,另外,它们简直就像蜗牛。

而最糟糕的是,它们可以使你的DBA所能做的一切性能优化等于没做。

不知你是否知道每执行一次FETCH 就等于执行一次SELECT命令?这意味着如果你的游标有10000条记录,它将执行10000次SELECT!如果你使用一组SELECT、UPDATE或者DELETE来完成相应的工作,那将有效率的多。

初学者一般认为使用游标是一种比较熟悉和舒适的编程方式,可很不幸,这会导致糟糕的性能。

显然,...的总体目的是你要实现什么,而不是怎样实现。

........................SQL我曾经用T-SQL重写了一个基于游标的存储过程,那个表只有100,000条记录,原来的存储过程用了40分钟才执行完毕,而新的存储过程只用了10秒钟。

运维的 85 条军规,你值得拥有!

运维的 85 条军规,你值得拥有!

运维的 85 条军规,你值得拥有!“前车之鉴,后事之师”,对于IT运维工程师来说,了解行业的规则,并能将其牢记于心,必将对你的工作起到事半功倍的效果,下面一起来学习下所谓的《运维85条军规》:1) 承载能力优先 ——随后再进行优化 —— 不遵守这条规则必定带来故障停机时间。

不要在故障停机时间的压力下进行优化——要先集中精力提高承载能力。

2) 以Postgres为例,一定要确保你的每一个网络都能匹配得上你的WAL文件、Slony复制、快照技术以及基于磁盘的DB版本化(快照的衍生品)3) 不要把问题‘优化’到你的架构之中。

为了解决问题而新加进来的一些东西往往后来都会变成运维沉重的负担。

要确保在运维工程化中开发出来的工具交接完整。

过后再回头进行进一步的开发往往不灵。

更重要的是,变更请求可能会破坏已经安排好的工程计划。

4) 保持简单。

保持简单,因为你很聪明 别把事搞的太复杂 因为你行的。

(译者:KISS 原则 Keep It Simple, Stupid)5)应该非常谨慎地使用 缓存 ,为了保护资源一致性,它很难进行水平缩放。

如果你作的是一个可以横向扩展的东西,明智或审慎的做法是不要添加的缓存层。

如果非要使用,它应该是为最终用户获得性能,不是为了赢得一个网站的容量;6) 不要所有代码都自己写; 不要所有东西都外包; 在合适的时间使用合适的工具,完成你的工作. (译者: 不要重复造轮子)7)协商-真正有效的谈判唯一方式是先作一些调研,制定一些可行的性方案.这样你可以挑选你的首席开发商,如果你真的需要. 别虚张声势.8)一直保持N+1。

如果N=1,无论任何情况下不要轻易使用+1,这个1只用于当N down机情况下。

当使用冗余服务器来承载负载时候,不要让你的系统超过49%的负荷。

当有机会能只用N+2的架构时候,使用它。

9)数据丢失不是任何一个公司所能承担的风险–这是举世所知的真理。

数据丢失造成的损失远远大于保持数据不丢失所花的成本。

数据库30条军规解读

数据库30条军规解读

数据库30条军规解读军规适用场景:并发量大、数据量大的互联网业务军规:介绍内容解读:讲解原因,解读比军规更重要一、基础规范(1)必须使用InnoDB存储引擎解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高(2)必须使用UTF8字符集解读:万国码,无需转码,无乱码风险,节省空间(3)数据表、数据字段必须加入中文注释解读:N年后谁tm知道这个r1,r2,r3字段是干嘛的(4)禁止使用存储过程、视图、触发器、Event解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。

数据库擅长存储与索引,CPU计算还是上移吧(5)禁止存储大文件或者大照片解读:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存URI多好二、命名规范(6)只允许使用内网域名,而不是ip连接数据库(7)线上环境、开发环境、测试环境数据库内网域名遵循命名规范业务名称:xxx线上环境:dj.xxx.db开发环境:dj.xxx.rdb测试环境:dj.xxx.tdb从库在名称后加-s标识,备库在名称后加-ss标识线上从库:dj.xxx-s.db线上备库:dj.xxx-sss.db(8)库名、表名、字段名:小写,下划线风格,不超过32个字符,必须见名知意,禁止拼音英文混用(9)表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx三、表设计规范(10)单实例表数目必须小于500(11)单表列数目必须小于30(12)表必须有主键,例如自增主键解读:a)主键递增,数据行写入可以提高插入性能,可以避免page分裂,减少表碎片提升空间和内存的使用b)主键要选择较短的数据类型, Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率c)无主键的表删除,在row模式的主从架构,会导致备库夯住(13)禁止使用外键,如果有外键完整性约束,需要应用程序控制解读:外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQL Server数据库开发的二十一条军规
好人发表于2007年11月23日 09:51 阅读(15) 评论(0) 分类:数据库举报
如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS)。

在这里,我不打算介绍使用SQL Server的窍门,也不能提供一个包治百病的方案,我所做的是总结一些经验----关于如何形成一个好的设计。

这些经验来自我过去几年中经受的教训,一直来,我看到许多同样的设计错误被一次又一次的重复。

一、了解你用的工具
不要轻视这一点,这是我在这篇文章中讲述的最关键的一条。

也许你也看到有很多的SQL Server程序员没有掌握全部的T-SQL命令和SQL Server提供的那些有用的工具。

“什么?我要浪费一个月的时间来学习那些我永远也不会用到的SQL命令???”,你也许会这样说。

对的,你不需要这样做。

但是你应该用一个周末浏览所有的T-SQL命令。

在这里,你的任务是了解,将来,当你设计一个查询时,你会记起来:“对了,这里有一个命令可以完全实现我需要的功能”,于是,到MSDN 查看这个命令的确切语法。

二、不要使用游标
让我再重复一遍:不要使用游标。

如果你想破坏整个系统的性能的话,它们倒是你最有效的首选办法。

大多数的初学者都使用游标,而没有意识到它们对性能造成的影响。

它们占用内存,还用它们那些不可思议的方式锁定表,另外,它们简直就像蜗牛。

而最糟糕的是,它们可以使你的DBA所能做的一切性能优化等于没做。

不知你是否知道每执行一次FETCH就等于执行一次SELECT命令?这意味着如果你的游标有10000条记录,它将执行10000次SELECT!如果你使用一组SELECT、UPDATE或者DELETE来完成相应的工作,那将有效率的多。

初学者一般认为使用游标是一种比较熟悉和舒适的编程方式,可很不幸,这会导致糟糕的性能。

显然,SQL的总体目的是你要实现什么,而不是怎样实现。

我曾经用T-SQL重写了一个基于游标的存储过程,那个表只有100,000条记录,原来的存储过程用了40分钟才执行完毕,而新的存储过程只用了10秒钟。

在这里,我想你应该可以看到一个不称职的程序员究竟在干了什么!!!
我们可以写一个小程序来取得和处理数据并且更新数据库,这样做有时会更有效。

记住:对于循环,T-SQL无能为力。

我再重新提醒一下:使用游标没有好处。

除了DBA的工作外,我从来没有看到过使用游标可以有效的
完成任何工作。

三、规范化你的数据表
为什么不规范化数据库?大概有两个借口:出于性能的考虑和纯粹因为懒惰。

至于第二点,你迟早得为此付出代价。

而关于性能的问题,你不需要优化根本就不慢的东西。

我经常看到一些程序员“反规范化”数据库,他们的理由是“原来的设计太慢了”,可结果却常常是他们让系统更慢了。

DBMS被设计用来处理规范数据库的,因此,记住:按照规范化的要求设计数据库。

四、不要使用SELECT *
这点不太容易做到,我太了解了,因为我自己就经常这样干。

可是,如果在SELECT中指定你所需要的列,那将会带来以下的好处:
1 减少内存耗费和网络的带宽
2 你可以得到更安全的设计
3 给查询优化器机会从索引读取所有需要的列
五、了解你将要对数据进行的操作
为你的数据库创建一个健壮的索引,那可是功德一件。

可要做到这一点简直就是一门艺术。

每当你为一个表添加一个索引,SELECT会更快了,可INSERT和DELETE却大大的变慢了,因为创建了维护索引需要许多额外的工作。

显然,这里问题的关键是:你要对这张表进行什么样的操作。

这个问题不太好把握,特别是涉及DELETE和UPDATE时,因为这些语句经常在WHERE部分包含SELECT命令。

六、不要给“性别”列创建索引
首先,我们必须了解索引是如何加速对表的访问的。

你可以将索引理解为基于一定的标准上对表进行划分的一种方式。

如果你给类似于“性别”这样的列创建了一个索引,你仅仅是将表划分为两部分:男和女。

你在处理一个有1,000,000条记录的表,这样的划分有什么意义?记住:维护索引是比较费时的。

当你设计索引时,请遵循这样的规则:根据列可能包含不同内容的数目从多到少排列,比如:姓名+省份+性别。

七、使用事务
请使用事务,特别是当查询比较耗时。

如果系统出现问题,这样做会救你一命的。

一般有些经验的程序员都有体会-----你经常会碰到一些不可预料的情况会导致存储过程崩溃。

八、小心死锁
按照一定的次序来访问你的表。

如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。

如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一个死锁。

如果锁定顺序没有被预先详细的设计好,死锁是不太容易被发现的。

九、不要打开大的数据集
一个经常被提出的问题是:我怎样才能迅速的将100000条记录添加到ComboBox中?这是不对的,你不能也不需要这样做。

很简单,你的用户要浏览100000条记录才能找到需要的记录,他一定会诅咒你的。

在这里,你需要的是一个更好的UI,你需要为你的用户显示不超过100或200条记录。

十、不要使用服务器端游标
与服务器端游标比起来,客户端游标可以减少服务器和网络的系统开销,并且还减少锁定时间。

十一、使用参数查询
有时,我在CSDN技术论坛看到类似这样的问题:“SELECT * FROM a WHERE a.id='A'B,因为单引号查询发生异常,我该怎么办?”,而普遍的回答是:用两个单引号代替单引号。

这是错误的。

这样治标不治本,因为你还会在其他一些字符上遇到这样的问题,更何况这样会导致严重的bug,除此以外,这样做还会使SQL Server的缓冲系统无法发挥应有的作用。

使用参数查询,釜底抽薪,这些问题统统不存在了。

十二、在程序编码时使用大数据量的数据库
程序员在开发中使用的测试数据库一般数据量都不大,可经常的是最终用户的数据量都很大。

我们通常的做法是不对的,原因很简单:现在硬盘不是很贵,可为什么性能问题却要等到已经无可挽回的时候才被注意呢?
十三、不要使用INSERT导入大批的数据
请不要这样做,除非那是必须的。

使用UTS或者BCP,这样你可以一举而兼得灵活性和速度。

十四、注意超时问题
查询数据库时,一般数据库的缺省都比较小,比如15秒或者30秒。

而有些查询运行时间要比这长,特别是当数据库的数据量不断变大时。

十五、不要忽略同时修改同一记录的问题
有时候,两个用户会同时修改同一记录,这样,后一个修改者修改了前一个修改者的操作,某些更新就会丢失。

处理这种情况不是很难:创建一个timestamp字段,在写入前检查它,如果允许,就合并修改,如果存在冲突,提示用户。

十六、在细节表中插入纪录时,不要在主表执行SELECT MAX(ID)
这是一个普遍的错误,当两个用户在同一时间插入数据时,这会导致错误。

你可以使用SCOPE_IDENTITY,IDENT_CURRENT和IDENTITY。

如果可能,不要使用IDENTITY,因为在有触发器的情况下,它会引起一些问题(详见这里的讨论)。

十七、避免将列设为NULLable
如果可能的话,你应该避免将列设为NULLable。

系统会为NULLable列的每一行分配一个额外的字节,查询时会带来更多的系统开销。

另外,将列设为NULLable使编码变得复杂,因为每一次访问这些列时都必须先进行检查。

我并不是说NULLS是麻烦的根源,尽管有些人这样认为。

我认为如果你的业务规则中允许“空数据”,那么,将列设为NULLable有时会发挥很好的作用,但是,如果在类似下面的情况中使用NULLable,那简直就是自讨苦吃。

CustomerName1
CustomerAddress1
CustomerEmail1
CustomerName2
CustomerAddress2
CustomerEmail3
CustomerName1
CustomerAddress2
CustomerEmail3
如果出现这种情况,你需要规范化你的表了。

十八、尽量不要使用TEXT数据类型
除非你使用TEXT处理一个很大的数据,否则不要使用它。

因为它不易于查询,速度慢,用的不好还会浪费大量的空间。

一般的,VARCHAR可以更好的处理你的数据。

十九、尽量不要使用临时表
尽量不要使用临时表,除非你必须这样做。

一般使用子查询可以代替临时表。

使用临时表会带来系统开销,如果你是用COM+进行编程,它还会给你带来很大的麻烦,因为COM+使用数据库连接池而临时表却自始至终都存在。

SQL Server提供了一些替代方案,比如Table数据类型。

二十、学会分析查询
SQL Server查询分析器是你的好伙伴,通过它你可以了解查询和索引是如何影响性能的。

二十一、使用参照完整性
定义主健、唯一性约束和外键,这样做可以节约大量的时间。

相关文档
最新文档