Questions tagged «sql-server»

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

2
如何找到仍持有锁的查询?
查询sys.dm_tran_locksDMV将向我们显示哪些会话(SPID)持有对表,页面和行等资源的锁定。 对于获得的每个锁,是否有任何方法可以确定哪个SQL语句(删除,插入,更新或选择)导致了该锁? 我知道,most_recent_query_handle在列sys.dm_exec_connectionsDMV给了我们执行的最后一个查询的文本,而是多次其他查询同一个会话(SPID)在跑前和仍持有锁。 我已经使用了该sp_whoisactive过程(来自Adam Machanic),它仅显示了当前在输入缓冲区上的查询(认为DBCC INPUTBUFFER @spid),但并非总是(在我的情况下通常是)获取锁定的查询。 例如: 公开交易/会话 exec一条语句(持有资源锁) 在同一会话上执行另一条语句 打开另一个事务/会话,然后尝试修改在步骤2锁定的资源。 该sp_whoisactive过程将在第3步指出该语句,它不是锁的责任,因此无用。 这个问题来自使用“ 阻塞的流程报告”功能进行分析,以查找生产中阻塞方案的根本原因。每个事务都运行几个查询,大多数情况下,最后一个查询(显示在BPR的输入缓冲区上)很少是持有锁的查询。 我有一个后续问题:有效识别阻塞查询的框架

2
只读文件组中的列存储索引可防止CheckDB
如果文件组包含列存储索引,则似乎设置了文件组以read_only防止dbcc checkdb整个数据库使用。尝试运行checkdb或checkfilegroup(对于数据库中的任何文件组,包括读写辅助文件和[PRIMARY])时,返回以下错误... Msg 8921, Level 16, State 1, Line 24 Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors. 是否存在将列存储数据存储在只读文件组中的受支持方法?还是在这种情况下无法进行完整性检查? 复制 create database check_fg_ro go use check_fg_ro go exec sp_changedbowner 'sa'; go alter database check_fg_ro add …

6
查询行之间的详细差异以获取大量数据
我有很多大表,每个表都有> 300列。我正在使用的应用程序通过在辅助表中复制当前行来创建已更改行的“归档”。 考虑一个简单的例子: CREATE TABLE dbo.bigtable ( UpdateDate datetime, PK varchar(12) PRIMARY KEY, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); 存档表: CREATE TABLE dbo.bigtable_archive ( UpdateDate datetime, PK varchar(12) NOT NULL, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); 在上执行任何更新之前dbo.bigtable,会在中创建该行的副本dbo.bigtable_archive,然后dbo.bigtable.UpdateDate使用当前日期进行更新。 因此,按排序时,UNION将两个表放在一起并按分组可以PK创建更改的时间表UpdateDate。 …

1
为什么子查询中的COALESCE返回NULL?
给定此架构: CREATE TABLE #TEST_COALESCE ( Id int NOT NULL, DateTest datetime NOT NULL, PRIMARY KEY (Id, DateTest) ); INSERT INTO #TEST_COALESCE VALUES (1, '20170201'), (1, '20170202'), (1, '20170203'), (2, '20170204'), (2, '20170205'), (2, '20170206'); 如果我在子查询中使用COALESCE,它将返回NULL。 SELECT t1.Id, t1.DateTest, (SELECT TOP 1 COALESCE(t2.DateTest, t1.DateTest) FROM #TEST_COALESCE t2 WHERE t2.Id = t1.Id …
15 sql-server 

2
如何检查非ASCII字符
检查VARCHAR字段是否包含非Ascii字符的最佳方法是什么? CHAR(1)通过CHAR(31)和CHAR(127)通过CHAR(255)。 我尝试使用PATINDEX,并遇到了以下问题。 检查下限范围是否正确。 SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0 我的数据有三个记录为0x1E,并且所有三个都返回了。 但是当我只检查上限时: SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 它返回接近表中的所有记录(表计数170737和返回计数170735),并且由于我的数据在此范围内没有任何值,因此我认为它应该不返回任何记录。

2
SQL如何使用子查询删除
我们的开发人员之一添加了以下代码,以从表中删除重复的记录: DELETE SubQuery FROM ( SELECT ID ,FK1 ,FK2 ,CreatedDateTime ,ROW_NUMBER() OVER(PARTITION BY FK1, FK2 ORDER BY CreatedDateTime) AS RowNumber FROM Table ) AS SubQuery WHERE RowNumber > 1 查看代码时,我认为它不起作用,但是在我们的测试环境(SQL 2014)中对其进行测试表明它可以! SQL如何知道如何解析子查询并从中删除记录table?

1
缺少多个索引的执行计划
如果使用“包含实际执行计划”运行查询,则该计划还将建议缺少的索引。索引详细信息MissingIndexes位于XML的内部标记中。计划中包含多个索引建议时会出现这种情况吗?我尝试了不同的sql查询,但是无法提供任何生成两个或多个缺失索引的查询。

2
可以对SQL Server系统表进行碎片整理吗?
我们有几个数据库,在其中创建和删除了大量表。据我们所知,SQL Server不会对系统基表进行任何内部维护,这意味着它们随着时间的流逝会变得非常零散,并且大小会膨胀。这给缓冲池造成了不必要的压力,并且还负面影响了操作的性能,例如计算数据库中所有表的大小。 有没有人建议尽量减少这些核心内部表上的碎片?一个显而易见的解决方案可以避免创建太多表(或在tempdb中创建所有临时表),但是出于这个问题的目的,我们可以说应用程序没有这种灵活性。 编辑:进一步的研究显示了这个悬而未决的问题,该问题看起来密切相关,并且表明可以选择某种形式的手动维护ALTER INDEX...REORGANIZE。 初步研究 有关这些表的元数据可以在以下位置查看sys.dm_db_partition_stats: -- The system base table that contains one row for every column in the system SELECT row_count, (reserved_page_count * 8 * 1024.0) / row_count AS bytes_per_row, reserved_page_count/128. AS space_mb FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('sys.syscolpars') AND index_id = 1 -- row_count: 15,600,859 -- …

3
具有“预览模式”的数据库存储过程
在我使用的数据库应用程序中,一个相当普遍的模式是需要为具有“预览模式”的报表或实用程序创建存储过程。当此类过程确实更新时,此参数指示应返回操作结果,但该过程实际上不应执行对数据库的更新。 一种实现方法是简单地if为参数编写一条语句,并具有两个完整的代码块。其中一个确实更新并返回数据,而另一个仅返回数据。但这是不希望的,因为代码重复并且相对较低的可信度,即预览数据实际上是对更新所发生情况的准确反映。 下面的示例尝试利用事务保存点和变量(与临时表相反,不受事务影响)与临时表相比,仅将单个代码块用作实时更新模式。 注意:不能选择事务回滚,因为此过程调用本身可能嵌套在事务中。这已在SQL Server 2012上进行了测试。 CREATE TABLE dbo.user_table (a int); GO CREATE PROCEDURE [dbo].[PREVIEW_EXAMPLE] ( @preview char(1) = 'Y' ) AS CREATE TABLE #dataset_to_return (a int); BEGIN TRANSACTION; -- preview mode required infrastructure DECLARE @output_to_return TABLE (a int); SAVE TRANSACTION savepoint; -- do stuff here INSERT INTO dbo.user_table (a) …
15 sql-server  t-sql 

2
较新版本的SQL Server不稳定吗?
我们的数据库架构师告诉我们的客户,SQL Server 2014比2012年是一个糟糕的选择,因为它缺乏2012年所具有的性能和稳定性优势。我读过的所有内容都与此矛盾。 亚伦·伯特兰德(Aaron Bertrand)表示完全相反,我从MS那里阅读的所有白皮书也都同意-2014年得到了增强,解决了人们在2012年遇到的一些AG问题。 我错过了选择2014年而不是2012年的主要缺点吗?

3
为什么我的EXISTS查询执行索引扫描而不是索引查找?
我正在优化一些查询。 对于以下查询, SET STATISTICS IO ON; DECLARE @OrderStartDate DATETIME2 = '27 feb 2016'; DECLARE @OrderEndDate DATETIME2 = '28 feb 2016'; SELECT o.strBxOrderNo , o.sintOrderStatusID , o.sintOrderChannelID , o.sintOrderTypeID , o.sdtmOrdCreated , o.sintMarketID , o.strOrderKey , o.strOfferCode , o.strCurrencyCode , o.decBCShipFullPrice , o.decBCShipFinal , o.decBCShipTax , o.decBCTotalAmount , o.decWrittenTotalAmount , o.decBCWrittenTotalAmount …

3
事务日志备份是串行还是并行?
我们碰巧正在使用SQL Server 2012 Standard Edition。我也碰巧使用Ola Hallengren的脚本来提供简单,灵活的框架来进行备份和维护。 这个问题不是关于Ola的脚本,而是关于最佳实践。我意识到最终的答案是“这取决于您公司的要求”。但是,我试图就如何最好地满足我对公司要求的理解,征询社区的建议。 我希望每15分钟设置一次事务日志备份。这样,我们希望丢失的数据不会超过15分钟。我应该设置一项使用ALL_DATABASES的作业吗?还是为每个数据库设置一项工作并并行启动它们?我问,因为我有一种基于Ola脚本运行方式的感觉,即备份是以串行方式启动的。串行的缺点是每个连续的备份要等到另一个完成为止。这可能会增加备份之间的时间量(即,大于15分钟)。另外,我担心的是,一个备份失败会阻止其他备份的发生,我不希望这样。我希望其他人继续备份。 那么Ola的脚本是串行执行的,还是失败会停止连续的备份,这是真的吗? 每个数据库都有一份工作更好吗?或仅完成一项工作?我倾向于单独的工作,但是我希望了解SQL Server DBA通常会做什么。

1
用以证明或否定其他DBA需求的度量标准?
我们目前有2个DBA,一个是我,另一个是一个家伙,我们俩都觉得需要一个或两个以上的额外资源。我曾几次与我的直接经理就这个话题进行过交谈,但是很难把这个想法卖掉。最近,我们的经理与我们分享说,拿出我们希望或觉得我们需要做的事情的“软价值观”列表确实很棒,但是真正有用的是提出“硬价值观”,显示美元节省。 如果我们认为的需求是合法的,那么您能否首先帮助我理解,如果是这样,我们将如何提出这个“硬价值观”清单。我觉得我们可以提出我们为节省公司资金而需要做的事情,但这可能只是放在优先事项列表的首位,这给我们带来了更多压力。 为了让您更深入地了解我们的环境,以下是我们在为我们提供支持方面所看的东西。 生产服务器– 30多个 生产数据库– 200多个 SQL版本– 2008 / 2008R2 / 2012,现在调查2014年,以及当年下半年的2016年 应用程序(第三方和家庭用户)– 支持的20多个应用程序团队– 6个 虚拟化– 75%虚拟化的25%物理 群集– 3个以上计划的 复制– 1个分发服务器,2个订阅服务器,24个订阅,6个发布服务器,12个发布 日志传送– 8个主数据库+更多计划的,4个辅助数据库+更多计划的,49个日志交付数据库+更多计划的 可用性组–目前暂无,但正在探索可能性 导致版本更改或DBA资源的每年平均应用程序升级/安装– 2-3 修补程序(SP,CU)–目前不存在,除非出现问题累计数据库大小– 14TB + 报表服务器–一个由2个服务器组成的横向部署,我们两个都不熟悉SSRS Analysis Server –两个服务器,我们两个都不熟悉SSAS 我们应该使用什么度量标准来证明或拒绝其他DBA的需求? 我最初的目的是证明我们目前的能力与计划中的项目以及重复执行的任务,但是我们需要证明在雇用额外资源方面的投资回报率。

1
SQL Server 2014 COUNT(DISTINCT x)忽略列x的统计信息密度向量
对于COUNT(DISTINCT)具有约10亿个不同值的,我正在获得一个查询计划,该计划的哈希汇总估计只有300万行。 为什么会这样呢?SQL Server 2012提供了一个很好的估计,所以这是我应该在Connect上报告的SQL Server 2014中的错误吗? 查询和差评 -- Actual rows: 1,011,719,166 -- SQL 2012 estimated rows: 1,079,130,000 (106% of actual) -- SQL 2014 estimated rows: 2,980,240 (0.29% of actual) SELECT COUNT(DISTINCT factCol5) FROM BigFactTable OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this line to use SQL 2012 CE -- Stats for …

1
默认情况下资源池中没有足够的系统内存来运行此查询
我在Windows Server 2012上使用SQL Server 2014-12.0.2269.0(X64),遇到一些内存问题。当我运行一个存储过程进行相当“繁重”的计算时,大约10分钟后出现错误: 资源池“默认”中没有足够的系统内存来运行此查询。 我的SQL Server有多个数据库(例如15个,但并非总是同时使用它们)。我查看了SQL Server日志文件(出现错误后),并且看到了很多这样的行: 2015-12-17 12:00:37.57 spid19s由于资源池“默认”中的内存不足,不允许为数据库“ Database_Name”分配页面。有关更多信息,请参见“ http://go.microsoft.com/fwlink/?LinkId=330673 ”。 日志中会生成一个报告,其中包含每个组件使用的内存(我认为)。如果我正确地解释了报告,我们可以看到消耗了很多内存MEMORYCLERK_SQLBUFFERPOOL。您可以在这里找到报告:http : //pastebin.com/kgmk9dPH 我还生成了一个带有图形的报告,该图形显示了相同的“结论”: 这可能是另一个有用的报告: 请注意,我还在日志中看到此错误: 2015-12-17 12:04:52.37 spid70由于数据库内存压力而无法分配页面:FAIL_PAGE_ALLOCATION 8 以下是有关服务器内存的一些信息: 服务器上的总内存:16 Gb 分配给SQL Server的内存:12288 Mb 使用中的物理内存(来自sys.dm_os_process_memory):9287 Mb 如果有帮助,则该服务器不承载任何SharePoint数据库。

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.