Questions tagged «sql-server-2008-r2»

SQL Server 2008 R2(主要版本10.50.xxxx)。请同时用sql-server标记。

2
您可以将COUNT DISTINCT与OVER子句一起使用吗?
我正在尝试改善以下查询的性能: UPDATE [#TempTable] SET Received = r.Number FROM [#TempTable] INNER JOIN (SELECT AgentID, RuleID, COUNT(DISTINCT (GroupId)) Number FROM [#TempTable] WHERE Passed = 1 GROUP BY AgentID, RuleID ) r ON r.RuleID = [#TempTable].RuleID AND r.AgentID = [#TempTable].AgentID 目前,根据我的测试数据,大约需要一分钟。对于此查询所驻留的整个存储过程的更改,我的输入量有限,但我可能可以让他们修改此查询。或添加索引。我尝试添加以下索引: CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed) 它实际上使查询所花费的时间增加了一倍。我得到一个非聚集索引相同的效果。 我尝试将其重写如下,但没有任何效果。 WITH …

4
为什么在每晚备份的简单恢复模式下事务日志会继续增长
在立即将其标记为重复之前,我已阅读Mike Walsh的“ 为什么事务日志保持增长或空间不足?,但我认为这无法解决我的情况。我浏览了十几个类似的问题,但相关的问题大多只是说“重复”并指出了麦克的问题。 详细信息:我在SQL Server 2008 R2上有一堆约500MB的数据库,全部处于简单恢复模式(不是我的选择),每晚进行完整备份,并具有约200MB的数据文件和约300MB的日志文件。日志不会立即增长到300MB,而是会在几个月后缓慢增长。至少根据sp_who2和活动监视器,它们中的任何一个都没有打开的事务。如果我右键单击数据库并选择属性,它会告诉我大约有50MB可用空间。特别是在备份之后,整个日志是否不应该免费?在简单模式下,只要没有未完成的事务,日志是否不应该免费? log_reuse_wait_descfrom sys.databases说“什么都没有”,根据上面提到的问题和答案,它说它不应该等待任何东西来重用空间。 如果我执行“ DBCC SHRINKFILE”,则日志文件会缩小到1MB,因此它愿意回收空间。我可以设置一些可以每周缩小日志并防止事情失控的事情,但是我对为什么SQL Server可以做到这一点感到困惑。 我可以理解是否有一些需要300MB记录的疯狂交易,但是我们没有做任何极端的事情,只是基本的OLTP。来自Mike的问题/答案: 简单恢复模型-通过上面的介绍,最简单的是首先讨论简单恢复模型。在此模型中,您要告诉SQL Server-可以使用事务日志文件进行崩溃和重新启动恢复(您确实没有选择。在这里查找ACID属性,应该很快就可以理解),但是一旦您没有,出于崩溃/重新启动恢复目的而不再需要它,请继续并重用日志文件。 SQL Server在简单恢复中侦听此请求,并且仅保留进行崩溃/重新启动恢复所需的信息。一旦SQL Server确定它可以恢复,因为数据已经被硬化到数据文件中(或多或少),则已硬化的数据将不再在日志中被使用,并被标记为截断-这意味着它将被重新使用。 它一直在说应该重新使用日志空间,但是随着几个月来的缓慢增长,似乎并没有。 我想念什么?是否可以阻止SQL Server将数据识别为“已强化”并释放日志? (编辑) 行动后报告-又一点知识是危险的 在发现这是一个“普遍的问题”之后,感觉就像我对7个月前发生的事情以及我所学到的希望为其他人节省一些悲痛的事情做了解释。 首先,当您查看数据库的属性时,在SSMS中看到的可用空间就是数据文件中的可用空间。您可以通过在数据库上运行以下命令来查看此文件,然后发现SSMS报告的可用空间是FileSizeMB与UsedSpaceMB之间的差异: SELECT DB.name, MF.physical_name, MF.type_desc AS FileType, MF.size * 8 / 1024 AS FileSizeMB, fileproperty(MF.name, 'SpaceUsed') * 8/ 1024 AS UsedSpaceMB, mf.name LogicalName FROM sys.master_files …


3
归档当前年份以外的所有数据并同时对表进行分区的最佳方法是什么
任务 从一组大型表中存档,除了滚动13个月以外的所有时间。存档的数据必须存储在另一个数据库中。 数据库处于简单恢复模式 这些表是5000万行到数十亿行,在某些情况下,每行占用数百GB。 这些表当前未分区 每个表在不断增加的日期列上都有一个聚集索引 每个表还具有一个非聚集索引 对表的所有数据更改都是插入 目标是最大程度地减少主数据库的停机时间。 服务器是2008 R2 Enterprise “存档”表将包含约11亿行,“活动”表将包含约4亿行。显然,存档表会随着时间的推移而增加,但是我希望实时表也会迅速增加。至少在接下来的几年中说50%。 我曾考虑过Azure拉伸数据库,但不幸的是,我们现在使用的是2008 R2,并且可能会在其中停留一段时间。 当前计划 创建一个新的数据库 在新数据库中创建按月分区的新表(使用修改的日期)。 将最近的12-13个月的数据移到分区表中。 对两个数据库进行重命名交换 从现在的“归档”数据库中删除移动的数据。 对“归档”数据库中的每个表进行分区。 将来使用分区交换来存档数据。 我的确意识到,我将不得不交换要存档的数据,将该表复制到存档数据库,然后将其交换到存档表中。这是可以接受的。 问题: 我正在尝试将数据移到初始分区表中(实际上,我仍在对其进行概念验证)。我正在尝试使用TF 610(根据《数据加载性能指南》)和一条INSERT...SELECT语句来移动数据,最初认为该数据将被最少地记录。不幸的是,每次我尝试将其完全记录下来。 在这一点上,我认为我最好的选择可能是使用SSIS包移动数据。我试图避免这种情况,因为我正在使用200个表,而我可以通过脚本轻松地生成和运行的任何事情。 我的总体计划中是否缺少任何内容?SSIS是否是我最好的选择,它可以快速移动数据并以最少的日志使用量(空间问题)? 没有数据的演示代码 -- Existing structure USE [Audit] GO CREATE TABLE [dbo].[AuditTable]( [Col1] [bigint] NULL, [Col2] [int] NULL, [Col3] [int] NULL, [Col4] [int] …

1
将SQL Server 2000数据库升级到2008 R2并启用新功能
我最近将SQL Server 2000数据库升级到2008 R2。 我所做的是: 在旧计算机上关闭SQL Server 2000(快速)服务, 将数据文件(mydatabase.mdf和mydatabase.ldf)移至新计算机, 运行SQL Server Management Studio 2008, 连接到本地数据库引擎, 将数据文件附加到数据库。 将数据库的兼容性级别更改为SQL 2008(100)。 问题:我还应该怎么做才能完成迁移? 我想要: 使用诸如校验和和完整恢复模型之类的新功能, 使该数据库与在SQL 2008 R2中创建的数据库完全相同, 使该数据库具有完全的兼容性,正确性,并且非常适合新的SQL 2008 R2数据库引擎。 换句话说:我只想知道如何正确地将旧的SQL 2000数据库正确地完全转换为新的2008 R2数据库,请对所有事情都做对了保持冷静,并对所有新功能感到满意。 我问这个问题,是因为我在Internet上发现了很多网站,这些网站说了很多不同的内容,这让我感到困惑:有些人说需要重建索引,而另一些人说要做其他事情……现在我一无所知,所以我想听听经验丰富的人的意见和清晰的分步说明。我在一家非常小的公司工作,我一个人工作,我不想搞砸。 主席先生,您的回答给我留下了深刻的印象,没想到那么多。 所以一些评论: 该数据库现已投入生产。就像我说的那样,如我在第一篇文章中所描述的那样,它使用deattach-attach方法进行了升级,并且在MSDN 上进行了描述:http : //msdn.microsoft.com/zh-cn/library/ms189625.aspx必须快速完成,所以我被迫那样做。让我们忘记这有多么不恰当,而将注意力集中在当前情况上。 用户/权限在这里不是问题-人数很少,权限很简单。 直到2012年,使用数据库的应用程序都与SQL 2000兼容,因此这也不是问题。 数据库文件(MDF)并不大-只有大约1GB。 几个问题: 您建议使用备份/还原方法,但是我如上所述,所以现在可以遇到任何问题吗?一切正常,没有任何问题。 关于校验和和完整恢复模型:在SQL 2000上不可用/未启用,因此我现在想使用它们。您说过,我唯一需要做的就是在数据库属性中启用这些选项?我读过某个地方,那还不够,还应该重建索引或其他内容。我真的不知道,我只是问。 我正在准备将该数据库迁移到SQL 2012-首先是从SQL 2000到2008 R2,现在是从2008 R2到2012(由于缺少对SQL …

5
将文章添加到事务发布中,而不会生成新快照
将SQL 2008 R2事务复制与请求订阅者一起使用时,添加文章时,我希望避免创建整个快照(数据库约为80 GB,因此需要花费数小时)。 从本文开始,我已经了解了如何通过关闭Instant_sync来使用部分快照来执行此操作,但这对我们不起作用。 理想情况下,我想将其作为数据库脚本的一部分来运行以创建表,因此,如果要复制它,可以这样做: Create Table ... sp_addArticle ... sp_PushThisToOurSubscribersNow

7
列出给定角色的所有权限?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 6年前。 我到处搜索,还没有找到这个问题的最终答案。 我需要一个可以为关联角色提供所有权限的脚本。 有什么想法,甚至有可能吗? 这让我很接近-但我似乎无法将其翻转并给出角色而不是用户的摘要。 http://consultingblogs.emc.com/jamiethomson/archive/2007/02/09/SQL-Server-2005_3A00_-View-all-permissions--_2800_2_2900_.aspx WITH perms_cte as ( select USER_NAME(p.grantee_principal_id) AS principal_name, dp.principal_id, dp.type_desc AS principal_type_desc, p.class_desc, OBJECT_NAME(p.major_id) AS object_name, p.permission_name, p.state_desc AS permission_state_desc from sys.database_permissions p inner JOIN sys.database_principals dp on p.grantee_principal_id = dp.principal_id ) --role members SELECT rm.member_principal_name, rm.principal_type_desc, …


2
LIKE使用索引,CHARINDEX不使用索引吗?
这个问题与我的旧问题有关。以下查询需要10到15秒才能执行: SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [company].dbo.[customer] WHERE (Charindex('123456789',CAST([company].dbo.[customer].[Phone no] AS VARCHAR(MAX)))>0) 在一些文章中,我看到使用索引CAST并CHARINDEX不会从中受益。也有一些文章说使用LIKE '%abc%'将不会从索引中受益,而LIKE 'abc%'将会: http://bytes.com/topic/sql-server/answers/81467-using-charindex-vs-like-where /programming/803783/sql-server-index-any-improvement-for -like-queries http://www.sqlservercentral.com/Forums/Topic186262-8-1.aspx#bm186568 就我而言,我可以将查询重写为: SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [company].dbo.[customer] WHERE [company].dbo.[customer].[Phone no] LIKE '%123456789%' 此查询提供与上一个相同的输出。我为column创建了一个非聚集索引Phone no。当我执行此查询时,它将在1秒内运行。与之前的14秒相比,这是一个巨大的变化。 如何LIKE '%123456789%'从索引中受益? 为什么列出的文章指出它不会提高性能? 我尝试重写要使用的查询CHARINDEX,但是性能仍然很慢。为什么CHARINDEX在LIKE查询中没有从索引中受益呢? 使用查询CHARINDEX: SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [Company].dbo.[customer] WHERE ( Charindex('9000413237',[Company].dbo.[customer].[Phone no])>0 ) 执行计划: 使用查询LIKE: SELECT [customer].[Customer …

4
合并语句自身陷入僵局
我有以下过程(SQL Server 2008 R2): create procedure usp_SaveCompanyUserData @companyId bigint, @userId bigint, @dataTable tt_CoUserdata readonly as begin set nocount, xact_abort on; merge CompanyUser with (holdlock) as r using ( select @companyId as CompanyId, @userId as UserId, MyKey, MyValue from @dataTable) as newData on r.CompanyId = newData.CompanyId and r.UserId = newData.UserId and …

3
在大型表上创建聚集索引的无痛方法?
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 因此,我们有一个客户站点抱怨性能严重下降。我看了一眼,很明显,问题出在因为Somebody Else(grrrr)设计了一个表,该表包含大约2000万条记录而没有聚簇索引。 现在,我想在该表上创建聚簇索引-但是在我的测试环境中,我的create index命令已经运行了一个小时,但仍未完成。客户站点是一个工作日为24/7的车间,在创建索引时无法承受一个小时的停机时间。 是否有一些不那么费力的方法来创建索引,该索引要么可以快速完成工作,要么以某种聪明的方式完成工作,而这种忙碌的工作不会完全破坏服务器的性能? 我们正在使用SQL Server企业版。

3
我应该在完整备份期间停止事务日志备份吗?
我有两个计划以不同间隔运行的SQL Agent作业。第一项作业每天运行一次完整备份。第二个作业每十五分钟运行一次事务日志备份。 随着数据库的增长,完全备份花费的时间比最初计划的还要长(即使使用压缩)。而且我从日志中注意到,事务日志备份现在正在同时运行。 我是否应该更改事务日志备份的计划,以便在运行完整备份时不运行该计划?有关系吗?

5
为什么此显式强制转换仅导致链接服务器出现问题?
我正在通过原始服务器上的视图从链接服务器查询数据。视图必须包括几个标准化列,如Created,Modified和Deleted,但是在这种情况下,源服务器上的表中不具有任何合适的信息。因此,这些列被显式转换为它们各自的类型。我更新了视图,更改了 NULL AS Modified 至 CAST(NULL as DateTime) as Modified 但是,执行此更新后,视图将触发以下错误消息: 消息7341,级别16,状态2,第3行无法从链接服务器“”的OLE DB访问接口“ SQLNCLI11”获取列“(用户生成的表达式).Expr1002”的当前行值。 我们通常在原始服务器上进行了这种“显式强制转换”更改,而无需担心,我怀疑问题可能与所涉及的服务器版本有关。我们确实不需要应用此强制转换,但感觉更干净。现在,我只是好奇为什么会这样。 服务器版本(来源): Microsoft SQL Server 2012-11.0.5058.0(X64)2014年5月14日18:34:29版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)(Hypervisor)上的Microsoft Corporation Enterprise Edition(64位) 服务器版本(链接): Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64)2011年6月17日版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)上的Microsoft Corporation Enterprise Edition(64位)(Hypervisor ) 编辑 我只是意识到我没有发布所有有问题的列而犯了一个错误,我必须为遗漏重要的细节表示歉意。我不知道我怎么没早注意到这一点。但是,问题仍然存在。 转换为DateTime时不会发生错误的转换,而是将列转换为UniqueIdentifier时发生。 这是罪魁祸首: CAST(NULL AS UniqueIdentifier) …

5
SQL Server不是在Windows启动时启动,而是手动启动
我的SQL Server实例的(SQL Server 2008 R2 Express)服务的启动类型=自动。在过去的几次重新启动计算机后,该服务无法自行启动,但是当我手动启动该服务时,它的启动就很好。 事件查看器显示服务由于连接超时而无法启动。关于此超时,有2个条目: 条目1 等待SQL Server(SQLEXPRESS)服务连接时已达到超时(30000毫秒)。 参赛作品2 由于出现以下错误,导致SQL Server(SQLEXPRESS)服务无法启动:该服务未及时响应启动或控制请求。 我检查了ERRORLOG文件,发现这些Event Viewer条目周围没有错误记录。 有关导致此问题的原因或如何进一步调查的任何想法?

1
查找最近在数据库上执行的所有查询
[我是初学者级T-SQL程序员] [..希望我在正确的堆栈交换站点上] 我想获得我执行的所有查询的列表(至少,从早上起我今天执行的查询)。我需要报告查询的执行时间。 在线搜索并没有为我提供很多有用的信息。我在网上发现的唯一看起来很接近的查询是 SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query] FROM sys.dm_exec_query_stats AS deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest ORDER BY deqs.last_execution_time DESC 该查询返回了一些奇怪的结果(其中大多数是一堆的存储过程)。而且,所有这些结果都显示从今天下午开始执行的查询(我需要从早上开始执行查询)。 我在之前的问题中找不到任何内容(如果已经提出类似的问题,请指向我)。 我看到了一些有关SQL Profiler的建议,但是我想Profiler仅在我已经开始跟踪时才可以帮助我(如果我错了,请更正我)。 有人可以建议我如何获取自早上以来已在数据库上执行的所有查询的列表(包括查询执行时间)。 [如果我还能以某种方式获得执行查询的用户的用户名,那将是有帮助的(不是必需的)

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.