Questions tagged «sql-server»

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

2
批量插入时间差异很大
因此,我有一个简单的批量插入过程,可以从暂存表中获取数据并将其移入我们的数据集市。 该过程是一个简单的数据流任务,默认设置为“每批行数”,选项为“ tablock”和“无检查约束”。 桌子很大。587,162,986,数据大小为201GB,索引空间为49GB。该表的聚集索引为。 CREATE CLUSTERED INDEX ImageData ON dbo.ImageData ( DOC_ID ASC, ACCT_NUM ASC, MasterID ASC ) 主键是: ALTER TABLE dbo.ImageData ADD CONSTRAINT ImageData PRIMARY KEY NONCLUSTERED ( ImageID ASC, DT_CRTE_DOC ASC ) 现在我们遇到了一个问题,即BULK INSERT通过SSIS的运行速度非常慢。1小时插入一百万行。填充表的查询已经排序,并且要填充的查询需要不到一分钟的时间才能运行。 当进程运行时,我可以看到查询正在等待BULK插入,这需要5到20秒的时间,并且显示的等待类型为PAGEIOLATCH_EX。该过程一次只能执行INSERT大约一千行。 昨天,在针对我的UAT环境测试此过程时,我遇到了同样的问题。我运行了几次该过程,试图确定此缓慢插入的根本原因是什么。然后突然之间不到5分钟就开始运行了。所以我又运行了几次,结果都一样。等待5秒或更长时间的散装插入物数量也从数百下降到大约4。 现在,这令人困惑,因为这并不像我们的活动有所减少。 CPU持续时间很短。 速度较慢的时间似乎较少等待磁盘。 实际上,磁盘延迟会在5分钟以内运行该进程的时间内增加。 在此过程运行不佳的时期,IO更低。 我已经检查过了,并且文件没有增长,因为文件仅占70%。日志文件仍有50%可用。数据库处于简单恢复模式。DB仅具有一个文件组,但分布在4个文件中。 所以我想知道的是:为什么我看到那些大批量插入的等待时间如此之长。B:发生了什么魔术使它运行得更快? 边注。今天又像废话一样运行。 UPDATE,当前已分区。但是,这样做的方法充其量只是愚蠢的。 CREATE PARTITION SCHEME …

2
如何获取SQL插入和/或更新以不锁定MS SQL Server上的整个表
数据库工作非常新手,因此,感谢您对一个基本问题的耐心等待。我在本地计算机上运行SQL Server 2014,并且有一个小表和一个基本的客户端应用程序来测试不同的方法。我在INSERT INTO和UPDATE语句中都得到了一个表锁。客户端是具有以下代码的ASP.NET应用程序: OleDbConnection cn = new OleDbConnection("Provider=SQLNCLI11; server=localhost\\SQLEXPRESS; Database=<my db>; user id=<my uid>; password=<my pwd>"); cn.Open(); OleDbTransaction tn = cn.BeginTransaction(); OleDbCommand cmd = new OleDbCommand("INSERT INTO LAYOUTSv2 (LAYOUTS_name_t, LAYOUTS_enabled_b, LAYOUTS_data_m) VALUES ('name', '-1', 'data')", cn, tn); cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT SCOPE_IDENTITY()"; int newkey = Decimal.ToInt32((decimal)cmd.ExecuteScalar()); Console.WriteLine("Created index " …

4
当XACT_ABORT设置为ON时,在什么情况下可以从CATCH块内部提交事务?
我一直在阅读有关TRY...CATCH和的MSDN XACT_STATE。 它具有以下示例,该示例XACT_STATE在构造CATCH块中TRY…CATCH用于确定是提交还是回退事务: USE AdventureWorks2012; GO -- SET XACT_ABORT ON will render the transaction uncommittable -- when the constraint violation occurs. SET XACT_ABORT ON; BEGIN TRY BEGIN TRANSACTION; -- A FOREIGN KEY constraint exists on this table. This -- statement will generate a constraint violation error. DELETE FROM Production.Product WHERE …

1
为什么SQL Server拒绝使用Fullscan以外的任何内容来更新这些统计信息?
我注意到在每日数据仓库构建中,运行时间相对较长(超过20分钟)的自动更新统计信息操作。涉及的表是 CREATE TABLE [dbo].[factWebAnalytics]( [WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL, [MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey] DEFAULT ((-1)), /*Other columns removed*/ CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED ( [MarketKey] ASC, [WebAnalyticsId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey]) ) ON …

2
为什么执行差异备份时我的批处理请求增加
我已经开始对2012 SQL Server上的各种活动进行一些长期跟踪,并且发现增量备份期间批处理请求的增加。 可以说,正常情况下,每天我们大约有10-20个批处理请求,但是在我们的差异备份运行期间,它跳到了每秒100-130个。 我知道这不是很多,但令我好奇的是它增加了10倍。 不知道您可能需要什么信息来帮助解决此问题。

1
我如何尽快切碎此扩展事件XML?
我在SQL Server 2008 R2中创建了扩展事件会话。会话运行,并在事件发生时收集事件,完全符合您的期望。 如果在事件相对较少时切碎xml,则性能可以接受。当我有成千上万个事件时,将xml切碎是永远的。 我知道自己做错了事,只是对XML引擎的内部知识不足,无法理解。 这是我的扩展事件会话的定义: IF EXISTS ( SELECT 1 FROM sys.server_event_sessions dxs WHERE dxs.name = 'queries' ) BEGIN IF EXISTS ( SELECT 1 FROM sys.dm_xe_sessions dxs WHERE dxs.name = 'queries' ) BEGIN ALTER EVENT SESSION queries ON SERVER STATE = STOP; END DROP EVENT SESSION queries ON …

2
我计算机名称中的连字符导致T-SQL错误
我是开发人员,而不是DBA(恐怕正在显示)。我试图在我的家用计算机(名为John-PC)上运行带有SQL Server 2014 Express的Report Builder 3.0,但无法运行我的报告。 我无意中创建的用户/登录组合user = John-PC和login = John-PC\John。当我尝试通过以下方式删除条目时: Drop Login John-PC\John 我收到一个错误: '-'附近的语法不正确。 我认为问题是计算机名称中的连字符。 有没有一种方法可以解决语法错误? 还有另一种更改或删除用户的方法(我尝试从中删除,sys.server_principals但收到一个我无法进行临时更改的错误)。 我可以以某种方式为Report Builder提供一个新的用户名/登录名吗? 如果以上都不是,我可以John_PC将计算机的名称更改为还是会导致很多其他我无法想象的问题?

2
如何实现基于集合的算法/ UDF
我有一个算法,需要对具有800K行和38列的表中的每一行运行。该算法在VBA中实现,并且使用来自某些列的值来操纵其他列来进行一堆数学运算。 我目前正在使用Excel(ADO)来查询SQL,并将VBA与客户端游标一起使用来逐行循环应用该算法。它可以工作,但是需要7个小时才能运行。 VBA代码非常复杂,以至于将其重新编码为T-SQL会花费很多工作。 我已经阅读了有关CLR集成和UDF作为可能路线的信息。我还考虑过将VBA代码放在SSIS脚本任务中,以使其更接近数据库,但可以肯定存在解决此类性能问题的专家方法。 理想情况下,我将能够以基于并行集的方式针对尽可能多的行(所有?)运行算法。 任何帮助都很大程度上取决于如何在此类问题上获得最佳性能。 - 编辑 感谢您的评论,我正在使用MS SQL 2014 Enterprise,这里有更多详细信息: 该算法在时间序列数据中找到特征模式。该算法中的函数执行多项式平滑,加窗,并根据输入标准查找感兴趣的区域,返回十二个值和一些布尔结果。 我的问题更多是关于方法的问题,而不是实际的算法:如果我想一次在多个行上实现并行计算,我有什么选择。 我看到建议重新编码为T-SQL,这是很多工作,但是可能的,但是算法开发人员在VBA中工作,并且更改频繁,因此我需要与T-SQL版本保持同步并重新验证每个更改。 T-SQL是实现基于集合的函数的唯一方法吗?

2
这两个SQL Server回滚有何不同?
在SQL Server 2008 R2中,这两个回滚有何不同: 运行ALTER语句几分钟,然后单击“取消执行”。完全回滚需要几分钟。 运行相同的ALTER语句,但是请确保该LDF文件的大小不足以使其成功完成。一旦达到LDF限制并且不允许“自动增长”,查询执行将立即停止(或发生回滚),并显示以下错误消息: The statement has been terminated. Msg 9002, Level 17, State 4, Line 1 The transaction log for database 'SampleDB' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases 这两个方面在以下几点上有何不同? 为什么第二个“回滚”是瞬时的?我不确定是否可以将其称为回滚。我的猜测是,事务日志是在执行过程中编写的,一旦它意识到没有足够的空间来完全完成任务,它就会以一些“结束”消息停止,而不会提交。 第一次回滚需要很多时间(回滚是单线程的)会发生什么? 2.1。SQL Server会返回并撤消LDF文件中的输入吗? 2.2。该LDF文件大小在回滚结束变得更小(从DBCC …

3
备份内部-在运行备份作业时会发生什么-就SQL Server中的锁定和性能开销而言?
对于MySQL,我知道数据库是在SQL语句中逐表备份的,这会导致锁定,如果在备份时更新列,则可能会遇到完整性问题。 据我了解,这不适用于Microsoft SQL Server,但是SQL Server如何处理呢?是否有一些内部冻结来保持数据库一致? 我还听说备份是单线程的,这意味着它仅使用一个核心,假设您备份到单个文件。还要假设您有一台多核计算机,例如16个核,或者至少有一个比一个大得多的核。 从我的个人经验来看,备份时我从来没有遇到过问题,既没有锁定也没有开销问题,但是我的经验有限。这就是为什么我总是建议在服务器属性中打开备份压缩的原因。 那么当备份作业运行时会发生什么呢?而且不同版本之间也存在显着差异吗?例如2008、2012和2014(不是许可)。

2
sp_send_dbmail存储过程带有附件发送
我的任务是向其中一位客户发送一份小型月度报告。该报告以前是在实例上手动运行的,输出已复制到电子表格中并作为附件发送给客户。 我正在寻找一个更永久的解决方案,因此我打算使用sp_send_dbmail存储过程来运行查询并将其作为附件发送。 一切正常,但消息格式正确。最初,我尝试将输出附加为带有CSV文件的CSV文件,@query_result_seperator = ','但结果无处不在! 当我正常运行报表时,在SQL中输出看起来不错。但是,将其作为CSV或仅在邮件正文中发送就没有了。 我认为如果将输出导出为HTML并以附件/或XML格式发送输出可能会更好,但是我不知道该怎么做。 有没有人有什么建议? 提前致谢!

1
高可用性还原SQL Server 2012数据库
我有一个始终处于高可用性模式的数据库,该数据库与另一个实例上的另一个数据库同步。如何使用从.bak文件还原到主数据库T-SQL? 我是高可用性的新手,并被告知我需要先使数据库脱离高可用性,然后才能进行还原,然后再次将其重新设置为高可用性,但我不确定。 我希望我可以在AlwaysOn仍启用的同时直接还原到主数据库,并且它将与辅助数据库自动同步。

6
事务日志不会减少,数据库认为它正在复制
我有一个运行Kaspersky Security Center的SQL Server 2008 R2 Express数据库,我不知道在什么情况下会进行安装,但是该数据库似乎认为它已被复制并且不会从事务日志中释放任何空间。例如: USE master; SELECT name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled FROM sys.databases WHERE name = 'KAV'; SELECT DATABASEPROPERTYEX('KAV', 'IsPublished'); 返回: name | log_reuse_wait | log_reuse_wait_desc | is_cdc_enabled -----|----------------|---------------------|--------------- KAV | 6 | REPLICATION | 0 DATABASEPROPERTYEX('KAV', 'IsPublished') ---------------------------------------- 0 [not published] 同样Replication,SSMS 的部分中没有列出任何内容。 到目前为止,我已经尝试了一些来自Google结果的陈述: USE KAV; …

6
使用PowerShell发现所有正在运行的SQL Server实例的最有效方法是什么?
我的任务是发现我们域中运行的所有SQL Server实例。在某些情况下,每个服务器有多个实例。我已经看到了找到这些实例的两种不同的PowerShell方法,但是似乎都找不到所有实例。 1)使用WMI $srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName $instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}} return $instances 2)使用远程注册表(与Get-SQLInstance 1一样) 我遇到的最大问题是,并不是我所知道的所有服务器都与SQL Server WMI提供程序一起运行,也不是它们都允许远程注册表。有第三种方法吗?我可以使用远程桌面访问所有服务器,但是我正在寻找大约30台计算机,如果可能的话,我希望避免手动操作。这仅适用于SQL Server 2008及更高版本,虽然很高兴了解其他SQL Server服务(SSIS / SSAS / SSRS),但我的主要重点是SQL Server本身。

1
SQL Server中执行计划创建的确定性如何?
给定以下常量: 具有相同结构(表,索引等)的相同数据库 相同的数据 相同的SQL Server和硬件配置 相同的统计 客户端中相同的SET选项 相同的SQL Server版本 相同的跟踪标志 给定这些常量,SQL Server会始终为给定查询生成相同的计划吗? 如果没有,还有其他考虑吗?是否还需要考虑不确定性因素?

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.