Questions tagged «sql-server»

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

1
SQL Server每天重新创建计划
我们的生产环境中存在这个问题。 Windows NT 6.1(内部版本7601:Service Pack 1)上的Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64)-企业版(64位)。 SQL Server将删除所有(几乎100%)旧的执行计划,并每天隔夜(从11:00 PM到8:00 AM)重新创建它们。当“自动更新统计信息”处于禁用状态时,甚至会发生这种情况。我们已在过去2-3周内启用了“自动更新统计信息”。但它仍在发生。 我们真的不知道是什么触发了计划的重新生成,但是我们确信我们不会手动进行。 与重新生成计划的时间真正吻合的唯一一件事是我们拥有的DB​​维护工作:每日索引重组(当碎片为5-30%时)和每日索引重建(当碎片大于30%时) )的工作。通常,此日常维护工作仅会进行重组(因为索引碎片每天都不会超过30%)。 影响: 这些新创建的计划使一些UDF调用/查询调用(从UI /网页调用)花费的时间更长(几分钟而不是不到1秒),因此会话堆积如山,使CPU接近90% 。 当这些卡住的会话被强制删除(在DB端)时,问题消失了; 1)当手动清除了所有相应的执行计划(对于查询)时,或者2)当UDF改变了(对于功能)时,问题就消失了。从那时起,SQL Server创建的任何新计划都可以在一整天内完美运行,直到第二天早上出现相同问题为止。同样,这种行为也不是100%一致的,我们并不是每天早上都真正看到它。但是,在一段时间内,我们连续4-5天一直在观察它。 问题似乎发生在工作时间早晨,即在更密集地访问UI /网页时。 有谁知道这是什么原因以及如何解决这个问题的线索?任何帮助将非常感激。



2
stats_column_id和index_column_id不会随着聚集索引的物理顺序更改而更新
除非我对列的用途有误解,否则以下代码指示更改聚集索引的结构不会更改sys.stats_columns DMV中stats_column_id列的顺序位置()。(在AdventureWorks2014和AdventureWorks2008R2中测试) select i.name, c.name, ic.column_id, ic.index_column_id from sys.indexes i join sys.index_columns ic on i.object_id = ic.object_id and i.index_id = ic.index_id join sys.columns c on i.object_id = c.object_id and ic.column_id = c.column_id where i.name = 'PK_BusinessEntityAddress_BusinessEntityID_AddressID_AddressTypeID' order by ic.key_ordinal; select sh.name,s.name, c.name, c.column_id, sc.column_id, sc.stats_column_id from sys.stats s join sys.stats_columns …

3
创建指向自身的链接服务器
我正在尝试servername\instancename使用以下调用在SQL Server 2014实例上创建链接服务器: EXEC master.dbo.sp_addlinkedserver @server = N'servername\instancename', @srvproduct=N'SQL Server' 我收到错误消息: Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82 The server 'servername\instancename' already exists. 根据MSDN的说法,这在SQL Server 2005中可以正常工作。 链接服务器不必是SQL Server的另一个实例, 因此,我不确定最近的版本中有哪些更改不允许这样做。使用UI会生成类似的消息: 您不能将本地SQL Server创建为链接服务器。 我知道请求是一件奇怪的事情,但是它要支持一些在2005年有效的旧代码(以前在单独的实例上使用)。文档指出它应该可以,但是不能。有什么方法可以使其在2014年正常工作,还是我必须修改基础代码?

2
压缩NVARCHAR(MAX)的另一种方法?
我正在尝试压缩一些具有NVARCHAR(MAX)字段的表。不幸的是,row和page压缩并没有产生预期的影响(对于20 GB的表仅节省了约100/200 MB)。另外,我无法应用列存储和列存储档案压缩,因为它们不支持NVARCHAR(MAX)字段压缩。 有人可以告诉我在这里是否有其他选择吗? 我也猜想row和page压缩没有效果,因为NVARCHAR(MAX)列的内容是唯一的。

2
对于某些特殊字符,ISNUMERIC背后的逻辑是什么?
该ISNUMERIC函数具有某些意外行为。MSDN文档说: ISNUMERIC当输入表达式的计算结果为有效的数值数据类型时,返回1;否则返回0。有效的数字数据类型包括以下类型:int,bigint,smallint,tinyint,十进制,数字,money,smallmoney,float,real。 它也有一个脚注: ISNUMERIC对于非数字字符(例如加号(+),减号(-))和有效的货币符号(例如美元符号($)),返回1。有关货币符号的完整列表,请参见money和s​​mallmoney(Transact-SQL)。 好的,因此+,-和列出的货币符号应被视为数字。到目前为止,一切都很好。 现在是奇怪的部分。首先,链接文章中的某些货币符号不是数字,包括: 欧元货币符号,十六进制20A0: ₠ 奈拉符号,十六进制20A6: ₦ 里亚尔符号,十六进制FDFC: ﷼ 这很奇怪,我似乎找不到原因?此版本或环境相关吗? 但是,事情变得奇怪了。这里有一些我无法解释的内容: /不是数字,而是\(呵呵!) REPLICATE(N'9', 308)是数字,但REPLICATE(N'9', 309)不是 第一个也是最基本的问题是:什么能解释上述情况?但更重要的是:背后的逻辑是什么ISNUMERIC,以便我自己解释/预测所有情况? 这是重现事物的好方法: DECLARE @tbl TABLE(txt NVARCHAR(1000)); INSERT INTO @tbl (txt) VALUES (N''), (N' '), (N'€'), (N'$'), (N'$$'), (NCHAR(8356)), (NCHAR(8352)), (NCHAR(8358)), (NCHAR(65020)), (N'+'), (N'-'), (N'/'), (N'\'), (N'_'), (N'e'), (N'1e'), (N'e1'), (N'1e1'), (N'1'), (N'-1'), …

2
如何选择多个列但只能按一个列分组?
我有一个问题group by,我想选择多列,但仅按一列分组。下面的查询是我尝试的,但是给了我一个错误。 SELECT Rls.RoleName,Pro.[FirstName],Pro.[LastName],Count(UR.[RoleId]) as [Count] from [b.website-sitecore-core].[dbo].[aspnet_UsersInRoles] UR inner join [b.website-professional-au].[dbo].[Profile] Pro on UR.UserId = Pro.Id inner join [b.website-sitecore-core].[dbo].[aspnet_Roles] Rls on Rls.RoleId = UR.RoleId inner join [b.website-professional-au].[dbo].[Gender] Gn on gn.Id = pro.GenderId GROUP BY Rls.RoleName;

1
为什么在SQL Server 2012中使用托管服务帐户而不是虚拟帐户?
在SQL Server 2012中,服务帐户创建为虚拟账户(VAS),如所描述这里,而不是托管服务帐户(MSAS)。 根据说明,我可以看到这些重要的区别: MSA是域帐户,VA是本地帐户 MSA使用AD处理的自动密码管理,VA没有密码 在Kerberos上下文中,MSA自动注册SPN,而VA不注册 还有其他区别吗?如果不使用Kerberos,为什么DBA会更喜欢MSA? 更新:另一个用户已经注意到MS文档中有关VA的可能矛盾: 虚拟帐户是自动管理的,并且虚拟帐户可以在域环境中访问网络。 与 虚拟帐户无法通过身份验证到远程位置。所有虚拟帐户均使用计算机帐户的权限。以格式设置机器帐户 <domain_name>\<computer_name>$。 什么是“机器帐户”?如何/何时/为什么获得“预配”?“在域环境中访问网络”和“在域环境中认证到远程位置”之间有什么区别?

1
在可空的复合索引上重新加入范围搜索?
对于以下架构和示例数据 CREATE TABLE T ( A INT NULL, B INT NOT NULL IDENTITY, C CHAR(8000) NULL, UNIQUE CLUSTERED (A, B) ) INSERT INTO T (A) SELECT NULLIF(( ( ROW_NUMBER() OVER (ORDER BY @@SPID) - 1 ) / 1003 ), 0) FROM master..spt_values 应用程序正在以1,000个行大块的聚集索引顺序处理该表中的行。 从以下查询中检索前1,000行。 SELECT TOP 1000 * FROM T …
14 sql-server  index 

1
更改nvarchar列的大小时,是否需要删除唯一索引?并且在重新创建索引时表会被锁定吗?
在我们的数据库中,存在一个或多或少如下所示的大表: CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); 但是现在串行字段的大小已经变小,因此我想将其更改为32。VisualStudio架构比较工具建议通过以下方式进行操作: DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); 这真的需要吗?还是更像是一种超级节省的方式? 另外,当重新创建唯一索引时,我的表会被锁定吗?因为这将是一个大问题(因为该表具有3000万行,我想重新创建索引将花费相当长的时间),因为下一个维护窗口将在未来几个月内进行。我有什么选择?

1
不应该避免吗?
在某些SQL Server开发人员中,普遍认为这NOT IN非常慢,应该重写查询以使它们返回相同的结果,但不要使用“ evil”关键字。(示例)。 这有什么道理吗? 例如,是否存在SQL Server(哪个版本?)中的一些已知错误,该错误导致使用的查询的NOT IN执行计划比使用 一个LEFT JOIN结合了NULL支票或 (SELECT COUNT(*) ...) = 0在WHERE条款中?

2
DBCC CHECKDB无法修复的损坏:索引视图包含视图定义未生成的行
TL; DR:我在索引视图中有无法修复的损坏。详细信息如下: 跑步 DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS 在我的一个数据库上产生以下错误: 消息8907,级别16,状态1,第1行空间索引,XML索引或索引视图“ ViewName”(对象ID 784109934)包含视图定义未生成的行。这不一定表示此数据库中数据的完整性问题。(...) CHECKDB在表'ViewName'中发现0个分配错误和1个一致性错误。 repair_rebuild是最低修复级别(...)。 我确实知道,该消息表明索引视图“ ViewName”的物化数据与基础查询生成的数据不同。但是,手动验证数据不会出现任何差异: SELECT * FROM ViewName WITH (NOEXPAND) EXCEPT SELECT ... from T1 WITH (FORCESCAN) join T2 on ... SELECT ... from T1 WITH (FORCESCAN) join T2 on ... EXCEPT SELECT * FROM ViewName …

1
AlwaysOn AG,具有故障转移功能的DTC
问题:如何在AlwaysOn可用性组(AG)中的所有服务器上运行分布式事务处理协调器(DTC)?我不需要通过故障转移/切换事件来维护事务。 设置:我有一个Windows故障转移群集(WSFC),其中包含三台都运行SQL 2012的Windows 2008 R2服务器。两台服务器位于一个数据中心,是AlwaysOn故障转移群集(FCI)的一部分,而第三台服务器在第二个数据中心。WSFC是一个多子网群集。这是设置的草图: 我已经能够安装和配置DTC,使其在两个FCI节点之间工作,因为它们位于同一子网中并共享存储。我已经配置了几个AG,它们运行良好。此屏幕快照显示了在FCI上安装的DTC: 此屏幕快照显示,我可以在一个FCI节点(无论哪个处于活动状态)上配置DTC: 我想将使用DTC的应用程序迁移到该群集上并使用AG。我读过AG不支持DTC(参考)。我还没有找到在第二个数据中心的第三个节点上配置DTC的方法。当我尝试在第三个节点上配置DTC时,它似乎不可用,如以下屏幕截图所示: 在Brent Ozar的可用性组的免费安装清单PDF中,他列出了: 群集安装... 29.如果涉及FCI,请根据您的“计划”部分的决定配置DTC。 在对SQL Server 2012 AlwaysOn可用性组的评论中,Rock Brent说:“ ...当AG发挥作用时,没有任何变化。请记住,可用性组中的数据库在一起故障转移到另一个副本时不支持事务一致性。 ..” 这使DTC似乎可以在可用性组中使用,只要您了解到事务不会在AG切换中维护。我不需要它来维护来自FCI节点的事务。在灾难性灾难(我丢失了主数据中心)的情况下,我只需要DTC可供应用程序使用即可。 如何在第三个节点上配置DTC?还是在使用AG和需要DTC的应用程序时我不走运? 更新:我确定的解决方案是使用日志传送。但是,在故障转移的情况下,我仍然需要DTC在Node3上可用。我发现通过卸载在Node1和Node2之间共享的DTC的群集MSDTC-MSSQLSERVERCLU实例,它变得可用。删除后,我可以在Node3上设置和配置LocalDTC实例。之后,我可以重新安装群集的MSDTC-MSSQLSERVERCLU实例。按此顺序执行安装顺序似乎可行。我已经像这样跑了一段时间了,而且还没有发现任何不良影响。似乎这对于运行AlwaysOn可用性组也将起作用。我了解到分布式事务不会在AG故障转移中保留,我只需要新事务即可在故障转移后工作。但是我还没有

1
运行总计到上一行
我需要有关开窗功能的帮助。我知道您可以计算一个窗口内的总和以及一个窗口内的运行总额。但是是否可以计算先前的运行总计,即运行总计不包括当前行? 我认为您将需要使用ROWor RANGE参数。我知道有一个CURRENT ROW选项,但我需要CURRENT ROW - 1,这是无效的语法。我对ROW和RANGE参数的了解有限,因此将非常感谢您的帮助。 我知道有这个问题的许多解决方案,但我看明白了ROW,RANGE争论,我以为这个问题可以用这些被破解。我提供了一种可能的方法来计算以前的总运行量,但我想知道是否有更好的方法: USE AdventureWorks2012 SELECT s.SalesOrderID , s.SalesOrderDetailID , s.OrderQty , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal -- Sudo code - I know this does not work --, SUM(s.OrderQty) OVER …

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.