sql server 编译与重编译详解

“SQL Server 编译与重编译详解”是一篇介绍 SQL Server 编译过程的文章,其过程中主要涉及到 SQL Server Query Optimizer。

SQL Server Query Optimizer 是 SQL Server 中的一项非常重要的功能,它的作用是通过查询计划的优化来提高查询性能。Query Optimizer 在执行SQL语句之前,会对之进行编译,并生成一个执行计划。SQL Server 的执行计划是使用一种称为查询处理器(Query Processor)的模块生成的。

对于每一个 SQL 查询请求,SQL Server 都会执行以下步骤:

  1. Parse:将 SQL 查询转换为查询树,检查其语法和语义正确性。
  2. Algebrize:将查询树转换为逻辑查询计划(Logical Query Plan),对其中的乘法和连接运算等进行转换。
  3. Optimize:对逻辑查询计划进行优化,生成物理查询计划(Physical Query Plan)。
  4. Execute:执行物理查询计划,生成结果并返回给客户端。

SQL Server 编译过程包括了 Parse、Algebrize 和 Optimize 三个步骤,而 Query Optimizer 在 Optimize 步骤中发挥重要作用。

SQL Server 触发重编译的情况有几种:

  1. 访问计数器达到一定数量(默认是 5)。
  2. 相关表发生结构性变化,如增删字段或索引等。
  3. 统计信息发生变化,如表的数据量增加或减少等。

下面通过两个示例来说明 Query Optimizer 的作用和 SQL Server 编译和重编译的过程。

示例1:

假设我们有一个包含 10000 条数据的订单表,我们使用了以下 SQL 语句查询该表:

SELECT * FROM Orders WHERE OrderDate BETWEEN '20050101' AND '20050201'

这条语句用到了 BETWEEN 运算符,告诉查询引擎需要查找 OrderDate 列在指定时间范围内的所有订单。此时,SQL Server Query Optimizer 会通过算法来确定查询该表的最有效方式。假如查询引擎发现该表的 OrderDate 列上有索引,它便会使用该索引来查找数据。

示例2:

假设我们有一个商品表,其中有两个字段:ProductId 和 ProductName。我们执行以下 SQL:

SELECT ProductId FROM Products WHERE ProductName LIKE 'A%'

假如我们让查询引擎缓存该查询以提高查询效率,而后又进行了以下插入操作:

INSERT INTO Products VALUES (999, 'ABC')

此时,查询引擎会触发重编译,因为新的行符合缓存查询的条件。然后,Query Optimizer 会重新生成查询计划,这次会以新插入的行为基础,从而得到更好的查询性能。

综上所述,SQL Server 编译和重编译是 SQL Server Query Optimizer 自动完成的,并且对于 SQL 查询的性能优化至关重要。一些因素,如访问计数器、表结构变化和统计信息变化,会触发 SQL Server 的重编译,以保证查询的效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:sql server 编译与重编译详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • DBMS面向行和面向列的数据存储的区别

    DBMS(数据库管理系统)是一种软件,用于管理和组织数据。在DBMS中,数据存储可以分为两种方式:面向行(row-oriented)和面向列(column-oriented)。这里将详细讲解这两种存储方式的区别。 面向行存储 面向行存储是以行为基本单位来存储数据。数据按照行的顺序组织,每一行包含多个列,每个列存储不同的数据。这种方式非常适合于事务处理,因为它…

    database 2023年3月27日
    00
  • set rs=conn.execute,set rs=server.createobject(“ADODB.recordset”)的性能对比

    首先,我们需要了解 “set rs=conn.execute” 和 “set rs=server.createobject(“ADODB.recordset”)” 这两句语句的含义以及区别。 “set rs=conn.execute” 是一个用于执行 SQL 查询并返回结果集的方法。它直接执行 SQL 命令,获得结果集后直接将其保存到 Recordset 对…

    database 2023年5月21日
    00
  • redis-CRC16

    当数据帧长度在8bits-128bits范围内时,推荐CRC-8(CRC-8能够减少额外比特的开销,且有更好的性能表现)当数据帧长度在128bits-2048bits范围内时,推荐CRC-12,CRC-16,CRC-CCITT(CRC-12额外比特的开销更小,且用于6bit字符流的传输;对于16bits的标准,更推荐美国标准CRC-16,性能略优于CRC-C…

    Redis 2023年4月13日
    00
  • mysql_multi启动数据库

    1.初始化数据库 在$mysql_base目录下,新增加存放data的文件夹,用mysql_install_db命令执行初始化 [root@ora11g scripts]# ./mysql_install_db –help | less Usage: ./mysql_install_db [OPTIONS] –basedir=path The path …

    MySQL 2023年4月12日
    00
  • SQL 在SELECT语句里使用条件逻辑

    当我们使用 SELECT 语句来查询数据时,我们可能需要对结果进行条件筛选,这时需要运用条件逻辑。在SQL中,我们可以使用以下几种条件逻辑: WHERE WHERE 条件逻辑用于从表中检索满足一定条件的行。它可以与运算符(AND,OR)和比较运算符(=,>=,<=,<>)结合使用。下面是一个例子: SELECT column1, co…

    database 2023年3月27日
    00
  • Oracle SQL语句实现数字四舍五入取整

    Oracle SQL语句提供了许多对数字进行处理的函数,包括取整函数。在实际应用中,常常需要对浮点数进行四舍五入取整。 下面是在Oracle中实现数字四舍五入取整的完整攻略: ROUND函数 ROUND函数可以将数字四舍五入到指定的位数。ROUND函数有两个参数,第一个参数是要四舍五入的数字,第二个参数是要保留的小数位数。如果第二个参数省略,则默认为0,即整…

    database 2023年5月21日
    00
  • MySQL 5.7.13 源码编译安装配置方法图文教程

    下面详细讲解一下“MySQL 5.7.13 源码编译安装配置方法图文教程”的完整攻略。 环境准备 首先需要安装一些必要的工具包: $ sudo yum install -y cmake ncurses-devel bison gcc gcc-c++ 下载源码并解压 从官网 https://dev.mysql.com/downloads/mysql/ 下载 M…

    database 2023年5月22日
    00
  • 深入理解MySQL重做日志 redo log

    当我们在使用MySQL时,有时候会出现突然断电、宕机等异常情况,这时候就会出现数据丢失的问题。为了解决这个问题,MySQL提供了一个重做日志机制(redo log),以确保我们的数据在出现异常情况时也能够被恢复。在本文中,我们将如何深入理解MySQL的重做日志机制,以及如何使用它来保护我们的数据。 什么是重做日志(redo log) 重做日志(redo lo…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部