Questions tagged «sql-server»

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

6
可能的最小备份…使用SQL Server
每天,我们都会通过WAN运送SQL Server备份。我们需要最小化这些备份的大小,以免花费很长时间。 我们不介意我们的备份过程是否花费更长的时间。就目前而言,我们需要在WAN上移动30gig压缩备份,这需要10多个小时。 我们必须有2种选择来获得较小的每日备份。 日志传送,这意味着我们将不得不重组灾难恢复流程。 将信息剥离到db之外并在另一端重建(删除非聚集索引,将聚集索引打包为100%-在另一端重建) 两者都将涉及我们的大量工作。我们使用的是SQL Server 2008 pro,所有备份均已压缩。 是否有任何商用产品可以为我们提供与选项(2)类似的备份大小? 是否有完善的脚本可以让我们完成(2)?(处理索引视图,过滤索引,外键等)


10
如何跟踪数据库依赖关系?
随着内部应用程序数年的发展,您偶尔会发现许多表,人们认为这些表不再相关并且想要删除。在SQL环境中以及可能在SSIS之类的东西中,有什么实用的方法来识别数据库依赖关系? 我曾经在一些相当残酷的地方工作过,例如: 首先删除,然后问问题(如果它试图提取不再存在的表,可能会杀死数据仓库构建) 首先删除权限,然后等待错误报告(如果故障处理不当,可能会导致静默错误) 我很欣赏SQL Server附带的工具来跟踪该实例中的依赖关系,但是如果您在不同实例上有数据库,这些工具似乎会遇到麻烦。是否有使查询依存关系更容易的选项,也许回答诸如“此列在哪里使用”之类的问题?诸如“在此存储过程中的该另一台服务器上已结束”或“此SSIS程序包中已结束”的答案?

2
在这种情况下,为什么使用表变量的速度是#temp表的两倍?
我在这里查看的文章“ 临时表与表变量及其对SQL Server性能和SQL Server 2008的影响”能够重现与2005年类似的结果。 当仅执行10行存储过程(以下定义)时,表变量version out会执行临时表版本两次以上。 我清除了过程缓存并运行了两个存储过程10,000次,然后又重复了该过程以进行另外4次运行。以下结果(每批次的时间,以毫秒为单位) T2_Time V2_Time ----------- ----------- 8578 2718 6641 2781 6469 2813 6766 2797 6156 2719 我的问题是:表变量版本具有更好的性能的原因是什么? 我已经做了一些调查。例如,用 SELECT cntr_value from sys.dm_os_performance_counters where counter_name = 'Temp Tables Creation Rate'; 确认在这两种情况下,临时对象都是在第一次运行后按预期进行缓存,而不是针对每次调用从头开始再次创建。 类似地跟踪Auto Stats,SP:Recompile,SQL:StmtRecompile在探查事件(下图)显示,这些事件只出现一次(在第一次调用#temp表的存储过程)和其他9999个执行不提高任何这些事件。(表变量版本未获得任何这些事件) 第一次运行存储过程的开销稍大一点也不能解决总体差异,但是由于清除过程缓存并同时运行两个过程只需要花费几毫秒,因此我不相信统计信息还是重新编译可能是原因。 创建所需的数据库对象 CREATE DATABASE TESTDB_18Feb2012; GO USE TESTDB_18Feb2012; CREATE TABLE NUM ( …

2
外部应用与左连接性能
我正在使用SQL SERVER 2008 R2 我刚刚在SQL中遇到了APPLY,并且很喜欢它如何解决很多情况下的查询问题, 我使用2个左联接的许多表都得到结果,我能够获得1个外部应用。 我的本地数据库表中有少量数据,并且在部署之后,该代码应该在至少20倍大的数据上运行。 我担心对于大量数据而言,外部应用可能需要比2个左连接条件更长的时间, 任何人都可以说出Apply的工作原理,以及它如何影响非常大的数据的性能。如果可能的话,每个表的大小与n1 ^ 1或n1 ^ 2 ...成比例关系……其中n1是表中的行数1。 这是带有2个左联接的查询 select EC.*,DPD.* from Table1 eC left join ( select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2 group by member_id,parent_gid,child_gid,LOB,group_gid ) DPD2 on DPD2.parent_gid = Ec.parent_gid AND DPD2.child_gid = EC.child_gid AND DPD2.member_id = EC.member_id AND DPD2.LOB = EC.default_lob AND …

1
如何在SQL Server 2017中使用SNAPSHOT_MATERIALIZATION创建视图?
SQL Server 2017有几个新的存储过程: sp_refresh_single_snapshot_view – @view_name nvarchar(261),@ rgCode int的输入参数 sp_refresh_snapshot_views – @rgCode int的输入参数 以及sys.messages中的新条目: 10149 –无法在视图'%。* ls'上创建具有SNAPSHOT_MATERIALIZATION的索引,因为视图定义包含内存优化表。 10642 –无法为'%。* ls'上的索引'%。* ls'设置SNAPSHOT_MATERIALIZATION,因为它仅适用于视图上的索引。 10643 –不能在'%。* ls'上为'%。* ls'设置SNAPSHOT_MATERIALIZATION,因为它仅适用于视图上的聚集索引。 10648 –无法为'%。* ls'上的分区索引'%。* ls'设置SNAPSHOT_MATERIALIZATION。 10649 –无法在具有SNAPSHOT_MATERIALIZATION的聚集索引'%。* ls'的'%。* ls'上创建非聚集索引'%。* ls'。 10650 –刷新快照视图要求在数据库上启用快照隔离。 3760 –无法在具有SNAPSHOT_MATERIALIZATION的视图'%。* ls'上删除索引'%。* ls'。 4524 –无法更改视图'%。* ls',因为它具有快照实现。 4525 –刷新视图之前,无法在具有快照实现的视图'%。* ls'上使用提示'%ls'。 以及新的扩展事件: 那么我们如何创建快照实现的视图呢?(显然,Microsoft尚未对此进行记录。)这是我迄今为止尝试过但仍未奏效的要点。

5
当以前快速的SQL查询开始运行缓慢时,如何查找问题的根源?
背景 我有一个针对SQL Server 2008 R2的查询,该查询联接和/或左联接约12个不同的“表”。该数据库相当大,有许多表超过5000万行和大约300个不同的表。适用于在全国设有10个仓库的大型公司。所有仓库都读取和写入数据库。所以它很大而且很忙。 我遇到的查询看起来像这样: select t1.something, t2.something, etc. from Table1 t1 inner join Table2 t2 on t1.id = t2.t1id left outer join (select * from table 3) t3 on t3.t1id = t1.t1id [etc]... where t1.something = 123 请注意,联接之一是在不相关的子查询上。 问题是从今天早上开始,在没有对系统进行任何更改(我或我的团队中的任何人都知道)的情况下,该查询通常需要运行2分钟左右,而开始需要花一个半小时才能运行-跑了。数据库的其余部分运行正常。我已经从通常运行该程序的过程中取出了此查询,并以相同的慢度在带有硬编码参数变量的SSMS中运行了该查询。 奇怪的是,当我使用不相关的子查询并将其放入临时表中,然后使用该子查询代替子查询时,查询运行良好。另外(这对我来说是最奇怪的),如果我将这段代码添加到查询的末尾,则查询运行良好: and t.name like '%' 我从这些小实验得出的结论(可能是错误的)是,放慢速度的原因是由于如何设置SQL的缓存执行计划-当查询略有不同时,它必须创建一个新的执行计划。 我的问题是这样的:当以前运行快速的查询突然在深夜开始运行,并且除此查询外没有其他影响,我该如何解决它以及如何避免将来发生?我怎么知道SQL在内部做的事情使其变得如此缓慢(如果运行了错误的查询,我可以得到它的执行计划,但它不会运行-也许预期的执行计划会给我一些东西?)?如果此问题与执行计划有关,那么如何避免SQL认为真正糟糕的执行计划是个好主意? 同样,这也不是参数嗅探的问题。我以前见过这种情况,不是这样,因为即使我在SSMS中对变量进行硬编码,性能仍然很慢。

2
为什么Denali序列的性能要优于Identity列?
在他对哪个更好的回答中:标识列或生成的唯一ID值?麦丁妮说: 当SQL Denali发布时,它将支持比身份更有效的序列,但是您自己无法创建更有效的序列。 我不确定。了解Oracle的序列后,我要么创建一个插入触发器,要么将每个插入封装到存储过程的调用中,要么祈祷当我进行临时插入时不要忘记正确使用序列。 我怀疑序列的优势是否如此明显。

5
为什么仍然有varchar数据类型?
我的许多数据库都有定义为varchars的字段。这一直没有大的问题,因为我生活和工作在美国(其中存在的唯一语言是“美国”。啊哈) 在使用数据库大约5年之后,我发现我最终遇到了varchar字段性质有限的问题,必须修改字段以将数据存储为nvarchars。在不得不对表进行另一次更新,将varchar字段转换为nvarchar之后,我有了一个想法-为什么我们仍然这样做呢?我很早就做出了将所有新的文本字段都定义为nvarchar而不是varchar的明智决定,这是我10年前上学时从教科书中学到的内容。 是2011年,去年有一个新版本的SQL Server。当可以/应该使用nvarchar时,为什么为什么继续支持varchar数据类型? 我知道,经常有人争辩说nvarchars是varchars的“两倍大”,因此存储空间的使用可能是维护varcars的观点之一。 但是,今天的用户如果想节省存储空间,则可以定义其nvarchars将数据存储为UTF-8而不是默认的UTF-16。如果主要需要的话,这将允许8位编码,同时确保插入到其DB中的2-8字节罕见字符不会破坏任何内容。 我想念什么吗?在过去的15到20年中,这种情况没有发生变化,这是否有充分的理由?


5
为什么SQL Server消耗更多的服务器内存?
SQL Server占用了我的服务器RAM的87.5%。最近,这引起了许多性能瓶颈,例如速度缓慢。我研究了这个问题。我可以在互联网上找到的一种常见解决方案是设置SQL Server的最大限制。这样做已经取得了很大的进步。我想知道为什么如果未设置最大内存值,为什么SQL Server会继续消耗资源

1
SQL Server:如何跟踪CREATE INDEX命令的进度?
SQL Server 2014标准版 我已经读过dm_exec_requests中的percent_complete不适用于CREATE INDEX,实际上,percent_complete坚持为0。所以这无济于事。 我目前使用下面的方法,该方法至少向我展示了运动(未阻止创建索引)。但是我不知道我是整个过程的%10还是%99。 我尝试了这里描述的方法:https : //dba.stackexchange.com/a/102545/6229, 但是它显示出明显的错误完成时间(对于60分钟以上的过程,它基本上显示“现在”,即我进入了10分钟) ) 我如何获得线索? SELECT percent_complete, estimated_completion_time, reads, writes, logical_reads, text_size, * FROM sys.dm_exec_requests AS r WHERE r.session_id <> @@SPID AND r.session_id = 58

2
在SQL Server中,对存储过程进行分组的目的是什么?
我必须处理的最困惑的问题之一与存储过程组有关。给定一个存储过程,usp_DoSomethingAwesome我可以通过调用它在另一个组中创建该proc usp_DoSomethingAwesome;2。 我在对一些系统生成的插入,更新和删除复制存储过程引起的某些复制问题(发布者:SQL 2000 Ent。,Dist / Sub:2008 R2 Ent)进行故障排除时发现了这一点。 具有这种“分组”能力的目的/思想是什么?


1
删除与截断
我试图对DELETE和TRUNCATE命令之间的差异有更深入的了解。我对内部结构的理解大致如下: DELETE->数据库引擎从相关数据页和输入该行的所有索引页中查找并删除该行。因此,索引越多,删除时间越长。 TRUNCATE ->会简单地整体删除表的所有数据页,这使它成为删除表内容的更有效的选择。 假设以上正确(如果不正确,请纠正我): 不同的恢复模式如何影响每个语句?如果有任何作用 删除时,是扫描所有索引还是仅扫描行所在的索引?我假设所有索引都已扫描(而不查找?) 如何复制命令?SQL命令是否在每个订阅服务器上发送和处理?还是MSSQL比这更聪明?

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.