Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

2
SQL Server:是否涵盖所有列的索引?
我们的团队继承了一个应用程序和关联的数据库。以前的开发人员似乎执行了一个规则,即每个表上的每个索引都有一个INCLUDE子句,以始终添加不属于键一部分的每个列。这些表平均具有2到5个索引或唯一约束以及外键。 目的是不管在数据库上引发什么查询,都是为了提高SELECT性能,因为访问是通过默认(但并非总是)检索所有列的ORM进行的。我们希望这样做的副作用是增加了存储需求(可能如此),并且增加了INSERT / UPDATE / DELETE的开销时间。 问题是,这是明智的策略吗?我们的团队具有SQL Server的历史,但是没有成员会认为自己是其内部行为的专家(尽管已经提出了一个问题,即如果该策略是最佳策略,那么现在是否将其作为默认策略?)。我们还应该期待其他哪些副作用(数据库服务器CPU /内存/ TempDB的使用情况等),或者上述某些假设是否正确? 此外,该应用程序既可以安装到SQL Server内部部署(自2012年以来的版本)中,也可以安装到Azure SQL中-如果我们为两者之间的任何差异或Azure的其他副作用做好了准备,方法?

1
SQL每隔几分钟就会从缓冲区缓存中转储所有页面
我有一个运行多个数据库的SQL2012 SP4节点。 该服务器有20GB可用内存,已为SQL分配了14GB内存(包装盒上没有其他任何东西)。 SQL每隔几分钟就会转储整个缓冲区高速缓存。页面预期寿命为零,缓冲区高速缓存描述符显示高速缓存中没有任何内容。 我查看了资源监视器通知,并且通知每隔几毫秒从高/稳定/低反弹一次: RESOURCE_MEMPHYSICAL_LOW RESOURCE_MEM_STEADY RESOURCE_MEMPHYSICAL_LOW 时间戳相隔几毫秒。PLE本质上是锯齿形。 我已经在SQL2012 SP1和以下问题之前看到过这种情况: 未使用缓冲区高速缓存中的SQL Server 2012可用页 似乎是类似的问题,尽管我已经更新到SP4。 我尝试为该服务帐户打开LPIM,并且尝试弄乱最大内存设置。降低最大内存似乎已导致缓冲区缓存更频繁地清空。 关于下一步要检查的任何想法? 服务器工作负载实际上什么都没有(我正在滚动浏览ERP系统中的项目列表,在缓存再次下降之前,它达到了40-50MB)。 这很有趣,因为我从SP1升级以尝试解决此问题-那里的缓存已达到500MB左右。从那以后,我将最大内存设置降低到14GB,这似乎使情况变得更糟。 我想知道Windows是否惊慌并在SQL上发出有关内存压力的不正确通知-随之而来的是,将最大内存设置为无界的服务器似乎运行正常,但永远不会填满超过几百MB的缓存-但现在它刚到50岁... 更多信息:对于那些询问 核心数: 4 数据库大小: 80GB 错误日志显示: A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 seconds. Working set …

2
计算列无法保留,因为该列是不确定的
我知道这不是第一次提出此类问题。 但是,为什么在以下情况下创建的持久化计算列是“不确定的”。答案应该总是一样的,对不对? CREATE TABLE dbo.test (Id INT, EventTime DATETIME NULL, PosixTime INT NOT NULL) GO DECLARE @EventTime DATETIME = '20181001 12:00:00' DECLARE @GPSTime INT = DATEDIFF(SECOND, '19700101', @EventTime) INSERT INTO dbo.Test(Id, EventTime, PosixTime) VALUES (1, @EventTime, @GPSTime) , (2, NULL, @GPSTime) GO SELECT * FROM dbo.test GO ALTER TABLE dbo.test …

1
“警告:操作导致残留的I / O”与关键查找
我在SQL Server 2017执行计划中看到了以下警告: 警告:操作导致剩余IO [sic]。实际读取的行数为(3,321,318),但返回的行数为40。 这是SQLSentry PlanExplorer的片段: 为了改进代码,我添加了非聚集索引,因此SQL Server可以访问相关行。它工作正常,但通常索引中将包含太多(大)列。看起来像这样: 如果我仅添加索引,而没有包含列,则强制使用索引,如下所示: 显然,SQL Server认为密钥查找比剩余的I / O昂贵得多。我有一个没有大量测试数据的测试设置(但是),但是当代码投入生产时,它需要处理更多的数据,所以我很确定需要某种非聚集索引。 当您在SSD上运行时,关键查询真的那么昂贵吗?我必须创建全脂索引(包含很多包含列)吗? 执行计划: https : //www.brentozar.com/pastetheplan/?id=SJtiRte2X这是一个长存储过程的一部分。寻找IX_BatchNo_DeviceNo_CreatedUTC。

1
为什么我的Azure SQL(SQL Server)数据库一次又一次出现数据IO超载?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 6个月前关闭。 我正在S2版(50个DTU)下运行Azure SQL数据库。服务器的正常使用通常挂在10%左右的DTU上。但是,此服务器通常会进入一种状态,它将在数小时内将数据库的DTU使用率发送到85-90%。然后突然恢复到正常的10%使用率。 在此过载状态下,从应用程序对服务器进行的查询似乎仍在快速运行。 我可以从S2 =>任何东西(例如,S3)=> S2扩展服务器,似乎可以清除它挂起的任何状态。但是几个小时后,它将再次重复相同的重载状态周期。我注意到的另一个奇怪的事情是,如果我在S3计划(100 DTU)24/7上运行此服务器,则没有观察到此行为。当我将数据库缩减为S2计划(50 DTU)时,似乎只会发生这种情况。在S3计划中,我总是以5-10%的DTU使用率。显然未得到充分利用。 我已经检查了Azure SQL查询报告以查找流氓查询,但是我并没有发现任何异常,它显示了我所期望的使用资源的查询。 正如我们在这里看到的那样,用法全部来自数据IO。如果我更改此处的性能报告以按MAX显示热门的数据IO查询,我们将看到以下内容: 查看这些长期运行的需求似乎指向统计信息更新。从我的应用程序运行的内容实际上并不是什么。例如,查询16302显示: SELECT StatMan([SC0], [SC1], [SC2], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC0], [SC1], [SC2], step_direction([SC0]) over (order by NULL) AS [SB0000] FROM (SELECT [UserId] AS [SC0], [OrganizationId] AS [SC1], [Id] AS [SC2] FROM …

2
是什么导致此查询/执行计划的CPU使用率过高?
我有一个支持.NET Core API应用程序的Azure SQL数据库。浏览Azure门户中的性能概述报告表明,我的数据库服务器上的大部分负载(DTU使用情况)来自CPU,特别是一个查询: 如我们所见,查询3780几乎负责服务器上的所有CPU使用率。 这有点说得通,因为查询3780(见下文)基本上是应用程序的整个关键所在,并且用户经常调用它。这也是一个相当复杂的查询,需要许多联接才能获得所需的正确数据集。该查询来自一个存储库,最终看起来像这样: -- @UserId UNIQUEIDENTIFIER SELECT C.[Id], C.[UserId], C.[OrganizationId], C.[Type], C.[Data], C.[Attachments], C.[CreationDate], C.[RevisionDate], CASE WHEN @UserId IS NULL OR C.[Favorites] IS NULL OR JSON_VALUE(C.[Favorites], CONCAT('$."', @UserId, '"')) IS NULL THEN 0 ELSE 1 END [Favorite], CASE WHEN @UserId IS NULL OR C.[Folders] IS NULL THEN …


1
防止合并僵局
在我们的一个数据库中,我们有一个表,该表被多个线程密集并发访问。线程确实通过来更新或插入行MERGE。还有一些线程有时会删除行,因此表数据非常不稳定。进行upsert的线程有时会陷入死锁。该问题看起来类似于此问题中描述的问题。不过,不同之处在于,在我们的例子中,每个线程确实更新或插入一行。 简化的设置如下。该表是堆,上面有两个唯一的非聚集索引 CREATE TABLE [Cache] ( [UID] uniqueidentifier NOT NULL CONSTRAINT DF_Cache_UID DEFAULT (newid()), [ItemKey] varchar(200) NOT NULL, [FileName] nvarchar(255) NOT NULL, [Expires] datetime2(2) NOT NULL, CONSTRAINT [PK_Cache] PRIMARY KEY NONCLUSTERED ([UID]) ) GO CREATE UNIQUE INDEX IX_Cache ON [Cache] ([ItemKey]); GO 典型的查询是 DECLARE @itemKey varchar(200) = 'Item_0F3C43A6A6A14255B2EA977EA730EDF2', @fileName nvarchar(255) …

1
了解IAM页面:范围间隔
我正在阅读Itzik的书《查询Microsoft SQL Server 2012》,以及在互联网上阅读/观看不同的教学材料。我的目的是对数据库内部如何工作有一个有益的了解。 我有一个小小的疑问,我无法解决有关IAM页面的问题。由于我尚处于了解的初期,因此也许我需要那些了解情况更好的人的额外帮助,因此,如果我的疑问似乎很可笑,请原谅我。 在第15章“实现索引和统计信息”中,出现了一个图像-如下图所示-作为IAM页面的示例: 您可以通过红色箭头看到与同一范围相关的16页内容。那怎么可能?是作者/编辑的错误吗?还是更有可能的:我是否有一些不正确的理解? 我的另一个问题与页面间隔有关。为什么它们不连续?以最后一个范围为例,它将覆盖ID为336至22642或前一个ID为296至328的页面。

2
究竟何时有多个用户无法同时使用临时表运行存储过程?
我对最近在TechNet上阅读的有关Temp Tables的文档有疑问。该页面上“ 临时表”部分的第四段内容如下: 如果使用命名约束创建了一个临时表,并且该临时表是在用户定义的事务范围内创建的,则一次只能有一个用户可以执行创建临时表的语句。例如,如果存储过程创建具有命名主键约束的临时表,则该存储过程不能由多个用户同时执行。 我在这样一个环境中工作:我们大量使用了一些使用索引临时表的存储过程,而我们从未遇到过用户必须等待一个执行完成才能开始下一个执行的问题。我希望情况会继续如此,但我担心,如果未正确理解此警告,可能会成为一个问题。 具体来说,我不清楚以下几点: 这仅适用于全局临时表还是局部临时表?一个在会话外部不可见的表(在后一种情况下)会阻止另一个会话同时执行,这似乎很奇怪。 什么才算是“命名约束”?并非所有约束都具有名称(即使它们是系统生成的)?这是否指的是具有用户定义别名的约束?对我来说,这似乎是措辞不好。 “多个用户”实际上意味着多个会话吗?这些过程是通过使用单个服务帐户的应用程序调用的,因此99.9%的脚本调用是由该单个帐户进行的(对于管理员偶尔在后端进行的调用,我并不担心)。如果服务帐户可以同时在多个会话中运行该存储过程,那么出于我的目的,这个问题就没有意义了。

3
触发更改创建时的数据库排序规则
我正在尝试创建一个触发器,以更改数据库创建时的排序规则,但是如何捕获触发器中要使用的数据库名称? USE master GO CREATE TRIGGER trg_DDL_ChangeCOllationDatabase ON ALL SERVER FOR CREATE_DATABASE AS declare @databasename varchar(200) set @databasename =db_name() ALTER DATABASE @databasename COLLATE xxxxxxxxxxxxxxxxxxx GO 显然,这是行不通的。

6
并行运行存储过程
我正在尝试尝试同时使用不同的参数多次运行相同的存储过程。 我正在使用SQL 2014 这样做的原因是该过程大约需要7个小时才能完成。实际上,它多次执行相同的过程。因此,例如,它可能会为每个分支建立一个新的数据库和表。 我想要做的是分解存储过程,这样我可以在每个分支中运行,但随后并行运行每个查询。我已经通过在单独的查询窗口中运行它进行了测试,并且运行速度快了将近80%。 谁能给我一个虚拟的指南,以并行运行查询?

1
SQL Server查询存储是否捕获参数值?
SQL Server 2016中引入的新查询存储很棒。它是我以前使用较旧的Profiler工具所做的大部分工作的理想替代品。但是,我还没有找到一种方法来捕获与嗅探到的高资源消耗查询的各个调用相关的参数值。这可能吗? 我知道查询存储处理的是聚合数据而不是单个调用,因此我怀疑我在这里可能不走运。当我发现一个慢查询时,我发现它很方便进行故障排除,使其参数也与其最慢的调用之一相关联。我想知道如何使用最新最好的工具来执行此操作。(我不会错过使用Profiler!) 从安全角度来看,查询存储的锁定程度是否低于Profiler?我认为它需要从某个级别的单个调用中捕获数据才能计算聚合。只是不确定是否存储了其中的任何一个。


2
将标识列从INT更改为BIGINT
我有一个带有标识列的表,该列也是主键。当前,它有5000万行,标识列的最高值为148921803。该表具有很多DELETEs并对其INSERTS执行,因此值很高。 我们希望将数据类型从更改为INT,BIGINT以准备添加更多行。请注意,没有对PK列的引用。 用最少的停机时间来做到这一点的最佳方法是什么?我有两个选择。 放下PK并更改色谱柱;要么 复制落重命名方法,描述在这里:

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.