Questions tagged «sql-server-2008»

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

2
返回固定行数后查询暂停
我有一个视图,它可以快速(几秒钟)运行多达41条记录(例如TOP 41),但要花44分钟或更长的时间才能显示44条或更多条记录,如果使用TOP 42或运行,则结果会中等TOP 43。具体来说,它将在几秒钟内返回前39条记录,然后暂停近三分钟,然后返回其余记录。查询TOP 44或时,此模式相同TOP 100。 该视图最初是从基本视图派生的,仅在底部代码中添加了一个过滤器,即最后一个过滤器。如果我从基础链接子视图,或者用嵌入的基础代码编写子视图,似乎没有什么区别。基本视图仅在几秒钟内返回100条记录。我想我可以使子视图的运行速度与基础视图一样快,而不是慢50倍。有人看到过这种行为吗?关于原因或解决方案的任何猜测? 在我测试了所涉及的查询后的最后几个小时,这种行为一直是一致的,尽管在事情开始变慢之前返回的行数略有起伏。这不是新事物。我现在正在查看它,因为总运行时间是可以接受的(<2分钟),但是至少在几个月以来,我已经在相关的日志文件中看到这种暂停。 封锁 我从未见过查询被阻塞,即使数据库上没有其他活动(经sp_WhoIsActive验证),问题仍然存在。基本视图包括所有NOLOCK内容,这是值得的。 查询 这是子视图的简化版本,为简单起见,基本视图都已内联。它仍然显示出运行时间的跳跃,大约有40条记录。 SELECT TOP 100 PERCENT Map.SalesforceAccountID AS Id, CAST(C.CustomerID AS NVARCHAR(255)) AS Name, CASE WHEN C.StreetAddress = 'Unknown' THEN '' ELSE C.StreetAddress END AS BillingStreet, CASE WHEN C.City = 'Unknown' THEN '' ELSE SUBSTRING(C.City, 1, 40) END AS BillingCity, …


2
使用快照隔离功能,SQL Server数据库写入速度是否变慢?
我的系统中发生了很多僵局。 我想使用快照隔离来修复它们,但是我的DBA对此有保​​留。 他的关注点之一是快照隔离会减慢写入速度。这是因为它必须先写入缓存,然后再写入TempDb(行版本),然后才能返回到调用方。 “正常”写入可以只写入高速缓存,然后完成。 这是行版本控制的工作方式吗?还是比这更复杂?是否以某种方式并行执行这些操作? 还是快照隔离的写入速度较慢?

4
执行访问另一个SQL实例的存储过程
如果这个问题重复另一个已经提出的问题,我深表歉意。我搜索了几个小时,却没有找到适合我的情况。 期望的结果 使用SQL身份验证的用户具有Server1(默认实例)上的Database1的执行权限。用户执行存储过程,作为其过程的一部分,访问存储在Server1 \ Instance2上的数据库2。我希望它既安全又简单(两者都很重要)。 更多信息 我的Windows凭据可以访问两个实例(位于同一服务器上)。因此,我可以在登录时轻松执行存储过程。但是,我不想给用户我的访问权限。我还需要使用SQL登录名,因为该用户将不在域中。 我想要的是为存储过程提供仅针对该过程的访问级别。由于我是系统管理员,因此将为用户提供该过程所需的一切。如果我能做到这一点,我可能会为此目的创建一个帐户,而不是使用我的帐户,但是无论哪种方式都是安全的,因为我可以控制存储的proc的工作。 我尝试将“ WITH EXECUTE AS”语句放入存储的proc中,但无法获取Windows登录信息。当我将其放入时,编译存储的proc时会出现以下错误: 无法以用户“ domain \ jdoe”的身份执行,因为它不存在或您没有权限。 就像我说的,用户在两台服务器上都是sysadmin,所以我不确定它还需要什么。 我研究了以下内容: 可信任-我宁愿不公开我的数据库,这看起来很可怕 链接服务器-我不想授予额外的权限。我不信任其他数据库可以访问我的数据库,也不信任我的数据库可以访问所有其他数据库。 证书-这似乎很复杂而且很困难。除非我能找到一种非常简单的方法来做到这一点并加以维护,否则我不确定这样做是否值得。 所有权链接-再次令人恐惧。当我的目标是防止安全问题时,这似乎会引起更多的安全问题。 镜像用户-我什至在另一个服务器实例上创建了相同(显然是不同的SID)用户,并给了它相同的密码。不行 我觉得自己缺少明显的东西,但不确定是什么。由于我整天都在用头撞墙,所以我可能太近了以至于看不到它。如果有人可以帮我或指出正确的方向,我将不胜感激。我会说我已经阅读了很多MSDN文章(男孩,我讨厌他们-他们似乎从来没有告诉我我想知道什么)。我真正想要的是一个简单易学的教程,它将指导我如何进行操作。缺少这一点,即使是一般性的指示我需要走的方向也会有所帮助。

1
为什么建议人们不要通过视图进行更新
在大学期间,它不停地通过视图来更新表,而当我进入工作场所时,又告诉我们不要通过视图来更新数据库。 在何处/是否存在显着的性能影响?还是更多这样的情况,高级开发人员/ DBA告诉初级人员不要执行此操作,因为他们可能会由于不正确的联接而无意间造成严重破坏。 编辑 我正在使用MSSQL 2000-2008(取决于客户端的详细信息)

2
如果某些数据少于4000个字符,nvarchar(max)如何将数据存储在数据库中?
我必须开发一个CMS,以支持两种语言的英语,阿拉伯语。该CMS将是一种Article Publishing网站。在设计和分析时,我发现有些文章的长度超过8000个字符。我的表有一些列 PageID int, PageTitleEnglish nvarchar(200), PageTitleArabic nvarchar(200), PageDescEnglish nvarchar(500), PageDescArabic nvarchar(500), PageBodyEnglish nvarchar(max) PageBodyArabic nvarchar(max) 如果我将PageBody保留为nvarchar(4000),则限制为4000个字符,如果我必须存储阿拉伯语版本,则我需要16000个字节(因为阿拉伯语是Unicode,并且比ASCII占用3倍的空间)。 因此,我只剩下将PageBody定义为nVarchar(max)的选项,这从性能的角度来看是不利的。我的实际问题是,如果PageBody列中的某些数据少于4000个字符,它将比内联列中的数据或数据库中单独存储的数据少。 我也在Google上寻找了这个,但没有找到任何相关的答案以及在这种情况下如何提高性能。 欢迎为此类多语言CMS设计提供最佳实践建议。 我只需要支持两种语言,阿拉伯语和英语

2
无法删除SQL Server 2008 R2登录
几天前,我已经创建了一个SQL Server登录名。现在,我需要删除相同的内容。因此,我进入了SQL Server Management Studio =>安全=>登录名,并选择了要删除的登录名。它显示一条信息性消息,内容为 删除服务器登录名不会删除与登录名关联的数据库用户。要完成此过程,请删除每个数据库中的用户。可能有必要先将模式的所有权转让给新用户。 忽略此消息,当我确认删除过程时,出现致命错误,提示: 登录“ iis_login”的删除失败。(Microsoft.SqlServer.Smo) 执行Transact-SQL语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo) 此登录名是1个工作的所有者。您必须先删除或重新分配这些作业,然后才能删除登录名。(Microsoft SQL Server,错误:15170) 当登录拥有所有作业(根据以上消息)时,如何删除登录。 问候,尼尔文。

2
与DBA讨论服务器升级项目-常见问题
我更多地是网络/ Windows管理员,我的任务是监督SQL Server升级项目。我需要与DBA会面,并讨论他们的升级需求。我不想完全失明,所以我想我先问你们。我们正在从SQL Server 2008迁移到SQL Server 2008 R2,并可能在可能的情况下迁移到Windows Server 2008 R2。作为一名DBA,您对这种升级有何担忧?您想同时看到什么吗?

3
有没有简单的方法来触发单个镜像数据库的自动故障转移?
我在具有自动故障转移配置的高度安全的sqlserver2008-R2单个实例上拥有3个镜像数据库。有没有一种方法可以触发仅1个数据库的自动故障转移? 我想模拟数据库实际上无法访问的位置,而不仅仅是单击SSMS中的“故障转移”按钮。我可以将端点停止在主数据库上,但这会使所有3个数据库无法访问,因为它们使用相同的端点。 如何仅禁用1分贝?

6
围绕唯一索引最大16列的任何方式
根据CREATE INDEX文档: 单个组合索引键最多可以组合16列。 我们有一个约18列的表格,需要形成一个唯一的组合。该表对性能不敏感-我们很少更新值/插入记录。我们只需要确保避免重复记录即可...并认为我们可以施加一个简单的唯一性约束。 有任何想法吗?如果有更好的方法,我愿意完全避免使用唯一的索引/约束。

2
SQL磁盘安装建议-TempDB,Log DB,数据文件放置问题
我们有一个非常活跃的数据库服务器,上面运行着各种应用程序。最繁忙的两个是Laserfiche数据库,该数据库全天进行文档扫描和工作流处理(平均大约每秒2800个批处理请求),还有一个黑莓服务器应用程序可路由电子邮件。还有大约25个其他小型应用程序数据库。 我们是政府机构,因此仅获得单个DB服务器许可证的预算。 最近,我们获得了SAN,以解决磁盘争用问题。 因此,当前,我们在其自己的磁盘(raid 1镜像对)上运行了TempDB,并且已将事务日志和数据文件移至SAN。事务日志放在一个逻辑位置,数据文件放在另一个逻辑位置。从物理上讲,它是相同的阵列,但它是由RAID 1 + 0配置中的总共14个主轴(磁盘)组成的阵列。 一个非常强大的SAN-并且运行情况要好得多。队列长度减半。 就在今天,我们还获得了另一种选择。如果我们当前在文件服务器上需要它,我们也可以有一个4磁盘阵列。我知道通常建议在两个单独的阵列上使用MDF和LDF,但是在我们这种情况下,唯一的方法是将数据或事务日志从SAN移到配置为Raid 5的4磁盘阵列上。请记住,它们是当前位于单独的逻辑卷中,但共享相同的物理阵列。 从臀部射击我觉得将MDF和LDF组合在一起放在14主轴突袭1 + 0阵列上可能和将它们与4主轴突袭5阵列中的一个分开一样好。但是,我不会在这里问我是否是磁盘逻辑专家。两种选择都使用基本相同的15k SAS磁盘-即每个主轴基本相同。 因此,本质上,问题是。通过将数据或日志移动到它自己的4轴raid 5阵列上,在配置为raid 1 + 0的单个14主轴阵列上具有MDF / LDF是否会得到任何显着的改善(或根本没有改善)? 有什么想法吗? 更新信息: 我还将注意到,当前“日志”卷上的平均队列长度始终保持在0.55左右。数据量的平均队列长度很少超过0.01(通常为0.00) sys.dm_io_virtual_file_stats查询结果: <table> <tr> <td>database id</td> <td>Volume</td> <td>io_stall_read_ms</td> <td>num_of_reads</td> <td>avg_read_stall_ms</td> <td>io_stall_write_ms</td> <td>num_of_writes</td> <td>avg_write_stall_ms</td> <td>io_stalls</td> <td>total_io</td> <td>avg_io_stall_ms</td> </tr> <tr> <td>25</td> <td>h</td> <td>175086</td> <td>1411</td> <td>124</td> <td>69</td> <td>41</td> <td>1.6</td> …

2
没有参数的EXEC()和sp_executesql之间的区别?
我刚刚了解了新的sp_executesql存储过程。我喜欢这样一种事实,那就是可以在SQL Server中执行参数化的代码。 但是,我想知道没有任何参数时使用sp_executesql存储过程与直接调用EXEC之间有什么区别。另外,有性能暗示吗? exec('select * from line_segment') exec sp_executesql N'select * from line_segment' 此外,2005年和2008年之间是否有区别?还是它们处理这些问题相同?

3
SSMS和@@ variable扩展中的SQLCMD模式
将SQLCMD模式与SSMS一起使用时(不是从命令行使用),是否可以将当前服务器和实例分配给变量?这不同于分配普通的TSQL变量。 问题定义 我想使用SQLCMD的变量扩展功能来替代我们部署脚本中的特定于环境的值,而不是我已经走进的现有tsql字符串构建mash。除了当前环境之外,使用SQLCMD处理部署已经非常顺利。 -- -- define 2 sqlcmd variables that will be expanded in scripts -- :setvar dbServer "DEVA2\DEV2" :setvar dbNotServer @@servername SELECT '$(dbServer)' AS hard_coded_value , @@servername AS [servername] , '$(dbNotServer)' AS dbNotServer 并产生以下结果。 hard_coded_value servername dbNotServer DEVA2\DEV2 DEVA2\DEV2 @@servername Meat Loaf说3分之2不错,但我宁愿3分之3的解决方案。当该脚本被部署到测试服务器上时,我不想信任编辑脚本的部署人员。 如果使用SQLCMD的唯一​​解决方案是完全从命令行调用脚本,那么我可以接受,但由于我对使用SQLCMD持绿色态度,因此想将其抛在这里。 所需的输出 :setvar dbNotServer @@servername SELECT '$(dbNotServer)' …

1
有人可以解释Opendatasource / Openrowset的神奇之处吗?
从excel文件(或ms-access DB)中提取信息时,我通常使用如下所示的内容: SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=C:\test.xls;Extended Properties=''EXCEL 12.0;HDR=NO;IMEX=1'' ')...[Sheet1$] 有时可以。有时并非如此。 有谁知道设置的指南? 我知道temp文件夹,我知道下载正确的驱动程序,我知道扩展属性,我知道没有打开文件。虽然有时候,我仍然得到- 链接服务器“(null)”的OLE DB提供程序“ Microsoft.ACE.OLEDB.12.0”返回消息“未指定的错误”。 我昨天遇到了这个问题。我重新启动了机器-无法正常工作。然后再次重新启动我的实例,然后重新启动!神奇地奏效了。 因此,这就是我的问题-当出现令人敬畏的“未指定错误”时,您需要检查什么,以确保所有星星都在工作中。


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.