SQL Server 查询优化的 7 个技巧

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: SQL Server 查询优化的 7 个技巧

在优化性能时,开发人员和架构师通常会忽略调整他们的 SQL 查询。了解数据库的工作原理和编写更好的 SQL 查询在提高性能方面发挥着巨大作用 高效的 SQL 查询意味着高质量、可扩展的应用程序。

技巧 1:为列选择合适的数据类型

SQL 中的每个表列都有一个关联的数据类型。您可以选择整数、日期、varchars、布尔值、文本等。开发时,选择正确的数据类型很重要。数字应该是数字类型,日期应该是日期等等,这对于索引是极其重要的。

让我们看看下面的例子。

SELECT employeeID, employeeName
FROM employee
WHERE employeeID = 13412;
复制代码

上面的[查询]获取 ID 为员工的员工 ID 和姓名13412如果 employeeID 的数据类型是字符串怎么办? 使用索引时您可能会遇到麻烦,因为当它应该是一个简单的扫描时,它会花费很长时间。

技巧 2:表变量和连接

当您有复杂的查询时,例如获取客户的订单以及他们的姓名和订单日期,您需要的不仅仅是一个简单的选择语句。在本例中,我们从客户和订单表中获取数据。这就是[加入]进来的地方。

让我们看一下连接的例子:

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
复制代码

SQL 提供innerfullleft outerright outer类型的联接。

表变量是临时存储数据的局部变量,具有局部变量的所有属性。不要在连接中使用表变量,因为 SQL 将它们视为单行。尽管它们速度很快,但表变量在连接中的表现并不好。

技巧 3:使用条件WHERE从句

条件WHERE子句用于子集化。假设您遇到这样的情况:

-if SEQ_VAR in (1, 2, 3) & diff(DATE_VAR2, DATE_VAR1)≥ 0
— elif SEQ_VAR in (4, 5, 6) & diff(DATE_VAR2, DATE_VAR1) ≥1
— else diff(DATE_VAR2, DATE_VAR1) ≥2
复制代码

使用条件WHERE子句,它看起来像这样:

SELECT 
  DAT.ID_VAR,
  DAT.SEQ_VAR,
  DAT.NUM_VAR,
  DATE_VAR1,
  DATE_VAR2,
  TRUNC(DATE_VAR2) - TRUNC(DATE_VAR1) AS LAG_IN_DATES
FROM 
  CURRENT_TABLE      DAT 
WHERE
  (TRUNC(DATE_VAR2) - TRUNC(DATE_VAR1)) >= CASE WHEN SEQ_VAR IN (1,2,3) THEN 0 WHEN SEQ_VAR IN (4,5,6) THEN 1 ELSE 2 END 
ORDER BY ID_VAR, SEQ_VAR
复制代码

技巧 4:使用SET NOCOUNT ON

执行INSERTSELECTDELETEUPDATE操作时,请使用SET NOCOUNT ON。SQL 总是为此类操作返回受影响的行数,因此当您有包含大量连接的复杂查询时,它会影响性能。

使用SET NOCOUNT ON,SQL 将不会计算受影响的行并提高性能。

在以下示例中,我们阻止显示有关受影响的行数的消息。

USE AdventureWorks2012;  
GO  
SET NOCOUNT OFF;  
GO  
-- Display the count message.  
SELECT TOP(5)LastName  
FROM Person.Person  
WHERE LastName LIKE 'A%';  
GO  
-- SET NOCOUNT to ON to no longer display the count message.  
SET NOCOUNT ON;  
GO  
SELECT TOP(5) LastName  
FROM Person.Person  
WHERE LastName LIKE 'A%';  
GO  
-- Reset SET NOCOUNT to OFF  
SET NOCOUNT OFF;  
GO  
复制代码

提示 5:避免ORDER BYGROUP BYDISTINCT

仅在必要时使用ORDER BYGROUP BY和。DISTINCTSQL 创建工作表并将数据放在那里。然后它根据查询组织工作表中的数据,然后返回结果。

技巧 6:完全限定数据库对象名称

使用完全限定的数据库对象名称的目的是消除歧义。完全限定的对象名称如下所示:

DATABASE.SCHEMA.OBJECTNAME.
复制代码

当您有权访问多个数据库、模式和表时,指定要访问的内容就变得很重要。除非您正在使用具有多个用户和模式的大型数据库,否则您不需要这样做,但这是一个很好的做法。

所以不要使用像这样的语句:

SELECT * FROM TableName
复制代码

你应该使用:

SELECT * FROM dbo.TableName
复制代码

技巧 7:了解如何完全保护您的代码

数据库存储各种信息,使它们成为主要的攻击目标。常见的攻击包括[SQL 注入] ,用户输入 SQL 语句而不是用户名并检索或修改您的数据库。SQL注入的例子包括:

textuserID = getRequestString("userID");
textSQL = "SELECT * FROM Users WHERE userID = " + textuserID;
复制代码

假设你有这个,textuserID将从用户那里获取输入。这是它可能出错的原因:

SELECT * FROM Users WHERE userID = 890 OR 1=1;
复制代码

由于1=1始终为真,它将从 Users 表中获取所有数据。

您可以使用参数化语句、输入验证、清理输入等来保护您的数据库免受 SQL 注入攻击。如何保护您的数据库取决于 DBMS。您需要了解您的 DBMS 及其安全问题,这样您才能编写安全的代码。


相关实践学习
使用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 监控 数据库
MSSQL性能调优实战指南:精准索引策略、SQL查询优化与高效并发控制
在Microsoft SQL Server(MSSQL)的性能调优过程中,精准索引策略、SQL查询优化以及高效并发控制是三大核心要素
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
2月前
|
SQL 存储 关系型数据库
Hologres SQL 查询优化技巧
【9月更文第1天】随着大数据处理的需求日益增长,如何高效地进行数据查询和分析变得尤为重要。Hologres 是阿里云推出的一款实时数仓产品,它基于 PostgreSQL 构建,并针对在线分析处理(OLAP)场景进行了优化,支持实时数据写入与查询,能够实现毫秒级的查询响应。本文将探讨在使用 Hologres 时如何编写高效的 SQL 查询,并介绍一些特定于 Hologres 的优化技巧。
194 2
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
110 13
|
4月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
4月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
60 6
|
4月前
|
SQL 缓存 关系型数据库
面试题MySQL问题之实现覆盖索引如何解决
面试题MySQL问题之实现覆盖索引如何解决
56 1
|
4月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
371 1
|
3月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
467 0
|
4月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
304 3