Questions tagged «sql-server-2014»

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

5
如何在行之间递归查找90天过去的间隔
在我的C#家庭世界中,这是一项微不足道的任务,但是我还没有在SQL中实现它,而是希望解决基于集合的问题(没有游标)。结果集应来自这样的查询。 SELECT SomeId, MyDate, dbo.udfLastHitRecursive(param1, param2, MyDate) as 'Qualifying' FROM T 应该如何运作 我将这三个参数发送到UDF中。 UDF在内部使用参数从视图中获取相关的<= 90天的旧行。 UDF遍历“ MyDate”并返回1(如果应将其包括在总计计算中)。 如果不应该,则返回0。此处命名为“ qualifying”。 udf会做什么 按日期顺序列出行。计算行之间的天数。结果集中的第一行默认为Hit =1。如果差异最大为90,则-传递到下一行,直到间隔总和为90天(必须经过90天)。达到时,将Hit设置为1并将间隙重置为0代替从结果中删除行也将起作用。 |(column by udf, which not work yet) Date Calc_date MaxDiff | Qualifying 2014-01-01 11:00 2014-01-01 0 | 1 2014-01-03 10:00 2014-01-01 2 | 0 2014-01-04 09:30 2014-01-03 1 …

1
从索引列上非常大的表中选择SELECT TOP 1非常慢,但不是相反的顺序(“ desc”)
我们有一个大型数据库,大约1TB,在功能强大的服务器上运行SQL Server 2014。几年一切正常。大约2周前,我们进行了全面维护,其中包括:安装所有软件更新;重建所有索引和紧凑的数据库文件。但是,我们没想到在实际负载相同的情况下,在某些阶段数据库的CPU使用率会增加100%以上至150%。 经过大量的故障排除后,我们将其范围缩小到一个非常简单的查询,但找不到解决方案。查询非常简单: select top 1 EventID from EventLog with (nolock) order by EventID 它总是需要约1.5秒!但是,带有“ desc”的类似查询始终大约需要0毫秒: select top 1 EventID from EventLog with (nolock) order by EventID desc PTable大约有5亿行;EventID是ASC数据类型为bigint(标识列)的主聚集索引列(有序)。有多个线程在顶部的数据表中插入数据(较大的EventID),有1个线程从底部的数据表中删除数据(较小的EventID)。 在SMSS中,我们验证了两个查询始终使用相同的执行计划: 聚集索引扫描; 估计行数和实际行数均为1; 估计的执行次数和实际的执行次数均为1; 估计I / O成本为8500(似乎很高) 如果连续运行,则两者的查询成本都是相同的50%。 我更新了索引统计信息with fullscan,问题仍然存在;我再次重建了索引,问题似乎消失了半天,但又回来了。 我通过以下方式打开了IO统计信息: set statistics io on 然后连续运行两个查询,发现以下信息: (对于第一个查询,慢速查询) 表“ PTable”。扫描计数1,逻辑读407670,物理读0,预读0,lob逻辑读0,lob物理读0,lob预读0。 (对于第二个查询,快速查询) …


2
当SQL Server没有可用的物理内存时会发生什么?
在进行谷歌搜索时,我发现了一些相互矛盾的信息。 一些站点指出,当没有物理内存可用于数据时,SQL Server会将已存在的数据移至TEMPDB中(请参阅:SQL Server:使TempDb神秘化和建议)。 但是其他站点指出,当剩余的物理内存不足时,操作系统可以使用PAGE FILE并将数据从物理内存移至该页面(请参阅SQL Server的页面文件)。 我想知道当SQL Server的物理内存用尽时,它将在哪里写入数据?要tempdb还是OS页面文件?还是两者都可以?

2
SQL Server用与定义不匹配的数据填充PERSISTED列是否合法?
我正在跟踪有关计算列中的奇怪值的问题PERSISTED。那里的答案使人对这种行为的产生方式有一些猜测。 我在问以下问题:这不是一个彻底的错误吗?是否PERSISTED允许列以这种方式运行? DECLARE @test TABLE ( Col1 INT, Contains2 AS CASE WHEN 2 IN (Col1) THEN 1 ELSE 0 END PERSISTED) --depends on Col1 INSERT INTO @test (Col1) VALUES (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)) SELECT * FROM @test --shows impossible …


1
从非sysadmin域用户拥有的SQL Agent作业中运行SSIS包
我有两个SSIS程序包,它们作为大型SSIS部署的一部分,在夜间(通过SQL Server代理)按计划运行,没有任何问题。一切都使用Windows身份验证,并且计划的作业由sysadmin(我,我)拥有,并作为 SQL Server代理服务帐户运行。 因此,数据实际上是source system ~> transit db ~> staging ~> NDS通宵达旦的。 我关心的两个SSIS包分别针对一组特定的数据处理transit db ~> staging和staging ~> NDS部分。 域用户(非sysadmin)在中执行某项操作source system,并将感兴趣的数据推入transit db,因此我需要一种在工作时间内获取此更新数据以更新的方法NDS:决定了此人触发的最简单方法通过单击已启用宏的Excel工作簿中的按钮来表示该ETL,该工作簿通过ODBC(使用Windows身份验证)连接到SQL Server并执行存储过程。 存储过程如下所示: create procedure dbo.UpdateMaterialInventory as begin execute msdb.dbo.UpdateMaterialInventory; end [msdb]中的“姐妹”存储过程如下所示: create procedure dbo.UpdateMaterialInventory with execute as 'SqlAgentProxy' as begin execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory'; end 此[SqlAgentProxy]用户是我在域用户登录名[msdb]中创建的Windows用户,我已向其授予execute此UpdateMaterialInventory过程的权限。这避免了必须向域用户execute授予msdb.dbo.sp_start_job过多的权限。 SQL Agent作业NDS-ManualMaterialInventory由域用户拥有,并具有2个步骤,每个步骤的类型为[SQL Server …

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?

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 -- …

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 …

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数据库。

4
如何查询SSISDB找出软件包中的错误?
我已经看到了这个问题 SSIS 2012-如何在T-SQL中查询当前正在运行的程序包? 它给了我以下脚本: SELECT E.execution_id , E.folder_name , E.project_name , E.package_name , E.reference_id , E.reference_type , E.environment_folder_name , E.environment_name , E.project_lsn , E.executed_as_sid , E.executed_as_name , E.use32bitruntime , E.operation_type , E.created_time , E.object_type , E.object_id , E.status , E.start_time , E.end_time , E.caller_sid , E.caller_name , E.process_id , E.stopped_by_sid …

3
使用XPath / XQuery连接同一XML元素的所有值
我有这样的XML值: <R> <I>A</I> <I>B</I> <I>C</I> ... </R> 我想连接所有I值并将它们作为单个字符串返回:ABC...。 现在我知道我可以切碎XML,将结果聚合为无节点XML,然后应用于.values('text()[1]', ...)结果: SELECT ( SELECT n.n.value('text()[1]', 'varchar(50)') AS [text()] FROM @MyXml.nodes('/R/I') AS n (n) FOR XML PATH (''), TYPE ).value('text()[1]', 'varchar(50)') ; 但是,我只想使用XPath / XQuery方法来做所有事情,就像这样: SELECT @MyXml. ? ( ? ); 有这种方法吗? 我正在朝这个方向寻找解决方案的原因是因为我的实际XML也包含其他元素,例如: <R> <I>A</I> <I>B</I> <I>C</I> ... <J>X</J> <J>Y</J> <J>Z</J> ... …

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.