Questions tagged «sql-server»

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

4
如何在不影响性能的情况下备份大型SQL Server数据库?
我们已经收到有关查询运行缓慢或凌晨超时的报告,而我认为运行可能会影响到此的唯一工作就是数据库备份工作。 数据库本身约为300GB,备份作业从凌晨4:30开始,直到凌晨7:00才完成。我们备份作业的当前语法为: BACKUP DATABASE [DatabaseName] TO DISK = N'E:\Database Backups\DatabaseName.Bak' WITH INIT, NOUNLOAD, NAME = N'DatabaseName.Bak', NOSKIP, STATS = 10, NOFORMAT E:\ 是服务器上的一个分区,既包含数据库又包含数据库备份。 还应该注意,这是虚拟服务器,而不是专用的独立服务器。切换到虚拟服务器后,我们立即开始抱怨备份过程中的速度降低,因此我认为这可能与之相关。 有没有一种方法可以运行此备份作业,使其在运行时不影响查询性能? 我们正在使用SQL Server 2005

2
是否可以给优化器更多或所有需要的时间?
鉴于优化器无法花所有需要的时间(它必须使执行时间最小化并且不做任何贡献)来探索所有可能的执行计划,因此有时它会被切断。 我想知道是否可以覆盖它,以便您可以在需要的所有时间(或一定的毫秒数)内给予优化器。 我不需要这个(atm),但是我可以想象这样一个场景:在一个紧密的循环中执行一个复杂的查询,而您想提出一个最佳计划并事先对其进行缓存。 当然,它存在一个死循环,您应该重写查询,以便它消失但请耐心等待。 出于好奇,这更多是一个问题,还需要了解短路优化和完整优化之间有时是否存在区别。 事实证明,您可以使用跟踪标志2301给优化器更多时间。这并不是我所要的,但它接近了。 我发现的最佳信息是Ian Jose 在SQL Server 2005 SP1中的查询处理器建模扩展中。 请谨慎使用此跟踪标志!但是在提出更好的计划时可能会很有用。也可以看看: 由Grant Fritchey 标记为“优化级别”的文章。 在升级到SQL Server 2008之前……由Brent Ozar撰写。 Microsoft支持在高性能工作负载中运行时的SQL Server调整选项。 我在考虑具有大量联接的查询,其中联接顺序的解决方案空间呈指数爆炸式增长。SQL Server使用的试探法非常好,但是我想知道优化器是否有更多时间(在几秒钟甚至几分钟的范围内)是否会提出不同的顺序。

3
来自sql server的高磁盘I / O还是正在减慢sql server的速度?
我一直在与DBA和几个硬件专家争论我们SQL服务器上的性能问题。通常,一切都很好,但是在过去的几周中,我们在sql服务器中一直遇到巨大的延迟高峰。很明显,SQL Server正在磁盘I / O上等待。但是我一直被告知这是因为SQL Server请求异常高的I / O。事实并非如此。从运行中我可以看到没有异常,DBA关心的只是导致阻塞的原因,等等,这是没有用的。例如,我们看到的主要备份是对ASPState数据库的操作,我们正在使用它来管理Web服务器上的ASP会话状态。这些操作通常不会在Sp_who2活动结果上看到,因为它们发生得如此之快。数据库处于简单恢复模式,日志记录很少。但是,在这些延迟尖峰期间,我们可以看到对数据库的大量选择和更新操作被阻止或等待。我确定正在发生的事情是某人或某项作业正在运行某些操作,从而导致该数据库日志和数据文件使用的RAID阵列上的磁盘使用率很高。问题正在得到证明,因为没有人愿意承认他们所做的事情正在杀死我们的网站。 我的问题是什么性能计数器或我可以记录什么内容,这将有助于表明SQL Server正在等待I / O,但不是因为它要求的异常多,而是因为磁盘正忙于响应sql server的请求像往常一样快吗?

3
动态定义维度范围
每当我决定构建一个多维数据集时,我都会遇到一个问题,但是我还没有找到克服它的方法。 问题是如何允许用户自动定义一系列事物,而无需在维度中对其进行硬编码。我将在一个示例中解释我的问题。 我有一个名为客户的表: 这是表中的数据: 我想以数据透视样式显示数据,并在如下所示的定义范围内将薪金和年龄分组: 我编写了此脚本并定义了范围: SELECT [CustId] ,[CustName] ,[Age] ,[Salary] ,[SalaryRange] = case when cast(salary as float) <= 500 then '0 - 500' when cast(salary as float) between 501 and 1000 then '501 - 1000' when cast(salary as float) between 1001 and 2000 then '1001 - 2000' when cast(salary …

1
是否可以为数据库创建别名或同义词?
是否可以创建数据库别名或同义词?我希望能够做的是将NewDatabaseName别名化为OldDatabaseName,以防止不得不重写大量代码。 背景故事:我遇到一个客户,遇到一个可笑的自我引发的问题。他们有一个带有SQL Server后端的第三方应用程序。用户已经使用Visual Basic针对该数据库编写了自定义报告,所有数据库连接信息都硬编码在他们的程序中。 最近,第三方软件重命名了他们的数据库。现在,所有报告EXE都失败了。 哦,他们也没有很多源代码。 我忍住了笑声,说我会做什么。

3
错误消息“通过聚合或其他SET操作消除了空值”中“ SET”的含义
今天,当我运行同事的脚本时,我看到了上面的“ ANSI警告”消息(并且我不知道很多语句中的哪一条导致显示警告)。 在过去,我忽略了这一点:我避免自己置空,因此消除它们的任何事情在我的书中都是一件好事!但是,今天“ SET”一词在我的身边大喊大叫,我意识到我不知道在这种情况下该词的含义是什么。 基于第一个大写字母,我的第一个想法是它指的是SET关键字,意思是“赋值”,例如 UPDATE <table> SET ... ...ON DELETE SET NULL... SET IDENTITY_INSERT <table> ON 根据SQL Server帮助,“ ANSI警告”功能基于ISO / ANSI SQL-92,其规范仅在小节标题中使用了“设置操作”一词,因此在标题中使用了“设置操作”一词。数据分配部分。但是,在快速搜索错误消息之后,我看到了一些示例,这些示例SELECT似乎没有涉及任何分配。 基于SQL Server警告的措辞,我的第二个想法是隐含set的数学含义。但是,我不认为SQL中的聚合严格来说是一种设置操作。即使SQL Server团队将其视为设置操作,将“设置”一词用大写字母的目的是什么? 在谷歌搜索时,我注意到一条SQL Server错误消息: Table 'T' does not have the identity property. Cannot perform SET operation. 在相同情况下,相同的“设置操作”一词只能指代IDENTITY_INSERT属性的分配,这使我回到了最初的想法。 谁能阐明这个问题?
18 sql-server 

3
如何在Sql Server中存储Web服务器日志的'n'天?
为了更快地进行报告和性能分析,我们希望将Web服务器日志插入Sql Server。这将使我们能够实时查看流量模式,问题和速度下降。 我们有一个守护程序,用于侦听来自负载均衡器的请求/响应事件,并将批量插入数据库。 但是,我们每天可获得大约1 GB的日志,而我们只需要保留大约一周的时间(至少以这种原始形式)。 存储此数据的最佳方法是什么,删除旧条目的最佳方法是什么? 我们已经讨论过将每天的数据存储在自己的表中,例如,Log_2011_04_07将具有当天的所有条目,然后删除最旧的表。可以创建一个视图来涵盖所有的日间表格,以方便查询。可行吗?

2
Row_GUID列的用途是什么?
我一直在探索AdventureWorks2012数据库,并在几个表中看到了Row_GUID。 我的问题分为两部分: 什么时候应该包含Row_GUID列? Row_GUID列的用途和好处是什么?
18 sql-server  uuid 

3
为什么这个连接基数估计值这么大?
我遇到以下查询的基数估计过高: SELECT dm.PRIMARY_ID FROM ( SELECT COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID) PRIMARY_ID FROM X_DRIVING_TABLE dt LEFT OUTER JOIN X_DETAIL_1 d1 ON dt.ID = d1.ID LEFT OUTER JOIN X_DETAIL_LINK lnk ON d1.LINK_ID = lnk.LINK_ID LEFT OUTER JOIN X_DETAIL_2 d2 ON dt.ID = d2.ID LEFT OUTER JOIN X_DETAIL_3 d3 ON dt.ID = d3.ID ) …

2
为什么在存储过程中的此查询上不发生SQL注入?
我做了以下存储过程: ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100)) AS SELECT ActorDOB, ActorName FROM tblActor WHERE ActorName LIKE '%' + @nameString + '%' AND ActorGender = @actorgender 现在,我尝试做这样的事情。也许我做错了,但是我想确保这样的过程可以防止任何SQL注入: EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor' 下图显示了以上在SSMS中执行的SQL,结果正确显示,而不是错误: 顺便说一句,我在查询完成执行后在分号后添加了该部分。然后我再次执行它,但是当我检查表tblActor是否存在时,它仍然存在。难道我做错了什么?还是这真的防注射?我想我也想问的是这样的存储过程是否安全?谢谢。

5
无法在计算列上创建过滤索引
在我的上一个问题中,在向表中添加新的计算列时禁用锁升级是个好主意吗?,我正在创建一个计算列: ALTER TABLE dbo.tblBGiftVoucherItem ADD isUsGift AS CAST ( ISNULL( CASE WHEN sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%' THEN 1 ELSE 0 END , 0) AS BIT ) PERSISTED; 计算所得的列是PERSISTED,并且根据computed_column_definition(Transact-SQL): 坚持 指定数据库引擎将物理地将计算出的值存储在表中,并在更新计算出的列所依赖的任何其他列时更新这些值。将计算列标记为PERSISTED允许在确定的但不精确的计算列上创建索引。有关更多信息,请参见计算列上的索引。任何用作分区表分区列的计算列都必须显式标记为PERSISTED。当指定PERSISTED时,computed_column_expression必须是确定性的。 但是,当我尝试在列上创建索引时,出现以下错误: CREATE INDEX FIX_tblBGiftVoucherItem_incl ON dbo.tblBGiftVoucherItem (strItemNo) INCLUDE (strTier3) WHERE isUsGift = 1; …

4
在窗口功能中使用DISTINCT和OVER
我正在尝试将查询从Oracle迁移到SQL Server 2014。 这是我的查询,在Oracle中效果很好: select count(distinct A) over (partition by B) / count(*) over() as A_B from MyTable 这是我尝试在SQL Server 2014中运行此查询后遇到的错误。 Use of DISTINCT is not allowed with the OVER clause 有人知道是什么问题吗?在SQL Server中可以进行这种查询吗?请指教。

2
需要了解并行查询执行错误
今天,我们的生产sql服务器的性能下降了。在发生这种情况时,我们记录了一些"The query processor could not start the necessary thread resources for parallel query execution"错误。我所做的阅读表明,这与执行复杂查询时使用多少个CPU有关。但是,当我在停电期间检查时CPU Utilization was only at 7%。还有其他我可能还没有提到的东西吗?这可能是性能下降的罪魁祸首吗?还是我追赶红鲱鱼? 我的sp_configure值如下: name minimum maximum config_value run_value cost threshold for parallelism 0 32767 5 5

4
使用GUID作为主键修复数据库设计的最佳解决方案
在对这一想法进行确认后,我将修复性能不佳的数据库或一个更好的建议(如果有的话)。始终欢迎更好的建议。 我有一个非常大的数据库(20+百万条记录,每天增长约1/2百万条),它们使用GUID作为PK。 我的疏忽大意是,但是PK聚集在SQL Server上,并导致性能问题。 产生引导的原因-该数据库与150个其他数据库部分同步,因此PK需要唯一。同步不是由SQL Server管理的,而是建立了一个自定义过程,该过程使数据保持同步以符合系统要求-全部基于该GUID。 150个远程数据库中的每个数据库都不存储中央SQL数据库中存储的完整数据。他们只存储他们实际需要的数据的子集,并且需求的数据并不是他们唯一的(例如,在150个数据库中,有10个可能具有其他站点数据库中的某些相同记录-它们共享)。另外-数据实际上是在远程站点而不是在中心点生成的,因此需要GUID。 中央数据库不仅用于使所有内容保持同步,而且还将针对该非常大的碎片数据库执行来自3000多个用户的查询。在初始测试中,这已经是一个大问题。 幸运的是我们还没有上线-因此我可以进行更改,并在需要时将其脱机,至少这是必须的。 远程数据库的性能不是问题-数据子集非常小,并且数据库的总大小通常不会超过1GB。记录被定期地反馈到主系统,并在不再需要时从较小的BD中删除。 保留所有记录的中央数据库的性能令人担忧-由于群集GUID是许多记录的主键。索引碎片不在图表上。 所以-我想解决性能问题的想法是创建一个新列-Unsigned BIGINT IDENTITY(1,1),然后更改表BIGINT列的Clustered PK。 我将在GUID字段上创建唯一非聚集索引,该索引是主键。 较小的远程150数据库不需要了解Central SQL Server数据库上的新PK-它仅用于组织数据库中的数据并阻止不良的性能和碎片。 这样做是否可以提高中央SQL数据库的性能,并防止将来出现索引碎片地狱(在一定程度上)?还是我错过了这里很重要的东西,它会跳起来咬我,引起更多的悲伤?

2
SQL Server如何在将列更新为int时解决事务日志填满的问题
我有一个称为SQL Server 2005的表BRITTNEY_SPEARS_MARRIAGES,它具有以下列: MarrigeId tinyint, HusbandName varchar(500), MarrigeLength int 现在我有另一张桌子 BRITTNEY_SPEARS_MARRIAGE_STORIES StoryId int, MarriageId tinyint, StoryText nvarchar(max) 问题是我们想将MarrigeId列从中更新int为tinyint。我们只是觉得在说完一切之前,布兰妮将会有很多婚姻。 现在BRITTNEY_SPEARS_MARRIAGE_STORIES表中有1800万行(嘿,女孩遇到了一些问题),因此当我们进行更新时,事务日志已填满,SQL Server框消失了。 我们如何解决这个问题? 无论如何都说“嘿,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.