Questions tagged «sql-server-2008-r2»

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


5
为什么将ALTER COLUMN设置为NOT NULL会导致大量日志文件增长?
我有一个表,其中有64m行,其数据占用磁盘上4.3 GB的空间。 每行大约是30个字节的整数列,外加一个NVARCHAR(255)用于文本的可变列。 我添加了一个NULLABLE列,具有data-type Datetimeoffset(0)。 然后,我为每一行更新了该列,并确保所有新插入的内容在该列中都放置了一个值。 一旦没有NULL条目,我就运行以下命令使我的新字段成为必填项: ALTER TABLE tblCheckResult ALTER COLUMN [dtoDateTime] [datetimeoffset](0) NOT NULL 结果是事务日志大小从6GB大幅增加到36GB以上,直到空间用完为止! 有谁知道SQL Server 2008 R2在做什么,以使这个简单的命令取得如此巨大的增长?

4
在2008 R2上优于SQL Server 2012的客观业务原因是什么?
我的公司正在决定是否要为新的数据库服务器购买SQL Server 2012 Denali或SQL Server 2008 R2。我正在寻找客观原因来选择一个。 我们的要求: 标准版(出于财务原因,并且不需要企业功能) OLTP工作负载(这意味着我们不需要新的窗口功能和列存储索引) 数据库大小10-100 GB 无需商业智能功能。只需要关系引擎 同步数据库镜像 目前,我知道以下原因: SQL Server 2012 Denali 最新版本 SQL Server 2008 R2 成熟的技术 我似乎找不到很多技术原因来偏爱一个。基本上,归结为选择能够成功运行的可靠技术,而不是可用的最新和最佳版本。 做出决定的客观原因是什么?

2
兼容性级别80的实际行为是什么?
有人可以让我对兼容模式功能有更好的了解吗?它的行为与我预期的不同。 据我了解兼容模式,这是有关各种版本的SQL Server之间的某些语言结构的可用性和支持。 它不会影响数据库引擎版本的内部工作。它将尝试阻止使用早期版本中尚不可用的功能和构造。 我刚刚在SQL Server 2008 R2中创建了一个兼容级别为80的新数据库。用一个int列创建一个表,并用几行填充它。 然后执行带有row_number()函数的选择语句。 我的想法是,由于row_number函数仅在2005年才引入,所以这会在compat 80模式下引发错误。 但是令我惊讶的是,这个方法很好。然后,可以肯定的是,仅当您“保存一些东西”时才评估兼容规则。因此,我为row_number语句创建了一个存储的proc。 存储的proc创建很好,我可以完美地执行它并获得结果。 有人可以帮我更好地了解兼容模式的工作方式吗?我的理解显然是有缺陷的。


5
SQL Server中的数据混淆
SQL Server中数据混淆的最佳实践是什么? 我们想在我们的UAT系统中使用掩盖的Production数据。 如果我们想快速进行并且混淆程度更高,应该采取什么方法?我正在考虑为人们的姓氏和姓争夺角色,但是如何呢?我应该自己创建一个函数还是可以使用任何预定义的函数?我不想花时间重新发明轮子:) 日期字段呢?例如,应该从整个表中随机选择出生日期并分配给记录,还是有更好的方法呢?

1
是否有GETDATE()的类似物返回DATETIME2
根据MSDN,Getdate(),GetUtcDate()和CURRENT_TIMESTAMP都返回DATETIME。我进行了简短测试,确认了: CREATE TABLE #t(T DATETIME2(7)); GO DECLARE @i INT ; SET @i=1; WHILE @i<10000 BEGIN ; INSERT #t VALUES(CURRENT_TIMESTAMP) ; SET @i=@i+1; END ; SELECT DISTINCT t FROM #t ORDER BY t ; --- 2013-01-28 13:23:19.4930000 2013-01-28 13:23:19.4970000 2013-01-28 13:23:19.5000000 2013-01-28 13:23:19.5030000 2013-01-28 13:23:19.5070000 2013-01-28 13:23:19.5100000 2013-01-28 13:23:19.5130000 (剪断) 是否有返回DATETIME2(7)的类似函数?

3
使用WHERE IN进行删除操作期间发生意外扫描
我有一个类似以下的查询: DELETE FROM tblFEStatsBrowsers WHERE BrowserID NOT IN ( SELECT DISTINCT BrowserID FROM tblFEStatsPaperHits WITH (NOLOCK) WHERE BrowserID IS NOT NULL ) tblFEStatsBrowsers有553行。 tblFEStatsPaperHits已获得47.974.301行。 tblFEStatsBrowsers: CREATE TABLE [dbo].[tblFEStatsBrowsers]( [BrowserID] [smallint] IDENTITY(1,1) NOT NULL, [Browser] [varchar](50) NOT NULL, [Name] [varchar](40) NOT NULL, [Version] [varchar](10) NOT NULL, CONSTRAINT [PK_tblFEStatsBrowsers] PRIMARY KEY CLUSTERED …

6
为什么添加TOP 1会显着降低性能?
我有一个相当简单的查询 SELECT TOP 1 dc.DOCUMENT_ID, dc.COPIES, dc.REQUESTOR, dc.D_ID, cj.FILE_NUMBER FROM DOCUMENT_QUEUE dc JOIN CORRESPONDENCE_JOURNAL cj ON dc.DOCUMENT_ID = cj.DOCUMENT_ID WHERE dc.QUEUE_DATE <= GETDATE() AND dc.PRINT_LOCATION = 2 ORDER BY cj.FILE_NUMBER 那给了我可怕的表现(就像从来没有想过要等待它完成一样)。查询计划如下所示: 但是,如果我删除,则会TOP 1得到一个看起来像这样的计划,它会在1-2秒内运行: 在下面更正PK和索引。 该事实TOP 1改变了查询计划并不让我感到吃惊,我只是有点惊讶,这使情况变得更糟了这么多。 注意:我已经阅读了这篇文章的结果,并了解了Row Goaletc 的概念。我很好奇的是如何去改变查询,以便它使用更好的计划。目前,我正在将数据转储到临时表中,然后从中提取第一行。我想知道是否有更好的方法。 编辑对于在事实结束后仍在阅读本文的人,这里还有一些其他信息。 Document_Queue-PK / CI是D_ID,它具有约5k行。 Correspondence_Journal-PK / CI为FILE_NUMBER,CORRESPONDENCE_ID,具有约140万行。 当我开始时,没有其他索引。我最后在Correspondence_Journal(Document_Id,File_Number)上写了一个

3
UAT和PROD服务器上执行计划的差异
我想了解为什么在UAT(运行3秒)与PROD(运行23秒)中执行相同查询会有如此大的差异。 UAT和PROD都具有准确的数据和索引。 查询: set statistics io on; set statistics time on; SELECT CONF_NO, 'DE', 'Duplicate Email Address ''' + RTRIM(EMAIL_ADDRESS) + ''' in Maintenance', CONF_TARGET_NO FROM CONF_TARGET ct WHERE CONF_NO = 161 AND LEFT(INTERNET_USER_ID, 6) != 'ICONF-' AND ( ( REGISTRATION_TYPE = 'I' AND (SELECT COUNT(1) FROM PORTFOLIO WHERE EMAIL_ADDRESS …

3
执行计划基础-哈希匹配混乱
我开始学习执行计划,并对哈希匹配的工作原理以及为什么在简单的联接中使用它感到困惑: select Posts.Title, Users.DisplayName From Posts JOIN Users on Posts.OwnerUserId = Users.Id OPTION (MAXDOP 1) 据我了解,顶部索引扫描的结果变为具有哈希功能,并且底部索引群集扫描的每一行都被查找。我了解哈希表至少在某种程度上是如何工作的,但是在这样的示例中,我对哪些值确切地被哈希感到困惑。 对我来说有意义的是,它们之间的公共字段id被散列了-但是,如果是这种情况,为什么还要散列一个数字呢?

1
数据库的简单或完整恢复模型?
什么时候应该使用完整恢复模型,什么时候应该对数据库使用简单恢复模型? 我一直使用完整恢复模式,因为它是默认模式,但今天我遇到了此错误: SQL Server的Microsoft OLE DB提供程序(0x80040E14)数据库'数据库名称'的事务日志已满。要找出为什么无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc列 特定的数据库实际上是服务器上最小,最不活动的数据库之一,因此我不知道该数据库上的日志如何充满,而不是其他数据库。 为了缩小日志并使数据库可再次访问,我使用以下命令将恢复模型从FULL更改为SIMPLE并缩小了逻辑文件日志 alter database myDbName SET recovery simple go dbcc shrinkfile('LOG FILE LOGICAL NAME', 100) go 它帮助,但现在我需要了解为什么它的帮助下,如何这种情况开始,如何防止这种情况在未来? 编辑: 每天晚上1点,我们都会对服务器上的每个数据库进行脚本化备份。这是由31行脚本完成的,其中最重要的部分是 set @Filename = 'D:\backup\' + convert(varchar, getDate(), 112) + ' - ' + @DBName + '.bak' set @Description = 'Full backup of database ' + …


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会继续消耗资源

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.