SQLServer性能优化之查询提示

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:
数据库于周日被重启了,刚好看看优化后的效果,顺便再找找新的需要优化的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
相关文章
|
4月前
|
SQL 存储 数据挖掘
SQL Server 日期格式查询详解
SQL Server 日期格式查询详解
304 2
|
6月前
|
SQL 存储 安全
Play Framework的安全面纱:揭开隐藏在优雅代码下的威胁
【8月更文挑战第31天】Play Framework 是一款高效、轻量级的 Web 开发框架,内置多种安全特性,助力开发者构建安全稳定的应用。本文详细介绍 Play 如何防范 SQL 注入、XSS 攻击、CSRF 攻击,并提供安全的密码存储方法及权限管理策略,通过具体示例代码展示实施步骤,助您有效抵御常见威胁。
85 0
|
6月前
|
SQL 存储 开发框架
Entity Framework Core 与 SQL Server 携手,高级查询技巧大揭秘!让你的数据操作更高效!
【8月更文挑战第31天】Entity Framework Core (EF Core) 是一个强大的对象关系映射(ORM)框架,尤其与 SQL Server 数据库结合使用时,提供了多种高级查询技巧,显著提升数据操作效率。它支持 LINQ 查询,使代码简洁易读;延迟加载与预先加载机制优化了相关实体的加载策略;通过 `FromSqlRaw` 或 `FromSqlInterpolated` 方法支持原始 SQL 查询;可调用存储过程执行复杂任务;利用 `Skip` 和 `Take` 实现分页查询,便于处理大量数据。这些特性共同提升了开发者的生产力和应用程序的性能。
310 0
|
6月前
|
SQL 存储 测试技术
SQL Server 查询超时问题排查
【8月更文挑战第14天】遇到SQL Server查询超时,先检查查询复杂度与索引使用;审视服务器CPU、内存及磁盘I/O负载;审查SQL Server配置与超时设置;检测锁和阻塞状况;最后审查应用代码与网络环境。每步定位问题根源,针对性优化以提升查询效率。务必先行备份并在测试环境验证改动。
456 0
|
6月前
|
SQL Java 数据库连接
JDBC连接SQL Server2008 完成增加、删除、查询、修改等基本信息基本格式及示例代码
这篇文章提供了使用JDBC连接SQL Server 2008数据库进行增加、删除、查询和修改操作的基本步骤和示例代码。
|
6月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
6月前
|
SQL 存储 关系型数据库
SQL SERVER 查询所有表 统计每张表的大小
SQL SERVER 查询所有表 统计每张表的大小
62 0
|
6月前
|
SQL
SQL SERVER 查询表结构,导出到Excel 生成代码用
SQL SERVER 查询表结构,导出到Excel 生成代码用
59 0
|
7月前
|
SQL 关系型数据库 数据库
关系型数据库SQLserver查询数据
【7月更文挑战第28天】
68 4
|
7月前
|
SQL 关系型数据库
关系型数据库SQLserver查询编辑器
【7月更文挑战第27天】
71 3