Questions tagged «sql-server-2014»

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

2
SQL Server不使用所有内存
我有SQL Server 2014,最大内存设置为6GB(物理内存为8GB)。 在目标服务器内存为6GB,有时,然后回落到总的服务器内存(约5.3GB,从未达到6GB)。我用committed_kb在sys.dm_os_sys_info检查SQL Server所使用的内存。 当我监视sys.dm_os_buffer_descriptors时,我看到页面已从缓存中删除-但仍然有700MB的内存。如果什么都不需要内存,您将如何解释从缓存中删除页面的事实?我希望SQL Server仅在需要内存时才删除页面。 在此服务器上,解除分配的临时表不是问题。我的PLE是3632。过程高速缓存是2182 MB。 我希望只有没有可用的内存时,页面才会被丢弃,但是我有700MB的可用空间,还是我误会了这一点? 有人可以尝试解释这种行为吗? SQL Server也在从磁盘读取数据,因此我想我可以得出结论,并非所有需要的页面都在内存中。 我进行了一些进一步的研究,并从磁盘将大量页面读取到内存中,并在读取过程中注意到taskmanager中的某些内容: 正在使用的内存从7.0GB-> 7.2GB-> 7.0GB-> 7.2GB-> ... Sqlservr.exe从5.3GB-> 5.5GB-> 5.3GB-> 5.5GB-> ... 就像Windows不允许sqlservr.exe增长到6GB一样。 我运行了Shanky提供的查询: select (physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB, (Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile process_physical_memory_low, process_virtual_memory_low from sys. dm_os_process_memory 得到以下结果: Physical_Memory_usedby_Sqlserver_MB: 5247 Locked_pages_used_Sqlserver_MB: 0 Total_Memory_in_MB: 5625 process_physical_memory_low: 0 process_virtual_memory_low: 0 …

1
内存表的性能比基于磁盘的表差
我在SQL Server 2014中有一个表,如下所示: CREATE TABLE dbo.MyTable ( [id1] [bigint] NOT NULL, [id2] [bigint] NOT NULL, [col1] [int] NOT NULL default(0), [col2] [int] NOT NULL default(0) ) (id1,id2)是PK。基本上,id1是将一组结果(id2,col1,col2)分组的标识符,其pk为id2。 我正在尝试使用内存表来摆脱现有的基于磁盘的表,这是我的瓶颈。 表中的数据被写入->读取->删除一次。 每个id1值都有数千个id2(成百上千)。 数据在表中存储的时间非常短,例如20秒。 在此表上执行的查询如下: -- INSERT (can vary from 10s to 10,000s of records): INSERT INTO MyTable SELECT @fixedValue, id2, col1, col2 …

6
修剪空白(空格,制表符,换行符)
我正在使用SQL Server 2014,需要从列内容的开头和结尾清除空格,其中空格可以是简单的空格,制表符或换行符(\n和\r\n);例如 ' this content ' should become 'this content' ' \r\n \t\t\t this \r\n content \t \r\n ' should become 'this \r\n content' 等等。 我只能用 UPDATE table t SET t.column = LTRIM(RTRIM(t.column)) 但在其他情况下,则无效。

1
查询计划更改SQL Server 2014中的性能更差
我们最近将服务器从SQL Server 2008R2升级到SQL Server2014。我们在2008R2中运行良好,但现在在2014年运行速度慢得令人难以置信,执行计划也很差。 我已经做了几次测试... 将2014 DB切换回2008/2012兼容模式。 使用分页测试查询。 两者都导致查询运行与SQL Server 2008R2相同,并且运行速度很快。 为什么计划如此糟糕,并且查询在SQL Server 2014中运行了这么长时间? 此图显示了2个查询,一个查询使用它在2008R2中运行的行号,然后第二个是分页修复。两者都在2014年运行,但都非常不同,但是在2008年,我们看到的效果与2014年使用分页时相同。

6
具有只读应用程序意图的SSMS注册服务器
我们正在使用AlwaysOn进行SQL Server 2014 POC测试,其中一位用户被问到如何使用本地服务器组中注册的服务器使用ReadOnly Intent 保存SSMS的配置。这样,他们不必在每次需要访问ReadOnly副本时都键入别名。 不幸的是,与常规对象资源管理器不同,已注册服务器中没有添加ApplicationIntent选项的选项。 我从Microsoft那里碰到过有关更改RegSrvr.xml中的连接字符串的这篇文章。 https://connect.microsoft.com/SQLServer/feedback/details/786323/ssms-sql-server-management-studio-2012-missing-connection-properties-for-availability-groups 我尝试了他们的建议,当通过已注册服务器中的本地服务器连接时,它没有连接到正确的副本节点。 使用连接窗口>其他连接参数中的选项时,ReadOnly选项在对象资源管理器中可以正常工作。但是它不会保存对连接所做的更改。 有谁知道通过SSMS 使用ReadOnly Intent属性保存配置的任何替代解决方案吗?在此先感谢您的帮助。


1
HADR高工作线程使用率
为什么HADR池中的可用性组的工作线程数会大大增加,而不是每个副本“ 通常有3–10个共享线程 ”的最低使用量? 在一种情况下,我们观察到300个线程的使用情况,其中包含3个可用性组和10个数据库。SQL Server 2014 SP1。 我们的潜在客户包括辅助副本上的备份,主副本上的高活动性,辅助副本上的报告。 AG位于VMware的数据中心中。总共16个调度程序,通常的工作线程在200个范围内。服务器上的max_dop为2。 3个AG,10个DB,每个4个副本-主,2个只读,1个不可读。 1个辅助同步,2个异步 大型多主机群集上的32个物理核心上有16个vcore。 没有多余的准备。 其他较小的VM 4-8内核位于同一位置,但不会按CPU 我们观察到工作线程数量激增,导致拒绝服务。我们假设工作线程归因于AG,因为只有那些工作线程才能超过限制。 在上下文中阅读的来自SQL Server Premier现场工程师博客的以下链接没有给我完整的答案: 监视SQL Server 2012 AlwaysOn可用性组工作线程消耗 我的实际工作线程是否超出了sp_configure“最大工作线程”值?

2
SQL Server 2016高空闲CPU和查询速度极慢
我安装了大约10天的WinServer2012R2和SQL Server Express 2016进行测试。我是这台机器上的唯一用户。从SQL Server 2005还原的.bak数据库约为250MB,不会出现任何问题。重新启动计算机后,进程“ SQL Server NT-64位”使用0%CPU。 在几分钟或几小时后,通过“ SQL Server NT-64位”的SSMS CPU使用情况进行的一些简单查询(无更新/插入!)突然跳到〜15%并保持在那里,即使处于空闲状态也是如此。从那时起,通常不到一秒钟的查询突然需要2分钟。在实际查询期间,CPU使用率不会增加。在这种状态下,服务器实际上变得不可用。 仅连接SQL Server Profiler会花费30秒以上的时间。除了我自己的查询外,我只看到很少的来自SQLServerCEIP / SQLTELEMETRY的查询,每分钟约3个。 重新启动SQL Server无法解决它。CPU使用率跃升至约15%。即使数小时后,SQL Server也无法恢复。仅重新引导整个计算机即可解决此问题。 由于这是“开箱即用”的安装,因此只有一个小的数据库,几乎没有查询,只有我作为用户,并且可能没有锁,许多有关常规SQL-Server性能问题的文章都谈到了很多不希望做的事情。在这里真的不适用。似乎SQL Server 仅希望专注于某些内部任务。 这是一个具有2GB RAM和2GHz双Xeon的虚拟机。我也有VS2016,而且速度非常快。没有防病毒软件,甚至没有Windows Defender。在这里已经晚了。我明天将尝试sp_whoisactive。我真的很想知道SQL-Server在那里做什么...在具有1 GB的以前的机器上,相同的数据库在SQLServer2005下运行了10年没有问题... 我不是SQL-Profiler专家。我应该从哪里开始寻找?

2
更改外键的引用索引
我有这样的事情: CREATE TABLE T1 ( Id INT ... ,Constraint [PK_T1] PRIMARY KEY CLUSTERED [Id] ) CREATE TABLE T2 ( .... ,T1_Id INT NOT NULL ,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id) ) 出于性能(和死锁)的原因,我在T1上创建了一个新索引 CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id) 但是,如果我检查哪个索引引用了FK,则继续引用聚集索引 select ix.index_id, ix.name as index_name, ix.type_desc as index_type_desc, …

2
是否可以在LIKE语句上进行PIVOT
是否可以按表中的元素进行分组(如中所示COLUMN LIKE='Value%')PIVOT?我有一个表[DBT]。[Status],其中包含各种状态(数据库,实例等),并且不想将所有PROD和TEST值作为单个值进行透视/查询,而是将它们分组。 例如代替具有用于状态列Prod,Prod ACC,Prod APP,...等。我将仅有一个包含的值列Name LIKE 'Prod%'和Name LIKE 'Test%'。 到目前为止,我有: 表定义 CREATE TABLE [DBT].[Status]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Status] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) …

5
使用“ []”通配符将一个](右方括号)与PATINDEX匹配
我正在T-SQL †中编写自定义JSON解析器。 出于解析器的目的,我使用的PATINDEX功能是从标记列表中计算标记的位置。在我的情况下,标记都是单个字符,它们包括以下这些: {} []:, 通常,当我需要找到几个给定字符中任何一个的(第一个)位置时,我会使用如下PATINDEX函数: PATINDEX('%[abc]%', SourceString) 然后,该函数将为我提供aor b或or 的第一个位置c-两者中最先找到的那个SourceString。 现在,就我而言,问题似乎与]角色有关。一旦在字符列表中指定了它,例如: PATINDEX('%[[]{}:,]%', SourceString) 我的预期模式显然已损坏,因为该函数从未找到匹配项。看来我需要一种方法来转义第一个,]以便PATINDEX将其视为查找字符之一,而不是特殊符号。 我发现这个问题询问类似的问题: 需要LIKE运算符和方括号的帮助 但是,在那种情况下,]根本不需要在方括号中指定简单字符,因为它只是一个字符,可以在不带方括号的情况下进行指定。确实使用转义的替代解决方案仅针对LIKE而不适用PATINDEX,因为它使用了ESCAPE由前者而非后者支持的子句。 所以,我的问题是,有没有什么办法去寻找一个]与PATINDEX使用[ ]通配符?还是有一种方法可以使用其他Transact-SQL工具来模拟该功能? 附加信息 这是我需要PATINDEX与上述[…]模式一起使用的查询示例。这里的模式有效(尽管有点),因为它不包含]字符。我也需要使用它]: WITH data AS (SELECT CAST('{"f1":["v1","v2"],"f2":"v3"}' AS varchar(max)) AS ResponseJSON), parser AS ( SELECT Level = 1, OpenClose = 1, P = p.P, S = SUBSTRING(d.ResponseJSON, 1, NULLIF(p.P, 0) …

1
主表/明细表之间的哈希联接产生的基数估计值太低
将主表连接到明细表时,如何鼓励SQL Server 2014将较大(详细)表的基数估计用作联接输出的基数估计? 例如,当将10K主行连接到100K详细信息行时,我希望SQL Server估计100K行的联接-与详细信息行的估计数量相同。如何构造查询和/或表和/或索引,以帮助SQL Server的估计器利用每个详细信息行始终都有一个对应的主行这一事实?(这意味着它们之间的连接永远不会降低基数估计。) 这里有更多细节。我们的数据库有一个主/明细表对:VisitTarget每个销售交易VisitSale都有一行,而每个交易中每个产品都有一行。这是一对多的关系:一个VisitTarget行,平均10个VisitSale行。 这些表如下所示:(我将简化为该问题的相关列) -- "master" table CREATE TABLE VisitTarget ( VisitTargetId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, SaleDate date NOT NULL, StoreId int NOT NULL -- other columns omitted for clarity ); -- covering index for date-scoped queries CREATE NONCLUSTERED INDEX IX_VisitTarget_SaleDate ON VisitTarget …

1
如何在不安装媒体的情况下卸载SQL Server 2014 Standard Edition?
几年来,我已经将SQL Server 2014 Standard的副本作为默认实例安装在我的开发框中。我在计算机上安装了standard,因为我可以通过MSDN订阅使用免费许可证。现在我想卸载SQL Server 2014,并将SQL Server 2017 Developer Edition设置为默认实例。我试图通过标准的“添加/删除程序”工作流来卸载SQL Server 2014,但是在询问我要卸载哪些功能后,它提示我输入包含卸载媒体的目录。不幸的是,我没有保存从MSDN获得的SQL Server 2014下载程序包,并且我再也无法访问MSDN。我还检查了My Visual Studio,但它只能追溯到SQL Server2016。如何在没有安装媒体的情况下卸载SQL Server 2014 Standard? 进一步的背景: 我想要卸载SQL Server 2014的全部原因是我想使用STRING_AGGAzure SQL数据库和SQL Server 2017的新功能。为了使设置开发环境更加容易,我们对本地环境开发连接字符串使用点符号,例如我们的连接字符串是: Data Source=.;Initial Catalog=<Database Name>;Trusted_Connection=True;Connection Timeout=30; 点符号连接到默认数据库,据我所知,如果不先卸载SQL Server 2014,就无法将SQL Server 2017设置为默认数据库。如果我可以使用点表示法连接字符串连接到SQL Server 2017,而无需卸载SQL Server 2014,那么我也愿意使用该解决方案。

3
自联接主键
考虑以下由N自我联接组成的查询: select t1.* from [Table] as t1 join [Table] as t2 on t1.Id = t2.Id -- ... join [Table] as tN on t1.Id = tN.Id 它生成具有N个聚集索引扫描和N-1个合并联接的执行计划。 老实说,我看不出没有理由不优化所有联接而仅执行一个聚集索引扫描,即为此优化原始查询: select t1.* from [Table] as t1 问题 为什么没有优化联接? 说每个联接都不会改变结果集在数学上是不正确的吗? 经过测试: 源服务器版本:SQL Server 2014(12.0.4213) 源数据库引擎版本:Microsoft SQL Server标准版 源数据库引擎类型:独立SQL Server 兼容性级别:SQL Server 2008(100) 查询没有意义;它只是浮现在我的脑海,我对此感到很好奇。 这是创建表和3个查询的小提琴:带有inner …

1
为什么对分区视图执行删除会导致聚集索引插入?
我有一个分区视图,具有下面的插入触发器(可怜的芒分区)。当我执行DELETE时,我得到以下查询计划: delete from factproductprice where pricedate = '20170725' 在视图上触发: ALTER TRIGGER [dbo].[factProductPriceDelete] ON [dbo].[FactProductPrice] INSTEAD OF DELETE AS BEGIN IF @@ROWCOUNT = 0 RETURN; DECLARE @PriceDate DATE SELECT @PriceDate = CAST(PriceDate AS DATE) FROM DELETED IF @PriceDate BETWEEN '20140101' AND '20141231' BEGIN DELETE FROM dbo.FactProductPrice2014 WHERE ProductId IN (SELECT ProductId …

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.