SQL 语法书写准则

1、准则目的

使公司内部的 SQL 语法统一规范;
便于项目团队相关人员的查看、修改;
提高存储过程执行效率,避免 SQL 语法错误导致服务器效率低而产生系统问题;

2、书写注释规范

2.1 签名、日期、用途
说明:每个存储过程必须要标明存储过程的编写者、编写日期、用途。
示例:
-- =============================================
-- Author: <Team >
-- Create date: <2022.8.13>
-- Description: <MES批号装配事务的装配参照清单获取>
-- Rev: 10.00 同时汇总各需求项的是否完成装配的状态
-- =============================================

2.2 局部变量的注释说明
说明:创建局部变量时,请标明变量的用途。
示例:
declare @IsMOItem char(1) --装配参照清单类型,1-参照工单进行装配,0-参照BOM进行装配

2.3 表变量、临时表的字段说明
说明:创建表变量或临时表时,请标明表、字段的用途。

2.4 段落缩进注释
说明:注释每一段代码的作用,便于查阅理解代码含义。
 

Declare @IsStartLot bit
DECLARE table_cur CURSOR FOR
SELECT LineSequence,IsStartLot from @AssyBOMItem
--用游标循环
OPEN table_cur
FETCH NEXT FROM table_cur INTO @LineSequence,@IsStartLot
WHILE @@fetch_status = 0
BEGIN
IF @@fetch_status = -2
CONTINUE
if @IsStartLot=1
begin --保留制自件,但删下层物料
update @AssyBOMItem set IsDelete=1
where LineSequence like @LineSequence+'%'
end
else
begin --删自制件,但保留下层物料
if exists(select LineSequence from @AssyBOMItem where LineSequence
like @LineSequence+'%')
update @AssyBOMItem set IsDelete=1
where LineSequence=@LineSequence
end
FETCH NEXT FROM table_cur INTO @LineSequence,@IsStartLot
END
DEALLOCATE table_cur

3、SQL 影响执行效率的注意点

3.1 Where 语句书写及效率影响
示例【1】:
在下面两条select语句中:
select * from table1 where field1<=10000 and field1>=0;
select * from table1 where field1>=0 and field1<=10000;
说明【1】:
如果数据表中的数据 field1 都>=0,则第一条 select 语句要比第二条 select
语句效率高的多,因为第二条 select 语句的第一个条件耗费了大量的系统资源。
原则:在 where 子句中应把最具限制性的条件放在最前面。
示例【2】:
在下面两条select语句中:
select * from tab where a=...and b=...and c=...;
说明【2】:
若有索引 index(a,b,c),则 where 子句中字段的顺序应和索引中字段顺序一致。
原则:where 子句中字段的顺序应和索引中字段顺序一致。
示例【3】:
以下假设在field1上有唯一索引I1,在field2上有非唯一索引I2。
select field3,field4 from tb where field1='sdf' 快
select * from tb where field1='sdf' 慢
说明【3】:
因为后者在索引扫描后要多一步 ROWID 表访问
示例【4】:
在下面两条select语句中:
select field3,field4 from tb where field1>='sdf' 快
select field3,field4 from tb where field1>'sdf' 慢
说明【4】:
因为前者可以迅速定位索引。
示例【5】:
在下面select语句:
select field3,field4 from tb where upper(field2)='RMN'不使用索引。
说明【5】:
如果一个表有两万条记录,建议不使用函数;如果一个表有五万条以上记录,
严格禁止使用函数!两万条记录以下没有限制。例如:Subtring、Like、Datepart
函数会降低搜索效率。
示例【6】:
select field3,field4 from tb where field2!='TOM'不使用索引。
说明【6】:
条件中尽量不用!=, Not in, Like, OR, NOT EXISTS 的条件语句。
示例【7】:
select field3,field4 from tb where field2 is not null 不使用索引。
说明【7】:
空值不在索引中存储,所以上面语句执行不会使用索引检索。

3.2 避免多表关联

1. 对单条记录检索时,请对 SQL 语句进行拆分,减少表关联。
示例:
改前
SELECT Lot.LotSN
FROM MO INNER JOIN
Lot ON MO.MOId = Lot.MOId
WHERE (MO.MOName = 'S20100408001-900G')
改后
declare @MOId char(12)
--先获取MOid
SELECT @MOId = MOId
FROM MO
WHERE (MOName = 'S20100408001-900G')
--单独查询Lot表,避免表关联
SELECT Lot.LotSN
FROM Lot
WHERE (Lot.MOId = @MOId)
2. 利用表变量来替换大表关联,表变量的作用域为一个批处理,批处理完了,表变量也会
随之失效,比起临时表有它独特的优点:不用手动去删除表变量以释放内存。
示例:
declare @t table
(cardNo int)
insert @t
select cardNo from member where in('a-01',代理号二)
select 字段 from order
inner join @t on
order.cardNo=@t.cardNo
3. 利用索引视图来提高大表关联的性能.

3.3 临时表和表变量的灵活使用

表变量的好处:
1. 避免重编译:表标量可以避免临时表引起的重编译。
2. 没有事务日志开销:表变量不执行事务日志活动,临时表执行该活动。
3. 没有锁开销:表变量被看作局部变量,不错在临时表的锁开销。
4. 没有回滚开销:没有事务日志就不存在回滚事务。
临时表的好处:
1. 临时表空间一般利用虚拟内存,大大减少了硬盘的 I/O 次数,因此也提高了系统效率。
2. 事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。
3. 数据当前会话期可见,其它的会话只能看到其结构,只能看到自己的数据,各会话的
数据互不干扰。

3.5 防范死锁问题

1.一定要在 Delete 前加上 If Existed(select XID from youtable where 删除的条件), 判
断之后再进行删除。以减少表锁的机会
示例:
If Exists(select LotId from Lot where LotSN = 'FG00000012')
begin
Delete Lot where LotSN = 'FG00000012'
end
2. 地方一定要在自已写的存储过程前加上
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED –允许脏读
3. 客户化程序在 ADO.NET 编写时,数据库操作完成后,一定需要释放 connection 连
接对象,不要用全局的 connection 对象不释放。

3.6 游标的谨慎使用

(1) 尽管使用游标比较灵活,可以实现对数据集中单行数据的直接操作,但游标会在下
面几个方面影响系统的性能:
使用游标会导致页锁与表锁的增加
导致网络通信量的增加
增加了服务器处理相应指令的额外开销
(2) 使用游标时的优化问题:
明确指出游标的用途:for read only 或 for update,在 for update 后指定被修改
的列。
示例:
定义一个标准游标:
declare mycursor cursor for select * from yuangong
定义一个只读游标:
declare mycursor cursor for select * from yuangong for read only
定义一个可写游标
declare mycursor cursor for select * from yuangong for udpate of 列名

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
8.用执行计划分析SQL性能      EXPLAIN PLAN是一个很好的分析SQL语句的工具,它可以在不执行SQL的情况下分析语句      通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称      按照从里到外,从上到下的次序解读分析的结果      EXPLAIN PLAN的分析结果是用缩进的格式排列的,最内部的操作将最先被解读,如果两个操作处于同一层中,带有最小操作号的将首先被执行      目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具      PG需要将自己添加的查询SQL文记入log,然后在EXPLAIN PLAN中进行分析,尽量减少全表扫描      ORACLE SQL性能优化系列      1.选择最有效率的表名顺序(只在基于规则的优化器中有效)      ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理      在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表      当ORACLE处理多个表时,会运用排序及合并的方式连接它们      首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;      然后扫描第二个表(FROM子句中最后第二个表);      最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并      例如:      表 TAB1 16,384 条记录      表 TAB2 5 条记录      选择TAB2作为基础表 (最好的方法)      select count(*) from tab1,tab2 执行时间0.96秒      选择TAB2作为基础表 (不佳的方法)      select count(*) from tab2,tab1 执行时间26.09秒      如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表      例如:   EMP表描述了LOCATION表和CATEGORY表的交集   SELECT *   FROM LOCATION L,   CATEGORY C,   EMP E   WHERE E.EMP_NO BETWEEN 1000 AND 2000   AND E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN      将比下列SQL更有效率   SELECT *   FROM EMP E ,   LOCATION L ,   CATEGORY C   WHERE E.CAT_NO = C.CAT_NO   AND E.LOCN = L.LOCN   AND E.EMP_NO BETWEEN 1000 AND 2000      2.WHERE子句中的连接顺序      ORACLE采用自下而上的顺序解析WHERE子句      根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾      例如:   (低效,执行时间156.3秒)   SELECT *   FROM EMP E   WHERE SAL > 50000   AND JOB = 'MANAGER'   AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);      (高效,执行时间10.6秒)   SELECT *   FROM EMP E   WHERE 25 50000   AND JOB = 'MANAGER';      3.SELECT子句中避免使用'*'      当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用'*'是一个方便的方法,不幸的是,这是一个非常低效的方法      实际上,ORACLE在解析的过程中,会将'*'依次转换成所有的列名      这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间      4.减少访问数据库的次数
SQL Server 2008是一款非常强大和流行的关系型数据库管理系统,广泛应用于企业级的数据应用开发和管理。SQL语法SQL Server 2008最重要的组成部分之一,通过SQL语法,我们可以对数据库中的数据进行查询、插入、更新、删除等操作。SQL语法大全包含的内容很广泛,下面简单介绍几个重要的部分。 1.基本语法:包括数据查询、插入、更新、删除等操作的基本语法,例如SELECT、INSERT、UPDATE、DELETE等。 2.条件查询:在数据查询操作中,往往需要根据一定的条件来筛选数据,此时需要使用条件查询语法,例如WHERE、AND、OR等。 3.排序:在数据查询操作中,经常需要对查询出的数据进行排序,此时需要使用排序语法,例如ORDER BY等。 4.分组:在数据查询操作中,需要对数据进行分组统计,此时需要使用分组语法,例如GROUP BY等。 5.聚合计算:在数据查询操作中,需要对数据进行聚合计算,例如求和、平均值、最大值、最小值等,此时需要使用聚合计算语法,例如SUM、AVG、MAX、MIN等。 6.连接查询:当需要从多个表中查询数据时,需要使用连接查询语法,例如INNER JOIN、LEFT JOIN、RIGHT JOIN等。 以上只是SQL语法大全的一部分内容,实际上涵盖的内容非常广泛,需要具体根据实际开发场景进行学习和应用。在学习SQL语法时,可以通过编写实际的代码和调试来加深理解,同时需要注意语法的规范和正确性,避免出现错误和安全漏洞。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

!chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值