Questions tagged «sql-server»

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

2
XML解析缓慢
我目前正在尝试调整一个有问题的存储过程,并且我已经注意到,与运行该存储过程相关的大部分成本来自将某些XML解析为临时表的解析。这是有问题的SQL: CREATE TABLE #ChangeSet ( RemarkTypeID TINYINT NOT NULL PRIMARY KEY, RemarkText VARCHAR(2500) NOT NULL, ListingID INT NOT NULL ) INSERT INTO #ChangeSet (RemarkTypeID, RemarkText, ListingID) SELECT T.c.value('@RemarkTypeID[1]','tinyint') AS RemarkTypeID, T.c.value('@RemarkText[1]','varchar(2500)') AS RemarkText, @ListingID FROM @RemarksXml.nodes('/Remarks[1]/Remark') AS T(c) 此外,因此您对要解析的XML的结构有一些了解: <Remarks> <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211767" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="8" RemarkText="aaaWasher,Dryer,Refriger,Microwav" /> <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …

3
如何在DateAdd()约束下的索引中改进视图中1行的估计
使用Microsoft SQL Server 2012(SP3)(KB3072779)-11.0.6020.0(X64)。 给定一个表和索引: create table [User].[Session] ( SessionId int identity(1, 1) not null primary key CreatedUtc datetime2(7) not null default sysutcdatetime()) ) create nonclustered index [IX_User_Session_CreatedUtc] on [User].[Session]([CreatedUtc]) include (SessionId) 以下每个查询的“实际行数”为3.1M,估计的行数显示为注释。 当这些查询在View中提供另一个查询时,由于1行估算,优化器选择循环连接。 如何在此基础上改进估计,以避免覆盖父查询联接提示或求助于SP? 使用硬编码日期非常有用: select distinct SessionId from [User].Session -- 2.9M (great) where CreatedUtc > '04/08/2015' -- but …

1
如何证明NOLOCK是死锁问题的根源?
我不是要开始Windows / Mac类型的讨论。 就个人而言,我不需要任何令人信服NOLOCK的自反练习。似乎当您开发所有内容时,应该是有目的的,而不是反动的(/ amen) 所以...主管程序员坚持NOLOCK是要走的路。建议所有临时查询以及每次查询生产时使用。我还没有看到在每个表上都没有nolock提示的存储过程。 不想成为一个进来告诉所有人核心信念的家伙,没有任何支持的想法是错误的。 仅查看各个博客文章下的评论会话,发送链接可能还不够。长期存在的信念等...有些人不相信这是一个问题。请参阅:我阅读的每篇nolock博客文章下的“评论”部分。 当前,其他一些DBA正在努力解决一些神秘的僵局。如何确定NOLOCKs是否为源? 建议从跟踪等中查看XML,但这不会明确指出死锁是导致问题的原因,不是吗?我从未见过如此直接的错误消息。真的吗? 这些僵局又如何能寄托于此? 像DDL语句CREATE将是一个线索。在发出警报之前,是否可以指向任何输出或可以找到的一些数据可以佐证我的理论? 还是我正在运行跟踪标志或扩展事件,以识别发生死锁然后从DDL语句推论得出的结果? 纵观各种数据可能被Nolock提示弄得一团糟,果断地确定销路似乎是一个难题。


1
SELECT INTO是否在运行时之前在TempDB中保留#Object名称?
汇集了一个快速处理程序以帮助调试,我遇到了编译器中似乎是错误的错误。 create proc spFoo @param bit as begin if @param = 0 begin select * into #bar from [master].dbo.spt_values -- where number between ... end else begin select top 10 * into #bar from [master].dbo.spt_values order by newid(); end; end; 尝试执行上述操作会返回以下错误 消息2714,级别16,状态1,过程spFoo,第19 行在数据库中已经有一个名为“ #bar”的对象。 在人类可读的意义上,该proc似乎很好:select into因为它们被包装在if-else块中,所以仅将执行一条语句。但是,非常好,SQL Server无法确认这些语句在逻辑上相互排斥。也许更令人困惑的是,将drop table #fooif放置在if-else块内时(如果假定它将告诉编译器取消分配对象名),错误仍然存​​在,如下所示。 create …

2
SQL Server 2014突然减速/无插入/与硬件或索引无关
我正在350GBPC上运行约4000万行的数据库。 SQL服务器2014年,Win7的,AMD 8350 @ 4.8GHZ,16 GB的RAM和500 GB SSD(数据库托管在它自己的500 GB SSD,有一个吞吐量500MB / 500MB的读/写)。 数据库未更新,我只是在分析/读取它。与创建几个indexes,任何join,count(*)等等,只需要不到1分钟,这是确定我的目的。我一直在对数据运行一些查询(运行单个联接查询40-50次后,它变慢了),现在花了1分钟的调用仍在20分钟后运行。 我会密切注意系统资源,SSD当查询开始时我会看到踢进来,它读取20-30秒,然后121kB/second在接下来的20分钟读取。这不是CPU问题或磁盘问题。我的RAM数量有限,但是当我第一次加载数据库时,调用运行良好,现在,25分钟后没有任何运行。 实际上,我再也无法查询数据库,即使是一条基本SELECT语句,任何调用也要花费很长时间。我尝试重建索引并更新统计信息,但没有区别。 我对此没有很多经验,所以我的SQL查询很可能是不正确的,在这种情况下,我期望出现错误,或者它会以0个结果完成执行,但是都不会发生。 我想做的是在基于表ACALLS的时间之前的5秒钟内计数“ TypeID”的所有实例。 SELECT ACALLS.StartTime, ACALLS.Time, ACALLS.ServerIP, ACALLS.SRVR, ACALLS.calls, ACALLS.TOKEN, COUNT(TypeID) as ExecRate FROM ACALLS INNER JOIN MAINVIEW ON MainView.TimeStamp BETWEEN ACALLS.StartTime and DATEADD(ss,-5,ACALLS.StartTime) WHERE DATEPART(hour,MainView.TimeStamp) BETWEEN 10 and 13 and CAST(MainView.TimeStamp as date) = …

3
数据仓库服务器。您如何计算RAM / CPU规格?
我正在尝试为我们计划的数据仓库升级编写数据仓库服务器的规范。 在VMWare主机上运行虚拟服务器时,我们可以根据需要添加或删除资源。过去,我们根据需要逐渐增加了RAM和CPU。随着需求的增加,我们游说了更多的资源。(主要是磁盘和RAM)。 我们要求更多。他们给了我们尽可能少的东西。 但是最近,每当我们谈论资源时,我们都因一开始就没有正确配置机器而受到批评,现在我被告知开发主机已被用尽,没有可用的RAM。 我们是一个小型的地方政府组织,拥有约50个DW常规用户。在正常的日常使用中,它运行良好。我们获得了良好的mdx查询性能,并且我们的报告和仪表板速度很快。用户感到高兴。 但是,我们的ETL流程会整夜运行,并且当同时处理数据集市时,我们开始看到内存不足的迹象。昨晚SSIS失败,并发出有关“内存不足错误”的警告。 我们现有的DW服务器是Win 2008 R2,具有4个CPU和16Gb RAM,运行SQL 2012 Std。我将最大服务器内存设置为12GB,为OS和服务等保留了4GB。我们现有的DW有3个数据集市/ OLAP多维数据集,并且我们还在开发2个。 +----------+----------+---------------+-----------+---------------+ | Datamart | Files GB | Fact (Rows) | Fact (Mb) | ETL & Process | | OLAP cube| | | | Time (hours) | +----------+----------+---------------+-----------+---------------+ | PBI | 3 | 190,000 | 180 | 0.2 …

2
缩小SQL Server事务日志
我目前必须处理已经失控的SQL Server事务日志。免责声明:我不是dba,这也不是我的专业领域,所以请多多包涵。 目前,我有一个用于500MB数据库的115GB事务日志文件,(很显然)一段时间以来,该日志文件的管理不善,使其处于此状态。 最重要的是在用尽之前回收此文件占用的磁盘空间!有人告诉我,增加驱动器的大小不是一种选择,即使是暂时的,并且根据过去的增长,我们需要尽快采取行动。 据我了解,最好的方法是使数据库处于完全恢复模式,但要定期备份日志文件,在一段时间内对其进行监视,并调整初始大小和增量以适应需要。很好 看到我们在午夜进行常规的完整数据库备份时,对我来说暂时将数据库置于“简单恢复模式”(在其中一种备份运行之后),收缩日志文件以收回(几乎所有)空间以及然后使用上述备份策略将其放回完全恢复中? 我的想法是,如果这段时间发生了一些事情,我们可以简单地还原完整备份,而无需使用日志。 更新 一些额外的细节,以回答一些答案和评论: 我们确实希望保留执行时间点还原的功能,因此数据库应保持完全恢复模式。 t-log文件变得如此之大的原因是它从未被备份过。验证为log_reuse_wait_desc返回“ LOG_BACKUP”。

3
升级到SQL Server 2008 R2涉及的风险
我们有许多SQL Server需要从版本2005升级到2008 R2。微软计划在今年年中之前停止工作,因为微软将停止对此提供的支持。 2005 SQL Server都是SP3和SP4,都在Windows Server 2003上运行(其支持已经终止,但是我们不能再延长一年),但是如果需要,我们可能还会对服务器操作系统进行升级。 这些服务器包括复制(事务),日志传送,报告服务以及运行SSIS包的集成服务器。 我的问题不是在这里,而是想知道在计划升级之前会涉及的风险或可以进行的任何预检查? 另外,就迁移/升级而言,就地升级是否比并行解决方案更好?

1
选择按值均匀分布的分组数据
我想从一个表中选择4组数据,这些数据具有各组中值的总和,并且分布均匀。我确信我对它的解释不够清楚,所以我将尝试举一个例子。 在这里,我使用NTILE(4)创建4个组: SELECT Time, NTILE(4) OVER (ORDER BY Time DESC) AS N FROM TableX Time - N ------------- 10 - 1 9 - 2 8 - 3 7 - 4 6 - 1 5 - 2 4 - 3 3 - 4 2 - 1 1 - 2 为了简便起见,在上面的查询和结果中,其他列已被省略。 因此,您还可以看到以下组: …

1
如何在NT SERVICE \ MSSQLSERVER帐户上运行SQL服务(如果该服务先前在LocalSystem上运行)
最近,仅出于实验目的,我将服务器设置中的默认(C:...)data \ log文件路径重新定位到新位置(G:\ DBA)。 然后,我将以前存在的数据库的data \ log文件移到了新位置(G:\ DBA)并重新启动了SQL服务。从那时起,每当我创建数据库时,它就会按预期工作,即在新位置创建数据\日志文件(很酷...)。 但是问题是,我看到我以前所有的现有数据库都处于RecoveryPending状态,并且还出现了诸如Access Denned的错误。 考虑到运行SQL的服务帐户(NT SERVICE \ MSSQLSERVER)无法访问新位置(G:\ DBA),我在计算机管理控制台中将登录帐户更改为SQL服务的本地系统。现在我看到所有数据库都很好。 但是,我想在NT SERVICE \ MSSQLSERVER(默认实例)服务帐户上运行我的sql服务。我尝试通过为NT SERVICE \ MSSQLSERVER授予对G:\ DBA \的完全访问权限,但是没有用。如果要在NT SERVICE \ MSSQLSERVER服务帐户上运行我的SQL服务,请帮我做什么。我是这个领域的初学者。请帮帮我。 提前致谢。。。



1
日志传送SQL Server 2012
我是一家没有DBA的小商店的开发人员,并且我正在尝试使用sql server 2012进行日志传送。我正在尝试从事务系统到新的数据仓库的报告卸载,并将此数据库用作暂存区。 我运行了日志传送向导,并且每次都执行主备份和文件复制作业。辅助还原作业似乎随机失败。 主服务器只有一个事务日志作业。差异备份已禁用(不确定是否重要),但是具有完整备份。 辅助服务器是全新安装,没有维护计划,备份或活动用户。 有没有办法强制备份恢复同步,或者始终确保备份保持同步? 看起来太脆弱了。请指教。 以下是已编辑的日志: *Starting transaction log copy. Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7' Retrieving copy settings. Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7' Retrieved copy settings. Primary Server: '', Primary Database: 'db', Backup Source Directory: '\\server\folder', Backup Destination Directory: '\\server\folder', Last Copied File: '\\server\folder\db_20160105070002.trn' Starting transaction log restore. Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7' …

2
更新大小为5k的行时出现8k行溢出错误
我正在尝试将具有5k大小的一行的目标表也更新为5k的行。 由于是一行,因此很容易知道行的实际大小: select * from sys.dm_db_index_physical_stats(DB_ID('RODS_HSD_ES'), OBJECT_ID(N'TBL_BM_HSD_SUBJECT_AN_148_REPRO'), NULL, NULL, 'DETAILED') 复制 自创建以来,表未更改。没有看到任何原因导致它失败。有想法吗?

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.