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. F Energy stones

    题意是,有$n$个石头,每个石头有初始能量$E_i$,每秒能量增长$L_i$,以及能量上限$C_i$,有$m$个收能量的时间点,每次把区间$\left[S_i, T_i\right]$石头的能量都给收 ...

  2. H5制作显示轮播图的方法Swiper

    1.需要引入Swiper插件 <!-- swiper插件 --> <link rel="stylesheet" href="https://unpkg. ...

  3. Aquameta 基于postgresql的web 开发平台

    Aquameta 是一个完全基于pg 开发的web平台 ,目前还在开发中. 当前支持的功能 meta 写入系统信息到pg bundle 基于pg 类似git 的文件系统 filesystem 双向文件 ...

  4. Apache ServiceComb Pack 微服务分布式数据最终一致性解决方案

    https://github.com/OpenSagas-csharp/servicecomb-pack-csharp Saga基本使用指南 使用前置条件说明 如果还有同学对Saga还不甚了解的同学, ...

  5. A@G!C005

    AGC005 A STring 不会,有没有老鸽蕉蕉我/kk/kel/dk https://agc005.contest.atcoder.jp/submissions/7926986 B Minimu ...

  6. 【题解】洛谷 P1449 后缀表达式

    目录 题目 思路 \(Code\) 题目 P1449 后缀表达式 思路 栈.题目说的不是很清楚,没说包含什么操作.除法用整数除法就行. 先string读入字符串,然后从前往后看如果是个数字就入栈,如果 ...

  7. vuex实现登录状态的存储,未登录状态不允许浏览

    基础思路就是使用vuex状态管理来存储登录状态(其实就是存一个值,例如token),然后在路由跳转前进行登录状态的判断,可以使用vue-router的全局前置守卫beforeEach,也可以使用路由独 ...

  8. Linux 查看文件权限命令ls -l 输出信息每列所代表的含义

  9. ~/.ssh/config文件的使用

    Host github-A HostName github.com User git IdentityFile /Users/xxx/.ssh/id_rsa_A IdentitiesOnly yes ...

  10. vs2017添加区域或者视图出错

    删除以下文件的信息:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files