Questions tagged «sql-server-2008-r2»

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


1
SQL Server中的SLEEP_TASK等待类型-它表示什么?
我以前没有看过SLEEP_TASK等待类型,今天我似乎收到了很多。 我不是官方的DBA,而是知道某些DBA知识的SQL Server开发人员。上周末我们将服务器升级到10.52.2500.0-R2SP1。 我在网上可以找到的所有信息都表明SLEEP_TASK服务器正在等待某种内部过程完成。我没有任何阻塞或任何后台进程(如检查点或幽灵清理)运行,因此我有些困惑。 以前有没有人看过这种等待类型,如果可以的话,您能告诉我原因是什么吗?

4
分配更多的CPU和RAM后,SQL Server的性能降低
我们在虚拟Windows 2008 R2服务器上运行SQL Server 2008 R2(10.50.1600)。将CPU从1核升级到4,将RAM从4 gb升级到10 gb后,我们注意到性能会变差。 我看到一些观察结果: 现在,运行时间少于5秒的查询现在耗时200秒以上。 使用sqlservr.exe作为罪魁祸首将CPU固定在100。 具有460万行的表上的select count(*)耗时90秒。 服务器上运行的进程没有更改。唯一的变化是增加了cpu和ram。 其他sql服务器具有静态分页文件,该服务器设置为可单独管理该文件。 有人遇到过这个问题吗? Per sp_BlitzErik,我跑了 EXEC dbo.sp_BlitzFirst @SinceStartup = 1; 给我这些结果。

4
用sp_开头用户存储过程的名称仍然错误吗?
我的一位同事在我们的SQL Server 2008 R2数据库中命名了一个存储过程sp_something。当我看到此消息时,我立即想到:“那是错误的!” 并开始在我的书签中搜索此在线文章,该文章解释了错误的原因,因此我可以向我的同事提供解释。 在这篇文章(由Brian Moran撰写)中,解释了给存储过程一个sp_前缀使SQL Server可以在master数据库中查看已编译的计划。由于sp_sproc不在此处,因此SQL Server将重新编译该过程(并为此需要一个专用的编译锁,从而导致性能问题)。 本文提供了以下示例,以显示两个过程之间的区别: USE tempdb; GO CREATE PROCEDURE dbo.Select1 AS SELECT 1; GO CREATE PROCEDURE dbo.sp_Select1 AS SELECT 1; GO EXEC dbo.sp_Select1; GO EXEC dbo.Select1; GO 您运行此程序,然后打开Profiler(添加“存储过程-> SP:CacheMiss事件”)并再次运行存储过程。您应该看到两个存储过程之间的区别:sp_Select1存储过程将比存储过程生成一个更多的SP:CacheMiss事件Select1(本文引用了SQL Server 7.0和SQL Server 2000。) 当我在SQL Server 2008 R2环境中运行该示例时SP:CacheMiss,两个过程都得到相同数量的事件(在tempdb和另一个测试数据库中)。 所以我想知道: 我可以在执行示例时做错什么吗? sproc sp_something在新版本的SQL Server中,“不命名用户” adagium是否仍然有效? 如果是这样,是否有一个很好的示例显示其在SQL …

2
PK索引中的列顺序重要吗?
我有一些具有相同基本结构的非常大的表。每个都有一个RowNumber (bigint)和DataDate (date)列。每天晚上使用SQLBulkImport加载数据,并且从未加载过任何“新”数据-它是历史记录(SQL Standard,不是Enterprise,因此没有分区)。 因为每个数据位都需要绑定到其他系统,并且每个RowNumber/DataDate组合都是唯一的,所以这就是我的主键。 我注意到,由于我在SSMS Table Designer中定义PK的方式,RowNumber第一和DataDate第二列出了。 我还注意到,我的碎片始终非常高,高达〜99%。 现在,由于每个DataDate索引仅出现一次,所以我希望索引器每天都添加到页面中,但是我想知道它是否实际上是RowNumber首先基于索引编制的,因此是否需要转移其他所有内容? Rownumber不是一个标识列,它是一个由外部系统生成的int(很糟糕)。它在每个开始时重置DataDate。 示例数据 RowNumber | DataDate | a | b | c..... 1 |2013-08-01| x | y | z 2 |2013-08-01| x | y | z ... 1 |2013-08-02| x | y | z 2 |2013-08-02| x | y | z …

2
I / O请求耗时超过15秒
通常,我们每周的完整备份大约需要35分钟,而每天的差异备份大约需要5分钟。自星期二以来,每天花了将近4个小时才能完成工作,远远超出了要求。巧合的是,这在我们有了新的SAN /磁盘配置后就开始发生。 请注意,该服务器正在生产中运行,我们没有任何总体问题,它运行平稳-除了IO问题主要体现在备份性能方面。 在备份期间查看dm_exec_requests时,备份一直在等待ASYNC_IO_COMPLETION。啊哈,所以我们有磁盘争用! 但是,MDF(日志存储在本地磁盘上)和备份驱动器都没有任何活动(IOPS〜= 0-我们有足够的内存)。磁盘队列长度也约为0。CPU徘徊在2-3%左右,也没有问题。 SAN是Dell MD3220i,该LUN由6x10k SAS驱动器组成。服务器通过两条物理路径连接到SAN,每条物理路径通过一个单独的交换机,并具有到SAN的冗余连接-共有4条路径,其中两条在任何时间都处于活动状态。我可以通过任务管理器验证两个连接均处于活动状态-完美地平均分配负载。两种连接都运行1G全双工。 我们曾经使用巨型帧,但是我已禁用它们以排除此处的任何问题-无需更改。我们有另一台服务器(相同的OS + config,2008 R2)已连接到其他LUN,并且没有任何问题。但是,它不运行SQL Server,而只是在它们之上共享CIFS。但是,它的LUN首选路径之一与麻烦的LUN在同一SAN控制器上-因此我也排除了这一点。 尽管存在以下问题,但运行几个SQLIO测试(10G测试文件)似乎表明IO很不错: sqlio -kR -t8 -o8 -s30 -frandom -b8 -BN -LS -Fparam.txt IOs/sec: 3582.20 MBs/sec: 27.98 Min_Latency(ms): 0 Avg_Latency(ms): 3 Max_Latency(ms): 98 histogram: ms: 0 1 2 3 4 5 6 7 8 9 10 11 12 …

2
将SQL Server实例根目录放在单独的驱动器上是否有用?
我知道在安装SQL Server时可以更改许多默认路径,通常在安装时,我将数据和日志文件夹更改为单独的驱动器(通常为D和E),但是最近我得到了一个预安装的计算机正在运行实例名称(而不是默认名称),并且他们已将实例根目录与mdf文件一起配置在D驱动器上。这意味着在通常只有一个文件夹和数据库文件的相对干净的驱动器上,我现在也已经完全安装了SQL Server二进制文件。 即我现在有以下内容: C:\Program Files\Microsoft SQL Server\ --Base Install D:\Microsoft SQL Server\MSSQL10_50.MyInstance --Instance Binaries D:\Microsoft SQL Server\MSSQL10_50.MyInstance\MSSQL\DATA --Data Files E:\Microsoft SQL Server\MSSQL10_50.MyInstance\MSSQL\LOGS --Log Files 通常我会在类似的地方运行: C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\ --Base Install & Default Instance Binaries D:\MSSQL\DATA --Data Files E:\MSSQL\LOGS --Log Files 我可以理解为什么有必要使用单独的实例二进制文件夹,但是我看不到为什么将所有这些二进制文件放在单独的驱动器上会很有用。 谁能告诉我为什么这样做是合理的?也许这根本没有什么不同?对我来说,这似乎很不整洁。

3
评估合理的缓冲池大小的确定方法是什么?
我试图提出一种理智的方法来了解max server memory (mb)设置是否合适(应该设置得更低还是更高,或者保持原样)。我知道max server memory (mb)应该始终足够低以为操作系统本身等留出空间。 我正在查看的环境有几百台服务器;我需要一个可靠的公式来确定缓冲池的当前大小是否合适,因为RAM是按分配给每个服务器的每GB的成本来计算的。整个环境已虚拟化,分配给VM的“物理” RAM可以轻松更改。 我现在正在查看一个特定的SQL Server实例,它的PLE为1,100,052秒,相当于12.7天(服务器已启动的时间)。该服务器的最大服务器内存设置为2560MB(2.5GB),其中实际仅提交了1380MB(1.3GB)。 我读过几个项目,包括一个由Jonathan Keheyias(职位),另一个由保罗·兰德尔(岗位),和其他几个人。Jonathan提倡监视每4GB缓冲池中的PLE在300以下,因为它太低了。对于上述SQL Server实例,300 * (2.5 / 4) = 187目标PLE确实非常低,低于300。此实例具有290GB的SQL Server数据(不包括日志文件),仅用于集成测试。假设在过去的12天代表该服务器的典型用法的,我想说的max server memory (mb)设置可能会降低。 在规模的另一端,我有另一台集成测试服务器,其PLE为294,其max server memory (mb)设置仅为1GB。该服务器仅具有224MB的SQL Server数据(不包括日志),并且正在运行某些BizFlow数据库。该服务器可能会受益于更高的max server memory (mb)设置。 我正在考虑为可能分配过多内存的目标提供一个良好的起点,其中包括: SELECT RamMB = physical_memory_in_bytes / 1048576 , BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576 , BufferPoolCommitTargetMB = …

4
EF Code First对所有字符串使用nvarchar(max)。这会损害查询性能吗?
我有一些使用“实体框架代码优先”创建的数据库;应用程序正常运行,总的来说,我对Code First的功能感到非常满意。根据需要,我首先是一名程序员,然后是DBA。我正在阅读有关DataAttributes的内容,以在C#中进一步描述我想要数据库做什么;我的问题是:将这些nvarchar(max)字符串放在表中会给我带来什么惩罚(请参见下面的示例)? 此特定表中有几列;在C#中,它们的定义如下: [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int ID { get; set; } public string Name { get; set; } public string Message { get; set; } public string Source { get; set; } public DateTime Generated { get; set; } public DateTime Written { get; set; } 我希望根据名称,来源,生成的和书面查询和/或排序。我希望“名称和源”的长度为0至50个字符,偶尔最多为150个字符。我希望此表的开头很小(<100k行),但随着时间的推移会显着增长(> 1m行)。显然,消息可能大小不一,可能不会被查询。 我想知道,是否将我的“名称”和“源”列定义为nvarchar(max)当我从未期望它们大于150个字符时对性能产生影响?

3
将列添加到生产表
在SQL Server 2008 R2上的大型生产表中添加列的最佳方法是什么?根据微软在线书籍: ALTER TABLE中指定的更改将立即实施。如果更改需要修改表中的行,则ALTER TABLE将更新行。ALTER TABLE在表上获取一个模式修改锁,以确保在更改期间没有其他连接甚至引用该表的元数据,除非联机索引操作最后需要非常短的SCH-M锁。 (http://msdn.microsoft.com/zh-cn/library/ms190273.aspx) 在具有数百万行的大型表上,这可能需要一段时间。停电是唯一的选择吗?处理这种情况的最佳方法是什么?

2
急停阀芯指示哪些问题
当前在SQL Server 2008 R2上运行 我试图提高UPDATE语句的性能。我注意到弹出的计划中有一个渴望假脱机操作。我对假脱机操作的理解非常基础-他们在更新期间为表创建了临时存储。 我还知道,尽管它们可以防止更糟的执行时间,但急切的假脱机通常表明表结构和/或查询语句存在潜在的问题。 我的问题很简单:当您在查询计划中看到一个急切假脱机时,您首先要解决什么问题? 我会分析每一个我们的系统的一部分,以提高性能-我只是在寻找指导,我应该开始。

2
当表引用自身时,如何编写查找所有循环引用的查询?
我有以下架构(名称已更改),无法更改: CREATE TABLE MyTable ( Id INT NOT NULL PRIMARY KEY, ParentId INT NOT NULL ); ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id); 也就是说,每个记录都是另一个记录的子级。如果一条记录ParentId等于它的Id,则该记录被视为根节点。 我想运行查询,将找到所有循环引用。例如,与数据 INSERT INTO MyTable (Id, ParentId) VALUES (0, 0), (1, 0), (2, 4), (3, 2), (4, 3); 查询应返回 Id | Cycle 2 | 2 …

7
尝试查找值最后一次更改的时间
我有一个具有ID,值和日期的表。该表中有许多ID,值和日期。 记录会定期插入此表中。ID将始终保持不变,但有时值会更改。 如何编写一个查询,该查询将为我提供ID以及最近一次更改值的时间?注意:该值将始终增加。 从此样本数据中: Create Table Taco ( Taco_ID int, Taco_value int, Taco_date datetime) Insert INTO Taco Values (1, 1, '2012-07-01 00:00:01'), (1, 1, '2012-07-01 00:00:02'), (1, 1, '2012-07-01 00:00:03'), (1, 1, '2012-07-01 00:00:04'), (1, 2, '2012-07-01 00:00:05'), (1, 2, '2012-07-01 00:00:06'), (1, 2, '2012-07-01 00:00:07'), (1, 2, '2012-07-01 00:00:08') …

2
将列从NOT NULL更改为NULL-到底发生了什么?
我们有一个包含2.3B行的表。我们想将列从NOT NULL更改为NULL。该列包含在一个索引中(而不是聚集索引或PK索引)。数据类型没有改变(它是一个INT)。只是可空性。声明如下: Alter Table dbo.Workflow Alter Column LineId Int NULL 在停止该操作之前,该操作花费了超过10(我们甚至还没有让它运行完毕,因为这是一项阻塞操作,并且花费了太长时间)。我们可能会将表复制到开发服务器,以测试实际需要多长时间。但是,我很好奇,是否有人知道从NOT NULL转换为NULL时SQL Server在做什么?另外,是否需要重建受影响的索引?生成的查询计划不会指示正在发生的事情。 有问题的表是群集的(不是堆)。

1
在实时产品表上更改varchar的长度
我有一个与生产应用程序一起使用的MS SQL Server 2008 R2 DB服务器。 该应用程序的一项新增强功能现在需要varchar(100)增加表中一列的长度。 是否可以在不影响当前数据的情况下增加生产数据库中此现有列的长度? 是否必须在下班时间完成此更改,以避免服务中断?

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.