Questions tagged «sql-server»

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

1
initdata:内核缓冲区没有内存
我最近将RedHat Enterprise Linux 7.6上的SQL Server 2017 Developer Edition升级到SQL Server 2019 CTP 3.0。 mssql-server服务将不再启动。/ var / opt / mssql / log / errorlog显示以下内容: 2019-06-12 09:36:31.98服务器Microsoft SQL Server 2019(CTP3.0)-15.0.1600.8(X64) 2019年5月17日00:56:19 版权所有(C)2019 Microsoft Corporation 开发人员版(64位) Linux(Red Hat Enterprise Linux) 2019-06-12 09:36:32.04服务器UTC调整:-5:00 2019-06-12 09:36:32.05服务器(c)Microsoft Corporation。 2019-06-12 09:36:32.07服务器保留所有权利。 2019-06-12 09:36:32.08服务器服务器进程ID为 32.2019-06-12 09:36:32.09服务器在文件'/ var / opt …

2
为什么带有参数的此递归CTE在处理文字时不使用索引?
我在树结构上使用递归CTE来列出树中特定节点的所有后代。如果我在WHERE子句中写入文字节点值,则SQL Server似乎实际上仅将CTE应用于该值,从而给出了具有较少实际行数的查询计划,等等: 但是,如果我将值作为参数传递,它似乎实现了(假脱机)CTE,然后在事实之后对其进行过滤: 我可能看错了计划。我还没有注意到性能问题,但是我担心CTE的实现会导致更大数据集的问题,尤其是在繁忙的系统中。另外,我通常会自己遍历此遍历:我遍历祖先,然后遍历到后代(以确保收集所有相关节点)。由于我的数据如何,每组“相关”节点都非常小,因此实现CTE没有任何意义。当SQL Server似乎意识到CTE时,它给我的“实际”数量带来了相当大的数目。 有没有办法让查询的参数化版本像文字版本一样工作?我想将CTE放在可重用的视图中。 用文字查询: CREATE PROCEDURE #c AS BEGIN; WITH descendants AS (SELECT t.ParentId Id ,t.Id DescendantId FROM #tree t WHERE t.ParentId IS NOT NULL UNION ALL SELECT d.Id ,t.Id DescendantId FROM descendants d JOIN #tree t ON d.DescendantId = t.ParentId) SELECT d.* FROM descendants d WHERE …

1
删除自动创建的NT AUTHORITY和NT SERVICE帐户
因此,我最近转移了工作-下面是我在新SQL Server安装的构建脚本中发现的一段代码。 IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = N'NT AUTHORITY\SYSTEM' ) BEGIN DROP LOGIN [NT AUTHORITY\SYSTEM]; END IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = N'NT SERVICE\SQLWriter' ) BEGIN DROP LOGIN [NT SERVICE\SQLWriter]; END IF EXISTS ( SELECT * FROM [sys].[syslogins] WHERE [name] = …

3
存储过程可以引用存储它的数据库吗?
假设我有一个存储过程,它在几个数据库中进行了重复的修改。而且我想引用存储过程存储在其中的数据库,即使它在另一个数据库中执行也是如此。 有没有办法检索完整路径(..)或以其他方式检索存储过程的数据库,而不是当前数据库?

3
在只读副本上长时间运行的查询会占用主数据库上的时间
我有一个4节点AG设置,如下所示: 所有节点的VM硬件配置: Microsoft SQL Server 2017企业版(RTM-CU14)(KB4484710) 16个vCPU 356 GB RAM(长话短说...) 最大并行度:1(根据应用程序供应商的要求) 并行成本阈值:50 服务器最大内存(MB):338944(331 GB) AG配置: 节点1:主节点或同步提交不可读的辅助节点,配置为自动故障转移 节点2:主节点或同步提交不可读的辅助节点,配置为自动故障转移 节点3:具有异步提交的可读辅助集,配置为手动故障转移 节点4:具有异步提交的可读辅助节点集,配置为手动故障转移 有疑问的查询: 此查询没有什么疯狂的,它提供了应用程序内各种队列中未完成工作项的摘要。您可以从下面的执行计划链接之一查看代码。 主节点上的执行行为: 在主要节点上执行时,执行时间通常约为1秒标记。这是执行计划,以下是从主节点从STATISTICS IO和STATISTICS TIME捕获的统计信息: (347 rows affected) Table 'Worktable'. Scan count 647, logical reads 2491, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, …

1
为什么我有多个(未关联的)时间历史表?
我一直在建立具有SQL Server 2017后端的概念证明系统。 系统使用临时表记录资产配置并跟踪随时间的变化。 我有一个链接到历史记录表的数据表,我们称它为dbo.MSSQL_TemporaryHistoryFor_12345678900。 到目前为止,一切都很好。我有两个问题: 今天,我关闭了表的版本控制功能,因此可以添加一个计算列。完成此操作,然后再次打开,没有错误。 现在,我发现我无法查询更改之前的任何历史数据。新数据将添加到历史记录中,但是没有任何预先设置。 在SSMS内部,我现在可以看到有多个历史记录表,它们都具有相同的名称,但带有十六进制后缀,例如dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3。它们未链接在主数据表下方。它们只是在数据库内部自行浮动。当我查询sys.tables时,这些没有显示为历史表,也没有链接到主数据表。 这些表确实包含丢失的历史数据。 因此,我的问题是: 这些附加表代表什么? 他们是如何创建的? 有什么办法可以将它们重新链接到主要历史链中,以便我可以获取历史报告吗? 这非常令人沮丧,因此将非常感谢您能提供的任何帮助。谢谢。

2
为charindex函数分割/存储长字符串的最快方法
我有一个1 TB的数字字符串。给定一个12个字符的数字序列,我想在原始字符串(charindex函数)中获得该序列的开始位置。 我已经使用SQL Server使用1GB字符串和9位子字符串测试了此字符串,并将该字符串存储为varchar(max)。Charindex需要10秒。将1GB的字符串分成900个字节的重叠块,并创建一个表(StartPositionOfChunk,Chunkofstring),该表的二进制排序规则中使用chunkofstring,建立索引所需的时间不到1秒。10GB的后一种方法是10个数字子串,将charindex升至1.5分钟。我想找到一种更快的存储方法。 例 字符串:0123456789-搜索345 charindex('345','0123456789')的子字符串得出4 方法1:现在,我可以将其存储在由一列组成的SQL Server表strtable中colstr并执行: select charindex('345',colstr) from strtable 方法2:或者我可以通过拆分原始字符串来组成表strtable2(pos,colstr1):1; 012 | 2; 123 | 3; 234 aso,然后我们可以进行查询 select pos from strtable2 where colstr1='345' 方法3:我可以通过将原始字符串分成较大的块1; 01234 |来组成表strtable2(pos2,colstr2)。4; 34567 | 7; 6789然后 select pos2+charindex('345',colstr2) from strtable2 where colstr2 like '%345%' 第一种方法最慢。 第二种方法炸毁了数据库的存储容量! 方法3:在二进制排序规则中,将colstr2长度设置为900字节,在此列上创建索引需要1秒的时间来进行1GB字符串和9位数字子字符串的搜索。对于10GB的字符串和10位的子字符串,ist需要90秒。 还有其他想法如何使它更快(也许通过利用包含长整数的数字组成的字符串,....)? SQL Server 2017 …

4
SQL Server 2014的MAXDOP设置
我知道这个问题已经被问过很多次,并且也有答案,但是,我仍然需要更多有关该主题的指导。 以下是来自SSMS的CPU的详细信息: 以下是数据库服务器任务管理器中的“ CPU”选项卡: 我MAXDOP通过以下公式保持设置为2: declare @hyperthreadingRatio bit declare @logicalCPUs int declare @HTEnabled int declare @physicalCPU int declare @SOCKET int declare @logicalCPUPerNuma int declare @NoOfNUMA int declare @MaxDOP int select @logicalCPUs = cpu_count -- [Logical CPU Count] ,@hyperthreadingRatio = hyperthread_ratio -- [Hyperthread Ratio] ,@physicalCPU = cpu_count / hyperthread_ratio -- [Physical …

1
我是否需要“停机时间”来更新存储过程?(由于“定义更改”错误)
我一直以为更新存储过程是我在用户积极使用系统时可以做的事情。 但是我目前正在测试存储过程的更新,并且正在执行对sproc的长时间运行的调用(调用时已超过4分钟),因此我更新了sproc。(我打算在单独的窗口中尝试其他查询计划。) 当我回到长期运行的机器时,出现了以下错误: The definition of object 'MySprocName' has changed since it was compiled. 该错误似乎表明,如果更新了该存储过程的定义,则任何正在执行的存储过程都会失败。(我认为,一旦存储程序开始运行,尽管定义有所更改,它将在其余的运行中使用该计划。) 这是真的?我是否需要停机才能更新存储过程的定义?

3
如何更快地获得最近行的总数?
我目前正在设计交易表。我意识到将需要计算每一行的运行总计,这可能会降低性能。因此,出于测试目的,我创建了一个包含一百万行的表。 CREATE TABLE [dbo].[Table_1]( [seq] [int] IDENTITY(1,1) NOT NULL, [value] [bigint] NOT NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [seq] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO 我尝试获取10个最近的行及其运行总计,但大约花了10秒钟。 --1st attempt SELECT TOP 10 seq …

1
为什么在此列上自动创建的统计信息为空?
信息 我的问题与堆有关的中等大表(〜40GB数据空间)有关 (不幸的是,应用程序所有者不允许我将聚集索引添加到表中) 在“标识”列(ID)上创建了自动创建的统计信息,但为空。 自动创建统计信息和自动更新统计信息处于启用状态 表格中发生了修改 还有其他(自动创建的)统计信息正在更新 由索引创建的同一列上还有另一个统计信息(重复) 内部版本:12.0.5546 重复统计信息正在更新: 实际问题 据我了解,即使在完全相同的列(重复项)上有两个统计信息,也可以使用所有统计信息并跟踪修改,所以为什么这个统计信息仍然为空? 统计信息 数据库统计信息 桌子尺寸 创建统计信息的列信息 [ID] [int] IDENTITY(1,1) NOT NULL 身份栏 select * from sys.stats where name like '%_WA_Sys_0000000A_6B7099F3%'; 自动建立 获取其他统计信息 select * From sys.dm_db_stats_properties (1802541555, 3) 与我的空状态相比: 来自“生成脚本”的统计信息和直方图: /****** Object: Statistic [_WA_Sys_0000000A_6B7099F3] Script Date: 2/1/2019 10:18:19 AM ******/ …

4
在SQL Server 2016中最大化可移植性的最佳实践
在开发解决方案原型时,通常尚未决定技术,并且可能与最终产品中使用的技术不同。 在这种情况下,我倾向于使用Microsoft SQL Server以尽可能标准的方式编写查询,以简化最终迁移到另一台服务器的过程。 有没有一种方法或某种已知的实践可以直接在SQL Server中或通过SQL Server Management Studio(SSMS)通过T-SQL方言强制使用标准SQL ?

2
较旧值的临时表性能不佳
访问临时表中的历史记录时遇到一个奇怪的问题。通过AS OF子句访问时间表中较旧条目的查询所花的时间比对最近历史条目的查询所花的时间更长。 历史表是由SQL Server生成的(包括日期列上的聚簇索引并使用页面压缩),我向历史表中添加了5000万行,而我的查询检索了大约25,000行。 我试图确定问题的根本原因,但无法识别。到目前为止,我已经测试了: 创建一个具有聚集索引的5000万行的测试表,以查看速度下降是否仅是由于数量引起的。我能够在固定时间(〜400ms)内检索到25K行。 从历史表中删除页面压缩。这对检索时间没有影响,但是确实增加了表的大小。 我尝试使用ID列和日期列直接访问历史记录表的行。这是事情变得更有趣的地方。我可以在〜400ms处访问表中的旧行,其中与AS OF子句一样,它需要1200ms的时间。我尝试对日期列上的测试表进行过滤,并且与对ID列进行过滤相比,发现了类似的减速。这使我相信日期比较是某些放缓的原因。 我想更多地看这个,但是我也想确保我没有吠错树。首先,在访问临时表中的较旧历史数据时,是否还有其他人遇到过相同的行为(我们仅注意到速度下降超过1000万行)?其次,我可以使用哪些策略来进一步隔离性能问题的根本原因(我刚刚开始研究执行计划,但对我来说仍然有点神秘)? 执行计划 这些是简单的检索查询:第一个访问较旧的行,第二个访问较新的行。 旧行〜1200ms执行时间 最近的行〜350ms执行时间 表格详情 这些是时间表中的列。历史记录表具有相同的列,但没有主键(根据历史记录表的要求): 以下是历史记录表上的索引:

1
巨大(100,000,000+)表的GROUP TOP(1)BY GROUP
设定 我有一个约115,382,254行的巨大表。该表相对简单,并且记录了应用程序的处理操作。 CREATE TABLE [data].[OperationData]( [SourceDeciveID] [bigint] NOT NULL, [FileSource] [nvarchar](256) NOT NULL, [Size] [bigint] NULL, [Begin] [datetime2](7) NULL, [End] [datetime2](7) NOT NULL, [Date] AS (isnull(CONVERT([date],[End]),CONVERT([date],'19000101',(112)))) PERSISTED NOT NULL, [DataSetCount] [bigint] NULL, [Result] [int] NULL, [Error] [nvarchar](max) NULL, [Status] [int] NULL, CONSTRAINT [PK_OperationData] PRIMARY KEY CLUSTERED ( [SourceDeviceID] ASC, [FileSource] …


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.