2019年11月4日微软发布了2019正式版,该版本有着比以往更多强大的新功能和性能上的优势,可参阅SQL Server 2019 新版本

SQL Server 2019具有一组丰富的增强功能和新功能。特别是,数据库引擎中有许多新功能改进,以实现更好的性能和查询调整。

一些重要的增强功能包括:

  • 行模式内存授予
  • 行存储上的批处理模式
  • APPROX_COUNT_DISTINCT
  • 兼容性级别提示
  • 列存储索引的增强,例如在线重建,压缩估计
  • 配置管理器中的证书管理
  • 数据库分类改进

在本文中,我们将讨论Approx_Count_Distinct函数。该功能以前在Azure SQL数据库中可用,但现在已随SQL Server 2019启动。

在日常环境中,当我们处理数据时,数据库中有许多表具有重复的值。例如,假设一个客户表保存了从商店购买产品的所有客户的记录。众所周知,客户可以多次购买产品,并且每次客户访问商店并购买商品时,都会在客户表中进行输入。

现在,假设我们想从表中了解唯一客户的信息,因此直到现在,对于SQL Server 2017,我们都使用Count different函数来获取唯一记录。计数不同功能的格式如下。

 
 

首先,让我们准备具有数百万行的示例数据库和表,然后为您介绍SQL Server 2019 Approx_count_distinct中的新函数。

在本文中,我们将需要为我将使用ApexSQL Generate的测试数据生成数百万行。

出于演示目的,让我们在数据库中创建两个表。

  1. 员工表:
CREATE Table Employees
(
EMPId int identity primary key,
EMP_name nvarchar(50) Null
)
  • 插入200万行随机数据
  • 我们将在表中插入任何Null值。
  1. EmployeesWithNull :。
CREATE Table EmployeesWithNull
(
EMPId int identity primary key,
EMP_name nvarchar(50) Null)
  • 在此表中插入200万条记录。
  • 我们将在此表中插入NULL值

Approx_Count_Distinct函数概述

SQL Server 2019引入了新函数Approx_Count_distinct以提供行的近似计数。Count(distinct())函数提供实际的行数。在实际情况下,如果我们得到近似值,则也可以使用不同的值。此新功能提供了大约的行数,对于大量的行很有用。

该函数APPROX_COUNT_DISTINCT应该使用较少的内存和CPU资源,以便可以获取数据结果而不会出现任何问题,例如溢出到磁盘或CPU峰值。这对于数十亿行的需求很有用。

根据Microsoft 文档,“函数实现可保证97%的概率内2%的错误率。”

Approx_Count_distinct的语法为APPROX_COUNT_DISTINCT(表达式)

让我们对两个计数(不同)进行一些比较。

从“ dbo.employees”表中获取不同记录的数量,并查看实际的执行计划

还可以从计数不同功能中查看统计信息。

查看输出记录数。它在表中显示200万个不同的记录。

通过右键单击“将执行计划另存为”来保存执行计划,并提供保存位置。

现在使用SQL Server 2019函数APPROX_COUNT_Distinct运行以下查询。

SET STATISTICS TIME ON
select APPROX_COUNT_DISTINCT(EMPID) from [dbo].[Employees]

注意记录数。它表示205,580条记录,而我们的表仅包含200万行。它表明我们没有得到不同值的准确计数,而是近似值。

右键单击执行计划,然后单击“比较显示计划”

在“比较显示计划”中,提供先前保存的执行计划路径

现在,我们可以看到Count(离散)和Approx_Count_distinct的比较。两种执行计划看起来都一样。在Approx_Count_distinct中,与使用count(distinct)的0.195秒相比,可以看到聚簇索引扫描时间为0.079秒的微小改进。

现在,如果我们比较两个执行计划中的select运算符,则在下面的结果集中,我们在Approx_count_distinct函数中看到的值有点高。例如,当我们使用新功能时,缓存计划大小,compileCPU,Compilememory,编译时间很高。

让我们在表上使用Null值执行相同的测试。

在执行计划比较报告中可以看到以下结果。

与计数不同功能相比,行计数再次高。

让我们在表中插入更多记录并刷新数据。

如果现在比较两个执行计划,则使用APPROX_COUNT_DISTINCT函数时,性能几乎不会提高。

让我们再对示例数据库WideWorldImporters进行测试。在比较报告中,我们发现使用Approx_Count_distinct时,CompileCPU,CompileMemory和CompileTime的值较少,而计数不同。

您可以在两种方法中看到行数的差异。在我的演示中,大多数时候我都看到带有新功能的高行数,但是在这里我们可以看到比实际值低的值,但比实际值低0.34%。

让我们在运行两个查询以捕获实时性能跟踪之前启动默认的扩展事件会话“标准”。从SQL Server Management Studio展开XEvent分析器,然后启动会话。

这将捕获逻辑读取,CPU时间,写入,持续时间。

我们可以注意到,在使用Approx_count_distinct时,其值与count count函数相比要低一些。

结论

我们探索了在SQL Server 2019中获得近似计数的不同非空值的新功能。在我的测试期间,我在性能方面得到了混合的结果,但是您可以尝试在更复杂的数据方案中运行。

SQL Server 2019 新函数Approx_Count_Distinct的更多相关文章

  1. SQL SERVER 2019新功能

    1.错误代码行 BEGIN TRY    SELECT 1/0END TRYBEGIN CATCH    THROW END CATCH2.二级制截断列名值 chose语法

  2. SQL Server 2019 深度解读:微软数据平台的野望

    本文为笔者在InfoQ首发的原创文章,主要利用周末时间陆续写成,也算近期用心之作.现转载回自己的公众号,请大家多多指教. 11 月 4 日,微软正式发布了其新一代数据库产品 SQL Server 20 ...

  3. SQL Server 2019 中标量用户定义函数性能的改进

    在SQL Server中,我们通常使用用户定义的函数来编写SQL查询.UDF接受参数并将结果作为输出返回.我们可以在编程代码中使用这些UDF,并且可以快速编写查询.我们可以独立于任何其他编程代码来修改 ...

  4. SQL Server 2019 新版本

    2019 年 11 月 4 日,微软在美国奥兰多举办的 Ignite 大会上发布了关系型数据库 SQL Server 的新版本.与之前版本相比,新版本的 SQL Server 2019 具备以下重要功 ...

  5. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

  6. sql server中常用方法函数

    SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...

  7. SQL Server 内置函数、临时对象、流程控制

    SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...

  8. 10、SQL Server 内置函数、临时对象、流程控制

    SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...

  9. 深入浅出SQL Server 2008 分区函数和分区表

    原文:深入浅出SQL Server 2008 分区函数和分区表 当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门数据的查询就可以更快的运行,基本原理就是,因为要扫描的数据变的 ...

随机推荐

  1. 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener

    十月 30, 2019 11:12:35 下午 org.apache.catalina.core.StandardContext listenerStart 严重: Exception sending ...

  2. 【每天学一点linux】后台进程不打印日志

    command > out.file 2>&1 & 将文件输出到指定的文件中

  3. Game of Cards Gym - 101128G (SG函数)

    Problem G: Game of Cards \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 题意就是给出\(n\)堆扑克牌,然后给出一个 ...

  4. Dockerfile介绍、Docker制作jdk镜像

    Dockerfile介绍.Docker制作jdk镜像 目标 1.Dockerfile简介 2.Docker制作jdk镜像 Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用 ...

  5. php实现隔行换色

    <?php $i = 0 ; //声明一个变量 echo "<table width='800' border='1px'>"; //表格开头 设置宽度边框 wh ...

  6. space-cloud 学习一 基本试用

    space-cloud 是一个支持多数据库,以下是一个简单的基于官方文档的试用 使用docker-compose 运行 环境准备 下载docker-compose文件 wget https://raw ...

  7. ent 基本使用六 Mixin

    ent 的Mixin 可以让我们服用已有的schema Mixin 接口说明 type Mixin interface { Fields() []ent.Field } 一个demo 代码 // -- ...

  8. GoCN每日新闻(2019-11-05)

    GoCN每日新闻(2019-11-05) GoCN每日新闻(2019-11-05) 1. Protobuf 终极教程 https://colobu.com/2019/10/03/protobuf-ul ...

  9. java并发编程(一)线程状态 & 线程中断 & 线程间的协作

    参考文章: Java线程的5种状态及切换:http://blog.csdn.net/pange1991/article/details/53860651 线程的5种状态: 1. 新建(NEW):新创建 ...

  10. NIO通信中connect()方法和finishConnect()方法的区别

    1.对于阻塞模式下,调用connect()进行连接操作时,会一直阻塞到连接建立完成(无连接异常的情况下).所以可以不用finishConnect来确认. 2.但在非阻塞模式下,connect()操作是 ...