SQLServer性能优化之查询提示

简介:
数据库于周日被重启了,刚好看看优化后的效果,顺便再找找新的需要优化的SQL
刚好找到了类似的几条语句,如下
select * from tableA where id not in (select id from tableB)
从执行时间20秒~70秒不等。
开始分析
首先是否用上索引,两个id均是主键所以不存在索引问题
其次分析一下索引,发现这两个id虽然是主键,但却不是聚集索引,而且id是通过newid()生成的完全无序的,因此这两个表在索引上可以说毫无用处,因为完全都是无序的。
换个思路,如果这两个id都是排序的,而且记录数也都不算少,再进行关联是不是会很快呢?还好SQLServer提供了Merge Join的hint提示,试试看吧
select * from tableA where id not in (select id from tableB) OPTION (MERGE JOIN); 
执行后出现以下错误:
消息 8622,级别 16,状态 1,第 1 行
由于此查询中定义了提示,查询处理器未能生成查询计划。请重新提交查询,并且不要在查询中指定任何提示,也不要使用 SET FORCEPLAN。
查了以下相关文档,也就是说该语句不支持OPTION (MERGE JOIN); 
那么换成not exists再试一下,看看效果是否会好一些
select * from tableA where not exists(select 1 from tableB where tableA.id=tableb.id)
通过测试后,发现稍微速度提高了一点点
最后再添加上OPTION (MERGE JOIN),试试看,居然变成了0秒
select * from tableA where not exists(select 1 from tableB where tableA.id=tableb.id) OPTION (MERGE JOIN); 
调优大获成功,呵呵。

总结:

不是所有相关表都一定要建索引(或者聚合索引),以后可以多试试SQLServer的查询提示。





本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/360268,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
8月前
|
存储 SQL 数据库
查询SQL server状态的三种方法
查询SQL server状态的三种方法
|
9月前
|
SQL 前端开发 Java
sqlserver数据库,mybatis中时间范围查询的应用。
sqlserver数据库,mybatis中时间范围查询的应用。
75 0
|
9月前
|
数据库
sqlserver视图与创建视图的语句查询的结果不一致
sqlserver视图与创建视图的语句查询的结果不一致
71 0
|
10月前
|
SQL
sql server链接查询
sql server链接查询
69 0
|
10月前
|
SQL
sql server简单查询
sql server简单查询
52 0
|
11月前
|
SQL 数据库
1 SQL快速入门、查询(SqlServer)[郝斌SqlServer完整版]
系统数据库:master、model、msdb、tempdb【我们自定义数据库的管理维护运行都需要系统库支持】
82 0
(转)使用公用表表达式的递归查询(SQLSERVER2005)
在 SQL Server 2005 中,当某个查询引用递归 CTE 时,它即被称为“递归查询”。递归查询通常用于返回分层数据,例如:显示某个组织图中的雇员或物料清单方案(其中父级产品有一个或多个组件,而那些组件可能还有子组件,或者是其他父级产品的组件)中的数据。
|
SQL 程序员 数据库
【Sql Server】基础之查询经纬度范围,10公里范围的经纬度标注点
基础之查询经纬度范围,10公里范围的经纬度标注点
144 0
【Sql Server】基础之查询经纬度范围,10公里范围的经纬度标注点
|
数据库
SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
304 0
|
SQL 关系型数据库 RDS
为什么同样的Sql语句在SqlServer RDS 查询得到的和自己本机SqlServer 查询的不一样呢?
为什么同样的Sql语句在SqlServer RDS 查询得到的和自己本机SqlServer 查询的不一样呢?
121 0
为什么同样的Sql语句在SqlServer RDS 查询得到的和自己本机SqlServer 查询的不一样呢?