Questions tagged «sql-server-2016»

SQL Server 2016(主要版本13.00.xxxx)。还请标记sql-server。

3
为什么创建一个简单的CCI行组最多需要30秒?
当我发现一些插入内容花费的时间比预期的长时,我正在进行一个涉及CCI的演示。要重现的表定义: DROP TABLE IF EXISTS dbo.STG_1048576; CREATE TABLE dbo.STG_1048576 (ID BIGINT NOT NULL); INSERT INTO dbo.STG_1048576 SELECT TOP (1048576) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN FROM master..spt_values t1 CROSS JOIN master..spt_values t2; DROP TABLE IF EXISTS dbo.CCI_BIGINT; CREATE TABLE dbo.CCI_BIGINT (ID BIGINT NOT NULL, INDEX CCI CLUSTERED COLUMNSTORE); 对于测试,我将从登台表中插入所有1048576行。只要它由于某种原因没有被修剪,就足以填充一个压缩的行组。 …


1
为什么此派生表可以提高性能?
我有一个查询,需要一个json字符串作为参数。json是纬度,经度对的数组。输入示例如下。 declare @json nvarchar(max)= N'[[40.7592024,-73.9771259],[40.7126492,-74.0120867] ,[41.8662374,-87.6908788],[37.784873,-122.4056546]]'; 它调用一个TVF,该TVF可以计算在1、3、5、10英里距离处某个地理位置周围的POI数量。 create or alter function [dbo].[fn_poi_in_dist](@geo geography) returns table with schemabinding as return select count_1 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 1,1,0e)) ,count_3 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 3,1,0e)) ,count_5 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 5,1,0e)) ,count_10 = count(*) from dbo.point_of_interest where LatLong.STDistance(@geo) <= 1609.344e …

2
为什么“时区”不确定?
SQL Server 2016 AT TIME ZONE似乎不确定。但是,我无法找到正式说明这一点的文档,也无法找到其背后的理由。 为什么AT TIME ZONE不确定? 显示非确定性的示例 执行中: CREATE TABLE Test ( LegacyTimestamp DATETIME, Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED ); 返回以下错误: Msg 4936, Level 16, State 1, Line 1 Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is …

1
集群列存储上的非集群索引存储
在SQL Server中,行存储表上的非唯一非聚集索引在非聚集索引结构的所有级别上都包含基础对象的书签(RID或群集键)。书签作为所有索引级别上非聚集索引键的一部分存储。 另一方面,如果非聚集索引是唯一的,则书签仅在索引的叶级别存在-不作为键的一部分(实际上,书签作为一个或多个包含的列存在)。 在SQL Server 2016中,可以在面向列的表(具有群集列存储索引的表)上构建非群集b树索引。 集群列存储表上非集群b树索引使用的“书签”是什么? 上述唯一索引和非唯一非聚集索引之间的区别是否仍然适用?

2
插入期间磁盘空间已满,会发生什么?
今天,我发现存储我的数据库的硬盘驱动器已满。这是以前发生的,通常原因很明显。通常会有一个错误的查询,这会导致大量的溢出到tempdb,直到磁盘装满为止。这次不太清楚发生了什么,因为tempdb不是驱动器满载的原因,而是数据库本身。 事实: 通常的数据库大小约为55 GB,后来增加到605 GB。 日志文件大小正常,数据文件很大。 数据文件具有85%的可用空间(我将其解释为“空气”:已使用但已释放的空间。SQLServer分配后将保留所有空间)。 Tempdb大小正常。 我发现了可能的原因;有一个查询选择了太多行的查询(错误的联接会导致选择110亿行,预计会有几十万行)。这是一个SELECT INTO查询,使我想知道是否可能发生以下情况: SELECT INTO执行 目标表已创建 数据被选择时插入 磁盘已满,导致插入失败 SELECT INTO被中止并回滚 回滚可以释放空间(已插入的数据将被删除),但是SQL Server不会释放释放的空间。 但是,在这种情况下,我不希望由创建的表SELECT INTO仍然存在,应该通过回滚将其删除。我测试了这个: BEGIN TRANSACTION SELECT T.x INTO TMP.test FROM (VALUES(1))T(x) ROLLBACK SELECT * FROM TMP.test 结果是: (1 row affected) Msg 208, Level 16, State 1, Line 8 Invalid object name 'TMP.test'. …

4
SQL Server 2016 DB邮件未发送
我正在使用SQL Server 2016,并受到冲击...我的DB Mail无法发送,而且我的地方用光了。我仔细检查了对DBmail可执行文件的SQL帐户权限-它已读取并执行。我输入了防火墙出站端口587的规则。我尝试了另一个具有相同未发送问题的邮件帐户和配置文件。日志(db邮件日志)中唯一的条目是服务的开始和结束。我在任何地方都找不到错误。电子邮件似乎只是进入发送队列,而永不离开。这些帐户可以自己发送邮件,也可以从另一台计算机上的SQL Server 2014实例接收电子邮件。 我有一排发送状态为“未发送”的项目,除了一长列未发送的邮件之外,还检查了所有正常位置的所有预期结果: SELECT * FROM msdb..sysmail_event_log order by log_id DESC SELECT * FROM dbo.sysmail_mailitems SELECT * FROM dbo.sysmail_sentitems USE msdb SELECT sent_status, * FROM sysmail_allitems SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb'; EXECUTE msdb.dbo.sysmail_help_status_sp 我尝试将其关闭然后再打开...所以我错过了DMV等可能会发现这种情况的信息吗?这是我在搜索中没有发现的SQL Server 2016的已知问题吗?还有其他可能的步骤来发送此邮件吗?

1
使用SQL Server 2016系统版本的时态表进行慢速变化维度的查询策略
当使用系统版本的时态表(SQL Server 2016中的新增功能)时,当此功能用于处理大型关系数据仓库中的维缓慢变化时,查询创作和性能含义是什么? 例如,假设我有一个Customer带有Postal Code列的100,000行维,一个Sales带有CustomerID外键列的数十亿行事实表。并假设我要查询“按客户的邮政编码进行的2014年销售总额”。简化的DDL就是这样(为了清楚起见,省略了许多列): CREATE TABLE Customer ( CustomerID int identity (1,1) NOT NULL PRIMARY KEY CLUSTERED, PostalCode varchar(50) NOT NULL, SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL, SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) ) WITH (SYSTEM_VERSIONING = ON); …

1
为什么CHECKDB读取具有内存优化表的数据库上的事务日志文件?
tl; dr:为什么CHECKDB读取具有内存优化表的用户数据库的事务日志? 似乎CHECKDB在检查我的一个数据库-特别是使用内存中OLTP表的数据库时,正在读取用户数据库的事务日志文件。 该数据库的CHECKDB仍会在相当长的时间内完成,因此我主要是对行为感到好奇。但绝对是此实例上所有数据库中CHECKDB的最长持续时间。 从Paul Randal的史诗《从各个角度看CHECKDB:完整描述所有CHECKDB阶段》中,我看到SQL 2005以前的CHECKDB 用于读取日志,以便获得数据库的一致视图。但是由于这是2016年,因此它使用内部数据库快照。 但是,快照的先决条件之一是: 源数据库不得包含MEMORY_OPTIMIZED_DATA文件组 我的用户数据库具有这些文件组之一,因此看起来快照不在桌面上。 根据CHECKDB文档: 如果无法创建快照,或者指定了TABLOCK,则DBCC CHECKDB将获取锁以获取所需的一致性。在这种情况下,需要排他数据库锁来执行分配检查,并且需要共享表锁来执行表检查。 好的,所以我们正在执行数据库和表锁定而不是快照锁定。但这仍然不能解释为什么它必须读取事务日志。那有什么呢? 我在下面提供了一个脚本来重现该场景。它用于sys.dm_io_virtual_file_stats标识日志文件读取。 请注意,大多数情况下,它读取日志的一小部分(480 KB),但偶尔读取的日志则更多(48.2 MB)。在我的生产场景中,当我们运行CHECKDB时,它每天晚上在午夜读取大多数日志文件(约占2 GB文件的1.3 GB)。 这是到目前为止我通过脚本获得的输出示例: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:12:29.203 106 50545664 或这个: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:25:14.227 1 491520 如果我用常规表替换内存优化的对象,则输出如下所示: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:21:03.207 0 0 为什么CHECKDB读取日志文件?尤其是为什么它偶尔会读取日志文件的很大一部分? 这是实际的脚本: -- let's have …

1
SQL Server 2016错误查询计划每周锁定数据库一次
在过去的5周中,大约每天的同一时间(清晨,可能取决于人们开始使用时的用户活动),每周一次,SQL Server 2016(AWS RDS,已镜像)开始超时查询。 所有表上的UPDATE STATISTICS始终会立即对其进行修复。 第一次之后,我让它每晚(而不是每周)更新所有表上的所有统计信息,但是仍然发生(更新统计信息运行后大约8小时,但并非每天运行)。 上一次,我启用了查询存储,以查看是否可以找到具体的查询/查询计划。我想我可以将其缩小到一个: 找到该查询后,我添加了一个推荐索引,该索引在此不常用的查询中丢失了(但它确实涉及很多常用表)。 错误的查询计划正在执行索引扫描(在只有1万行的表上)。不过,其他返回的查询计划(以毫秒为单位)也用于进行相同的扫描。创建新索引后,最新查询计划仅查找。但是,即使没有该索引,也有99%的时间在几毫秒内返回了索引,但是每周要花40秒以上的时间。 超时的坏消息:http : //brentozar.com/pastetheplan/?id=rymaWt56e 以前不会超时的计划:http : //brentozar.com/pastetheplan/?id=HyN7ftcpe 具有新索引的最新计划:http : //brentozar.com/pastetheplan/?id=ryLuGKcag 从2012年迁移到SQL Server 2016之后,这种情况开始发生。 DBCC CHECKDB不返回任何错误。 新索引会解决问题,使其不再选择错误的计划吗? 我应该“强制”现在行之有效的计划吗? 如何确保其他查询/计划不会发生这种情况? 这是更大问题的征兆吗? 我刚刚添加的索引: CREATE NONCLUSTERED INDEX idx_AppointmetnAttendee_AttendeeType ON [dbo].[AppointmentAttendee] ([UserID],[AttendeeType]) CREATE NONCLUSTERED INDEX [idx_appointment_start] ON [dbo].[Appointment] ( [ProjectID] ASC, [Start] ASC ) INCLUDE ( …

1
datetime2(0)与datetime2(2)
根据文档datetime2(Transact-SQL): 存储大小 6字节,精度低于3。7 字节,精度3和4。 所有其他精度要求8字节。 的大小datetime2(0),datetime2(1),datetime2(2)使用相同的存储量(6个字节)。 我是否可以在datetime2(2)不增加任何尺寸费用的情况下继续使用并获得精度的好处是否正确? 请注意: 该列用PK索引,以形成复合聚集索引(用于表分区) 我不在乎毫秒 datetime2(0)在where子句中使用或在索引中查找时,CPU效率会更高吗? 这是一个庞大的表,因此最小的优化将有很大的不同。

2
证书链是由不可信的机构颁发的
前段时间,我在Windows 10家庭版环境(准确地说是笔记本电脑)上安装了SQL Server 2016开发人员版,一切都很好。 然后有人-盒子上的管理员-决定不告诉我,就重命名了该盒子。 之后,当尝试连接到SQL Server时,我们一直遇到以下错误消息: 这是与此非常类似的问题: 从Azure网站连接VM Role中的数据库时,“证书链由不可信的机构颁发” 我也来过这里: 目标主体名称不正确。无法生成SSPI上下文。(Microsoft SQL Server,错误:0) 我一直在使用Kerberos配置管理器,它给了我不同的错误消息 我应该说我能够通过SQL Server身份验证连接到该SQL Server实例,但是我想使用Windows身份验证进行连接。 只是要清楚-这都是本地计算机,不属于任何域。 我不太确定如何从这里开始,我想要使用Windows身份验证。 与证书有关的错误消息使我考虑在这里重新颁发证书。我不确定如何完成此任务,或者这是否是解决此问题的有效方法。 我今天不会在这台机器旁,但我会尽快赶上。如果时间允许,我将继续进行研究。


1
将溢出排序到tempdb,但估计的行等于实际的行
在最大内存设置为25GB的SQL Server 2016 SP2上,我们有一个查询,在一分钟内执行大约80次。该查询将大约4000页溢出到tempdb。这会在tempdb磁盘上导致大量IO。 当您查看查询计划(简化查询)时,您会看到估计的行数等于实际的行数,但仍然会发生溢出。因此,过时的统计信息不能成为问题的原因。 我做了一些测试,然后查询溢出到Tempdb: select id --uniqueidentifier from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) 但是,如果我选择其他列,则不会发生溢出: select startdate --datetime from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) 因此,我尝试“扩大” id列的大小: select CONVERT(nvarchar(512),id) from SortProblem where [status] ='A' order by SequenceNumber asc …

1
我的同事是如何得到自己的图式的?
我有一个存储过程: 检查表是否存在,如果存在,则将其删除。 再次创建该表 然后用大约30个查询填充该表。 当我(数据库所有者)运行此proc时,一切都按预期工作。当我的同事这样做时,他通过Active Directory中的角色对该数据库拥有DROP / CREATE权限,那么会出错。这让我感到困惑: 表的创建没有dbo在名称之前显式指定的架构。这样domain\cowork_id.table_name_here就创建了一个名为table的表。除了在他的个人模式中创建该表之外,他现在还在数据库上拥有该模式(在运行proc之前不存在)。 发生了什么?为什么SQL Server在dbo未指定用户架构的情况下而不是在用户架构中创建表?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.