关闭
当前搜索:

改写优化SQL(6):尽量少用标量子查询

前面几篇文章讲到了: 标量子查询、聚合标量子查询、行转列标量子查询、带top的标量子查询 如何转成left join。 之所以要转换,主要是因为标量子查询虽然写法上比较直观,容易理解,不用想就知道怎么写,但是存在:代码重复、多次访问同一个表 问题,所以效率比较低。 一、标量子查询的模板 按标量子查询方式,写出来的sql,都类似下面的代码: select tb.col1, ...
阅读(138) 评论(0)

改写优化SQL(5):带top的标量子查询改写

带top的标量子查询,是在标量子查询中,加上了top 1,因为如果不加top 1,关联后可能返回超过1条数据,就导致sql报错了。 但是加了top 1,又没有排序,比如:去最早的一条,或者最晚的一条。 这种写法,在语义上有点随意,因为top 1就是随机返回一条,这种写法不是很严谨,从语句的意思上,可以直接改为求max或者min。 更进一步,就发现,这种写法,其实和上篇文章里的标量子查...
阅读(125) 评论(0)

改写优化SQL(4):行转列标量子查询改为left join

前面两篇文章写的是,如何把 标量子查询、聚合标量子查询,转为 left join,标量子查询还可以实现行转列,但是同样的,销量比较差,建议转成 left join。 (1)建表 --学生表 CREATE TABLE student ( s# INT , sname NVARCHAR(32) , sage INT , ssex NVAR...
阅读(127) 评论(0)

改写优化SQL(3):聚合标量子查询改为left join

聚合标量子查询,是标量子查询的升级版,因为不是简单的返回一个字段,而是要对字段求 sum,avg等,也就是标量子查询+聚合函数。 但是这种写法,本质上还是标量子查询的写法,所以效率不高,建议改为left join方式。 (1)建表 CREATE TABLE tb_emp ( emp_id INT NOT NULL PRIMARY KEY CLUSTERED, emp_...
阅读(138) 评论(0)

改写优化SQL(2):not in改为left join

在sql语句中,not in是经常会用到的一种写法,因为这种写法很直观,容易理解。 但如果不注意的话,很容易写出错误的sql,而且性能存在严重问题,所以,不建议使用not in,要尽量把 not in写法,改为left join。 一、建表 CREATE TABLE tb_emp ( emp_id INT NOT NULL PRIMARY KEY CLUSTERED, emp_name ...
阅读(484) 评论(0)

改写优化SQL(1):标量子查询改为left join

标量子查询就是在select中出现的子查询,效率相对来说比较低,建议修改为效率更高的left join。 一、建表 CREATE TABLE tb_emp ( emp_id INT NOT NULL PRIMARY KEY CLUSTERED, emp_name VARCHAR(20) NOT NULL, tel VARCHAR(20) null ) INSERT INTO dbo.tb...
阅读(273) 评论(0)

SQL Server2016新特性(1):动态的显示执行计划(效果类似小视频)

SQL Server2016种的一个新特性是 可以动态的显示 执行计划的过程,就像小视频一样的效果。 一、准备工作 在数据库有一个表tb,数据量在8000w左右,如果数据量少了,显示的动态过程会一闪而过。 演示的例子很简单,就是要计算tb表的准确记录数,代码如下: SELECT COUNT(*) FROM tb 之前版本ssms上有2个按钮:显示估计的执行计划、包括实际的...
阅读(91) 评论(0)

索引的访问方式:索引查找、索引扫描

索引的访问方式主要是 索引查找、索引扫描。 (1)索引查找 在执行计划中为 index seek,适用于查找少量数据。 对应随机IO,能快速的定位一条数据。 (2)索引扫描 在执行计划中为 index scan,适合扫描整个索引的数据。 对应顺序IO,IO效率本身比较高。 (3)效率对比 索引查找 和 索引扫描,单从IO效率上来说,肯定是索引扫描的效率更高,因为顺序...
阅读(65) 评论(0)

SQL Server的条件索引、include索引

SQL Server中创建索引时,有2个比较特殊的关键字: where 、include。 (1)什么是条件索引呢? where顾名思义,就和sql语句中的where是一个意思,起到过滤作用。 加上where子句,创建的索引就是条件索引,索引中只包含满足条件的数据,这样会使得索引的体积更小,不管是索引扫描,还是查找,需要访问的页数也就更少。 举例: create in...
阅读(106) 评论(0)

SQL Server查询提示(6):优化器提示

优化器提示主要有以下几种: (1)fast number_rows 这个提示,可以看作是 优化器目标,做为一种指导方针,影响优化器的决策。 比如: select * from A with(fast 100) 就是告诉sql server的优化器,以最快的速度返回100行数据,以这个为目标,生成执行计划,所以,返回100行数据的速度会很快,但是对后面的数据来说,这个执行计划可能不...
阅读(69) 评论(0)

SQL Server查询提示(5):分组、合并提示

分组、合并,这里主要是指sql语句中的 group by 和 union 操作。 通过分组、合并提示,可以强制sql server优化器采用特定的分组、合并算法。 (1)分组group by提示 分组主要有 hash、order 两种算法。 这里的hash算法,和 关联提示中的hash算法,是相类似的,只不过这里通过hash算法不是用来join表,而是用来分组、去重数据的。 or...
阅读(76) 评论(0)

SQL Server查询提示(4):隔离级别提示

SQL Server中有4个隔离级别:读未提交、读已提交、可重复读、串行化,这4个都有对应的提示。 此外,还支持 nowait,readpast。 (1)隔离级别 READUNCOMMITTED 或 nolock:读未提交,也叫脏读,可以读到正在被修改的数据。 READCOMMITTED:读已提交,读到的都是已经提交的,确定的数据 REPEATABLEREAD:可重复读,...
阅读(68) 评论(0)

SQL Server查询提示(3):锁提示

锁提示可以用来强制锁的粒度、锁的模式。 (1)锁的粒度 就是锁定行,还是页,还是表。 ROWLOCK 行锁 PAGLOCK 页锁 TABLOCK 表锁 (2)锁的模式 就是独占锁,还是共享锁。 TABLOCKX 独占表锁 UPDLOCK 更新锁 XLOCK 独占锁 (3)组合用法 注意,下面的例子都要在 事务中,才有效,也就是要在语句的前面加上 be...
阅读(79) 评论(0)

SQL Server查询提示(2):索引提示

索引提示一般用来强制查询使用特定索引,或者强制使用索引的方式。 (1)使用特定的索引 有时候,发现一个查询很慢,然后创建了一个索引,照理,查询应该用这个索引,但实际执行的时候,执行计划却没有用到这个索引,怎么办呢? 首先,可以尝试更新下统计信息。 其次,如果更新完统计信息后,还是没用到索引,这种情况下,可以考虑强制使用索引提示。 使用方法: select * from A wh...
阅读(79) 评论(0)

SQL Server查询提示(1):关联提示

查询提示主要用来手动改变执行计划,这里要讲的关联提示,主要是用来指定2个表关联时,用何种关联算法。 创建测试表: if object_id('t1') is not null drop table t1 if object_id('t2') is not null drop table t2 go select * into t1 from sys.objects select * i...
阅读(67) 评论(0)
78条 共6页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:526370次
    • 积分:9035
    • 等级:
    • 排名:第2474名
    • 原创:362篇
    • 转载:14篇
    • 译文:1篇
    • 评论:137条
    博客专栏
    最新评论