Questions tagged «sql-server»

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

1
用于xml path('')输出
当我运行以下 select t.type from (values ('Green'),('Blue'),('Red')) as t(type) for xml path('') 我收到此输出 <type>Green</type> <type>Blue</type> <type>Red</type> 如果我运行以下 select t.type + '/' from (values ('Green'),('Blue'),('Red')) as t(type) for xml path('') 我收到此输出 Green/Blue/Red/ 为什么在select中添加串联会导致类型标签的删除和xml文件中一行的输出?运行SQL Server 2012。

3
为什么此查询缺少FROM子句而不出错?
因此,我们有一个带有带有错字的子查询的查询。它缺少FROM子句。但是,当您运行它时,它不会出错!为什么!? SELECT 1 ,r.id ,'0D4133BE-C1B5-4141-AFAD-B171A2CCCE56' ,GETDATE() ,1 ,'Y' ,'N' ,oldItem.can_view ,oldItem.can_update FROM Role r JOIN RoleObject oldReport ON r.customer_id = oldReport.customer_id JOIN RoleItem oldItem ON oldReport.id = oldItem.role_object_id AND r.id = oldItem.role_id WHERE r.id NOT IN (SELECT role_id WHERE role_object_id = '0D4133BE-C1B5-4141-AFAD-B171A2CCCE56') AND oldReport.id = '169BA22F-1614-4EBA-AF45-18E333C54C6C'

1
显然,我的CLR汇编函数引起了死锁?
我们的应用程序需要与Oracle数据库或Microsoft SQL Server数据库同样良好地工作。为方便起见,我们创建了一些UDF以使查询语法同质。例如,SQL Server具有GETDATE(),而Oracle具有SYSDATE。它们执行相同的功能,但它们是不同的词。我们为两个平台编写了一个名为NOW()的包装UDF,该包装将相关的平台特定语法包装在一个通用函数名称中。我们还有其他这样的功能,其中一些功能实际上什么也不做,只是为了同质化而存在。不幸的是,这对于SQL Server是有成本的。内联标量UDF严重破坏性能,并完全禁用并行性。作为替代方案,我们编写了CLR汇编函数以实现相同的目标。当我们将其部署到客户端时,他们开始遇到频繁的死锁。这个特定的客户端正在使用复制和高可用性技术,我想知道这里是否存在某种交互。我只是不了解引入CLR函数将如何导致这样的问题。作为参考,我在C#中包含了原始的标量UDF定义以及替换的CLR定义,并为其提供了SQL声明。如果有帮助,我也可以提供死锁XML。 原始UDF CREATE FUNCTION [fn].[APAD] ( @Value VARCHAR(4000) , @tablename VARCHAR(4000) = NULL , @columnname VARCHAR(4000) = NULL ) RETURNS VARCHAR(4000) WITH SCHEMABINDING AS BEGIN RETURN LTRIM(RTRIM(@Value)) END GO CLR组装功能 [SqlFunction(IsDeterministic = true)] public static string APAD(string value, string tableName, string columnName) { return value?.Trim(); } …


3
在提交之前,SQL Server是否允许事务中的DDL(使其可见)到事务中?
在PostgreSQL中,我可以创建一个包含一些测试数据的表,然后在事务中将其迁移到其他类型的新列,从而在上重写一个表COMMIT, CREATE TABLE foo ( a int ); INSERT INTO foo VALUES (1),(2),(3); 其次是, BEGIN; ALTER TABLE foo ADD COLUMN b varchar; UPDATE foo SET b = CAST(a AS varchar); ALTER TABLE foo DROP COLUMN a; COMMIT; 但是,Microsoft SQL Server中的同一件事似乎会产生错误。比较此工作的db fiddle,其中ADD(column)命令在事务之外, -- txn1 BEGIN TRANSACTION; ALTER TABLE foo ADD b …


1
缺少的非聚集索引已成为聚集索引的一部分
我正在调试运行缓慢的查询,在执行计划中建议使用51.6648 Impact的非聚集索引。但是,非聚集索引仅包括主键(PK)复合聚集索引中已经存在的列。 难道是因为索引中列的顺序?即,如果聚集索引中的列从最有选择性到最少的顺序不顺序,那么非聚集索引是否有可能提高性能? 此外,非聚集索引仅包含三个PK列中的两个,而第三个添加为包含列。include使用非聚集索引可能会更优化的另一个原因吗? 以下是我正在使用的表结构的示例: 桌子- Retailers ( RetailerID int PK, name ...) Retailer_Relation_Types ( RelationType smallint PK, Description nvarchar(50) ...) Retailer_Relations ( RetailerID int PK FK, RelatedRetailerID int PK FK, RelationType smallint PK FK, CreatedOn datetime ...) 该表Retailer_Relations具有以下综合PK指数和建议指数- CONSTRAINT PK_Retailer_Relations PRIMARY KEY CLUSTERED ( RetailerID ASC, RelatedRetailerID ASC, RelationType …

1
授予拒绝权限堆叠
对于角色db_denycustomer,我只希望customer表的列代码是可选择的,而其他都不是。所以我这样做: DENY SELECT ON dbo.customer TO db_denycustomer GRANT SELECT ON dbo.customer (code) TO db_denycustomer ...而且效果很好。凉!但是,为什么呢? 我在相关文章中读到的是该权限栈,但DENY具有优先权。相反,在我的情况下,似乎最后一个权限“查询”优先。果然,如果我以相反的顺序执行它们,后者DENY也会隐藏代码列。 您能详细说明一下吗? 我还向测试的用户提供了默认值db_datawriter和db_datareader角色。

1
如果系统健康中有“ sql_exit_invoked”,这意味着什么?
我的一台SQL Server 2016 Standard服务器遇到问题。我有8个生产服务器,这是唯一一台随机崩溃而日志中没有任何痕迹的服务器。 我已启用system_health。我注意到我在系统健康状况中有一行是“ sql_exit_invoked”。 我正在尝试在该行上找到更多信息。这是什么意思?我在互联网上发现的唯一信息是,它在调用SQLExit()时发生,并且仅在SQL 2012以后才记录。(msdn网站上的链接) 所以我的问题是:我应该担心在日志中看到这个吗?我只能在有问题的服务器上找到它,而在其他7个服务器上都找不到。(所有都是SQL Server 2016 Standard版) 有人可以给我更多信息吗?

1
统计资料全天随机消失/清空
我有一个SQL Server 2017(CU9)数据库,该数据库存在一些与性能相关的问题,我认为这与索引统计信息有关。在进行故障排除时,我发现统计信息尚未更新(这意味着DBCC SHOW_STATISTICS将返回所有NULL值)。 我在受影响的表上执行了UPDATE STATISTICS,并验证SHOW_STATISTICS昨天在4:00 PM返回了实际值。今天早上8:00 AM,统计信息再次为空(返回NULL值)。 客户端确实有安排在每天凌晨4:00运行的维护作业,该维护作业将为数据库重新索引,然后针对整个数据库执行sp_updatestats。我已经验证了使用探查器跟踪在4:00 AM更新统计信息。 我不知道为什么统计信息将为空,维护工作是否在4:00 AM运行?在此版本的SQL Server上是否存在我不知道的错误? 提前感谢你的帮助。 更多信息: 自动更新统计信息已启用。 “异步自动更新统计信息”已禁用。 自动创建增量统计信息已禁用。 重新编制索引脚本(混淆): USE DBNAME; DECLARE @CERTENG_Lock INT DECLARE @WebSite_Control_ProcessRunning_Lock INT DECLARE @WebSite_Control_Disabled_Lock INT DECLARE @LogMessage VARCHAR(1024) SELECT @CERTENG_Lock = Lock FROM application.CERTENG_Lock SELECT @WebSite_Control_Disabled_Lock = MAX(CAST(Disabled AS INT)), @WebSite_Control_ProcessRunning_Lock = MAX(CAST(ProcessRunning AS INT)) …

3
为协作距离有限的行分配唯一值的解决方案
我有一个可以使用以下代码创建和填充的表: CREATE TABLE dbo.Example(GroupKey int NOT NULL, RecordKey varchar(12) NOT NULL); ALTER TABLE dbo.Example ADD CONSTRAINT iExample PRIMARY KEY CLUSTERED(GroupKey ASC, RecordKey ASC); INSERT INTO dbo.Example(GroupKey, RecordKey) VALUES (1, 'Archimedes'), (1, 'Newton'), (1, 'Euler'), (2, 'Euler'), (2, 'Gauss'), (3, 'Gauss'), (3, 'Poincaré'), (4, 'Ramanujan'), (5, 'Neumann'), (5, 'Grothendieck'), (6, 'Grothendieck'), …

1
SELECT查询上的算术溢出
我在一个简单的SELECT语句中遇到了算术溢出。查询如下 SELECT [SaleValue] FROM Sales [SaleValue]是数据类型,decimal(9,0)而不是计算列。 发生这种情况的原因是,由于某种原因,该列在该字段存储的行大于指定的数据类型(例如)decimal(10,0)。 当我增加列的大小时,我只能使选择工作。所讨论的表在其他两个列和行中还有两个其他实例。 这种情况怎么可能?首先,如何将超出范围的值保存在列中? 我正在使用Microsoft SQL Server,这是一个基表,而不是视图。

2
升级到更好的存储后,检查点的等待时间增加
当我们从一个较早的全闪存阵列迁移到一个较新的全闪存阵列(不同但信誉良好的供应商)时,我们开始发现检查点期间SQL Sentry中的等待时间增加了。 版本:SQL Server 2012 Sp4 在我们的旧存储中,检查点期间的等待时间约为2k,“峰值”为2500,而在新存储中,峰值通常为10k,峰值接近50k。哨兵将我们更多地指向PAGEIOLATCH瓦蒂斯。做我们自己的分析,似乎是PAGEIOLATCH and PAGELATCH等待的组合。使用Perfmon,我们通常可以说检查点的页面越多,等待的时间就越多,但是在检查点期间我们只刷新了约125 mb。我们的工作量主要是写操作(主要是插入/更新)。 存储供应商向我们证明,在这些检查点事件期间,光纤通道直接连接的阵列在1毫秒内响应。HBA还确认阵列的编号。我们也不认为这是HBA排队的问题,因为队列深度从未超过8。我们还尝试了更新的HBA,将ZIO,执行限制和队列深度设置更改为无效。我们还将服务器的内存从500 GB增加到1 TB,没有任何变化。在检查点过程中,我们确实看到2-4个核心(共16个)峰值达到100%,但总体CPU约为20%。BIOS也设置为高性能。但是有趣的是,即使禁用了CPU,我们也确实看到它们通常处于C2睡眠状态,因此我们仍在研究为何睡眠状态超过C1。 我们可以看到,几乎所有等待都在数据页面上,偶尔的PFS为DCM页面类型。等待在用户数据库中,而不在tempdb中。我们还看到,等待是在多个数据页面上进行的,其中一些SPID在同一页面上等待。数据库设计确实有几个插入热点,但是旧存储采用了相同的设计。 运行此查询循环100次,我们能够捕获正在磁盘与内存上等待的SPID数量 SELECT [owt].[wait_type], count(*) as waitcount FROM sys.dm_os_waiting_tasks [owt] WHERE [owt].[wait_type] LIKE 'PAGE%' group by [owt].[wait_type] order by 1 GO 100 “好”的事情是,我们可以在具有相同模型阵列和相似服务器规格的性能环境中轻松重现该问题。对于任何其他地方或如何缩小问题的想法,我将不胜感激。现在,我们的下一个测试包括:带有更新的主板和更多CPU的新服务器;禁用SIOS数据保持器(即使旧存储中已安装该功能);不同的HBA品牌。 exec sp_Blitz @outputtype = 'markdown' 优先级5:可靠性:-危险的第三方模块-Sophos Limited-Sophos缓冲区溢出保护-SOPHOS〜2.DLL-已安装可疑的危险第三方模块。 优先级200:信息性:-群集节点-这是群集中的节点。-TraceFlag On-跟踪标记1117全局启用。-跟踪标记1118全局启用。-跟踪标记3226全局启用。 优先级200:许可:-正在使用的企业版功能* xxxxx-[xxxxxx]数据库正在使用压缩。如果将此数据库还原到Standard Edition Server上,则还原将在2016 SP1之前的版本上失败。* …

1
指数寻求运营商成本
对于下面的AdventureWorks示例数据库查询: SELECT P.ProductID, CA.TransactionID FROM Production.Product AS P CROSS APPLY ( SELECT TOP (1) TH.TransactionID FROM Production.TransactionHistory AS TH WHERE TH.ProductID = P.ProductID ORDER BY TH.TransactionID DESC ) AS CA; 执行计划显示针对Index Seek的估计运营商成本为0.0850383(93%): 成本与使用的基数估计模型无关。 这不是“ 估计的CPU成本”和“ 估计的I / O成本”的简单相加。一次执行索引搜索的成本也不乘以估计的执行次数。 这个费用数字是如何得出的?

3
可以删除MSDB吗?
我不是DBA,我只是用谷歌搜索MSDB所做的事情,基本上它是其工作和历史记录的SQL Agent数据库,现在我的云服务器空间不足,并且我有1年的MSDB值,可以删除它还是保留它作备份之用? 我的MSDB在250GB硬盘中为93GB。

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.