Questions tagged «sql-server»

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

2
持续扫描需要0秒或2-3分钟
像下面这样的查询(保证不会返回任何行)在我们的其中一台服务器上花费了0到160秒的时间: select col1, col2, col3 from tab1 where 0 = 1 两周前,这种情况每隔48小时发生了六次。上周,同一查询花费了约0秒。我有应用程序SQL的日志,但尚未发现任何可疑对象。此外,我认为顶级0/0 = 1的类型查询从未命中数据页,因此它应该能够抵抗行/页/表级数据锁吗?任何(已知)SQL都不会涉及该架构。 由于问题不一致,并且服务器承受的负载非常重,因此我想在附加SQL事件探查器之前了解发生的情况的理论。在这些延迟期间,其他查询可以正常运行。应用程序中的一个已知问题是大量动态创建的SQL查询-在48小时内大约有200k唯一查询,总共850k(记录的)查询,这会引起这样的问题吗? 该服务器运行SQL Server 2005标准版,96 GB RAM,SAN上的磁盘和4个CPU / 16核。数据库文件和文件组已经过优化,应该没有问题(但是我们正在分别研究)。 任何在哪里看的指针都将不胜感激。 编辑:完美!重播查询以添加执行计划,这花了1分钟35秒。这是执行计划和显示查询持续时间的屏幕截图: 编辑2:统计第二次运行的时间详细信息。现在似乎一直很慢,因此我们将附加探查器和perfmon: SQL Server Execution Times: CPU time = 0 ms, elapsed time = 97402 ms. SQL Server parse and compile time: CPU time = 0 ms, …

1
服务帐户使用数据库邮件需要什么权限?
我有一个在托管服务帐户下运行的SQL Server 2012实例。我已经使用一个帐户配置了数据库邮件,并尝试发送测试电子邮件,但是服务器的事件日志中出现了一些错误: 数据库引擎实例= MYINSTANCE;邮件PID = 2132;错误消息:对数据库的更新失败。原因:对对象'sysmail_logmailevent_sp',数据库'msdb',模式'dbo'的EXECUTE权限被拒绝。 数据库引擎实例= MYINSTANCE;邮件PID = 2212; 异常类型:Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException消息:数据库读取失败。原因:对对象'sp_readrequest',数据库'msdb',模式'dbo'的EXECUTE权限被拒绝。数据:System.Collections.ListDictionaryInternal TargetSite:Microsoft.SqlServer.Management.SqlIMail.Server.Objects.QueueItem GetQueueItemFromCommand(System.Data.SqlClient.SqlCommand)帮助链接:NULL来源:DatabaseMailEngine 如果我使运行SQL Server的帐户成为sysadmin,则该错误消失,邮件成功发送。但是,我所做的所有研究都表明,赋予此帐户数据库DatabaseMailUserRole角色msdb应该足够。我这样做了,仍然收到相同的错误。 我在BOL中查看了一下,但找不到任何东西。

1
mdf和ldf的可用空间与数据库的可用空间不匹配
在SSMS中,我看到了文件大小相关的属性,并在下面找到了一个数据库的详细信息。此处的值与其他属性不匹配。此处mdf,ldf的大小和总大小与每个窗口下的其他值匹配。但是,如果添加了mdf和ldf的可用空间,则它不等于收缩数据库窗口中显示的可用空间和数据库属性中显示的可用空间。对于任何数据库都是如此。为什么会这样呢?请任何人解释这背后的逻辑? 在数据库属性下: 大小:91.31 MB 可用空间:13.40 MB 在数据库文件属性下: mdf大小:17 MB ldf大小:75 MB 在收缩数据库下: 当前分配的大小:91.31 MB 可用空间:13.40 MB 在收缩文件下,用于数据文件: 当前分配的大小:16.38 MB 可用空间:12.63 MB 在收缩文件下-用于日志文件: 当前分配的大小:74.94 MB 可用空间:55.62 MB

2
sp_reset_connection花很长时间执行的可能原因是什么?
sp_reset_connection从SQL Server Profiler看,为什么系统存储过程要花几毫秒的时间来执行? 我从使用SQL Server Profiler的生产系统中进行了简单的跟踪,然后使用SqlNexus对其进行了分析。SqlNexus指示sp_reset_connection具有最高的累积持续时间-占总跟踪的33%。观察到的持续时间为0-7秒(12到6,833,270微秒),但平均为0.956s。 我了解到池连接被重用时会调用sp_reset_connection。我已经看到有人暗示这可能是由于无关的痕迹而发生的,但事实并非如此。 我读过了 了调用sproc时服务器在做什么,但是我不认为在这种情况下任何问题都会出现-代码不会留下未清除的开放式事务或庞大的临时表。 我也看着 /server/199974/sp-reset-connection-taking-a-long-time-to-run,但这没有帮助。 编辑(2013-12-23): 在所有情况下,读和写均为0,CPU几乎始终为0(仅两个实例,两个非零CPU都在16ms处)。

3
从sql查询结果中复制大量数据
在我的sql server 2008中,运行查询后的数据返回量非常大,以百万计。我尝试复制,但是它给出了异常sql内存错误。您能告诉我们如何复制整个数据并将其粘贴到Excel中吗? 我不想将其导出到txt文件,因为数据没有对齐。所以我想手动复制并将其粘贴到Excel中。请让我知道该解决方案

1
SentryOne Plan Explorer是否将UDF中的读数计数?
我有这样的查询: select dbo.fn_complexFunction(t.id) from mytable t 在SQL Sentry Plan Explorer中,我注意到我必须运行Get Estimated Plan才能使查询计划包括UDF。 运行“获取实际计划”时,似乎逻辑读取和其他指标未包括UDF中发生的操作。在这种情况下,是否是使用Profiler的唯一解决方法?

4
SQL Server已启动,但未在任何端口上侦听
我新安装了SQL Server2012。尚未创建数据库。我可以使用sa / password打开Management Studio。Binn \ sqlservr.exe作为服务启动,我可以在服务列表中看到它已启动。但是,它没有监听1433端口,甚至没有监听默认的任何端口,如下所示: tasklist|find /I "sql" 我有: sqlservr.exe 5668 Services 0 40,112 K 我认为其中5668是PID。然后要获取PID =“ 5668”正在侦听哪个端口: netstat -ano | find /I "5668" 但是除了空白我什么都没有。另一方面,在搜索此站点中的帖子之后,我仔细检查了我的SQL Server配置:开始->所有程序-> Microsoft SQL Server 2012->配置工具-> SQL Server配置管理器-> SQL Server SQL Native Client 11.0配置->客户端协议-> TCP / IP->默认端口1433。有3种服务:SQL Server(MyInstanceName),SQL Server代理(MyInstanceName)和SQL Server浏览器。最后两个停止。 默认情况下,在启用SQL Server配置管理器-> SQL Server网络配置-> …


1
建议使用STATISTICS_NORECOMPUTE
我最近参与了维护一组具有一些有趣的索引问题的数据库。使我最恼火的因素之一是开发,测试,模型和生产机器之间的指标差异。由于差异使调整查询变得相当困难,因此将它们同步起来是我的第一个项目。 在比较测试和模型环境时,我注意到模型环境中的大多数索引都STATISTICS_NORECOMPUTE设置为,ON而测试中的索引没有设置。在所有环境中,每天都有一项工作来更新所有数据库的统计信息。 我从来没有处理过STATISTICS_NORECOMPUTE,所以这是我的问题。处理此设置时是否有最佳做法?如果我要在一天结束时进行统计信息更新,最好打开STATISTICS_NORECOMPUTE所有环境中的所有索引吗?还是有充分的理由不这样做? 编辑:我发现了金佰利特里普的关于这一主题的博客之一在这里,似乎表明STATISTICS_NORECOMPUTE应谨慎充其量只能使用。但是我仍然担心在全球范围内将其关闭。有没有人尝试过,他们经历了什么?

2
在SQL Server代理中运行Powershell脚本时出错
我有一个通过SQL Server代理运行的SQL作业(正在运行SQL Server 2012 Enterprise)。作业的最后一步是运行位于网络共享上的应用程序。不幸的是,我不知道应用程序所在的文件夹的名称(该文件夹是版本号),因此我正在使用PowerShell查找它: set-location "\\server\companydocuments\MyApp\Application Files\" $name = Get-ChildItem | sort name -desc | select -f 1 | select name cd $name.name & ".\Application.exe" 如果我在SQL Server上打开PowerShell窗口,则可以正常工作。当我在SQL Server代理中运行此命令时,出现以下错误: A job step received an error at line 1 in a PowerShell script. The corresponding line is 'set-location "\\server\companydocuments\MyApp\Application Files\'" 我以为这可能是权限问题,所以我尝试在我的凭据(这是测试服务器,不是生产服务器)下运行SQL …

1
SQL中的最小记录条件
我已经写了一个脚本来测试此页面上的声明http://technet.microsoft.com/zh-cn/library/dd425070(v=sql.100).aspx,其标题为“何时汇总最小记录条件”最小记录不会或不会发生。 使用此脚本,我发现每种不同类型的插入的日志记录长度的总和如下: 堆空没有Tablock 60000 带有锁的堆空​​56000 堆非空无制表符60000 非空堆,带锁56000 堆加索引为空,没有制表符126188 堆加索引为空,带挂锁114188 堆加索引非空无选项卡锁138696 带有Tablock的堆加索引不为空112000 集群为空命令无制表符64168 集群空,带tablock 56168命令 群集为空无序无标签锁73388 空群集,无序,带有tablock 65388 群集非空无标签锁63912 带锁的群集非空55944 群集加索引为空,没有制表符124336 带有Tablock的簇加索引为空108336 群集加索引非空无选项卡锁123876 带Tablock的群集加索引不为空107924 其中一些数字似乎与technet页面上的表不匹配。特别是: 插入到空表和非空表之间的日志记录似乎没有什么区别,但是该页面声称,插入到没有制表符的非空集群中时,应该有完整的日志记录 使用tablock插入具有and index的堆或群集似乎确实减少了日志记录,但是该页面声称应该有完整的日志记录。 使用insert的SELECT INTO方法时,fn_dblog中没有要插入其操作的行,但是该页将该方法列为应具有表中所述行为的批量加载操作。 作为参考,它在SQL Express数据库上运行,当我运行DBCC TRACESTATUS(610)时,所有内容均为0。 谁能帮助解释为什么我会看到这些差异? 供参考,代码如下: SET NOCOUNT ON CREATE TABLE numbers (num INT) CREATE TABLE numbersUnordered (num INT) Declare @cnt int …

1
授予SELECT用户并将其添加到db_datareader角色之间有区别吗?
我被要求为数据库中的所有表授予SELECT,INSERT并授予UPDATE给定的用户。我最终将用户添加到db_datareader,并给予他们INSERT与UPDATE在数据库级别。 但这让我思考,SELECT在数据库级别授予用户权限或将其添加到db_datareader角色之间有什么区别(如果有)?是否有任何一种最佳实践或另一种最佳实践?

1
变更跟踪内部结构是否从SQL Server 2008更改为2012?
在解决与断开连接的设备与中央数据库服务器同步的问题时,在服务器上升级到SQL Server 2012之后,我们遇到了问题。看来CHANGE_TRACKING_MIN_VALID_VERSION返回的值比应有的值高1(或至少比升级前的值高)。 我一直在通过Arshad Ali的出色案例来研究如何建立一个简单的示例。 我已经从#1到#5运行脚本,以在SQL Server 2008和2012环境中在Employee表中插入,删除和更新一行。 在2008年,以下语句返回0: SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('Employee')) 在2012年,它返回1。 在测试中通过其他几个脚本(6-8)工作时,我将保留期设置为1分钟,以期希望执行清除操作。我离开了一天,显然它跑了一整夜。 在2008年实例中,CHANGE_TRACKING_CURRENT_VERSION和CHANGE_TRACKING_MIN_VALID_VERSION相等(11)。在2012年实例中,CHANGE_TRACKING_MIN_VALID_VERSION(12)比CHANGE_TRACKING_CURRENT_VERSION(11)高一。当数据库长时间闲置时,这可能会对同步过程产生影响。而且我们发现进程可能陷入循环,尤其是在执行以下测试以确定是否需要重新初始化而不是同步的情况下: IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'dbo.Employee')) > @sync_last_received_anchor RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''... 有没有其他人经历过这种行为改变?有人解释吗?

1
IO_STALL的问题和理解
我每5分钟从sys.dm_io_virtual_file_stats中收集IO_STALLS,然后做一个增量查看哪些文件受IO影响最大。 在5分钟内,我得到了5826331毫秒的增量,即97分钟。 我对此有些困惑,这是说一次操作开始于97分钟之前才刚刚完成,因此记录了等待时间吗? 谢谢 根据要求添加了代码: /* USE [SysDBA] GO */ /****** Object: Table [dbo].[DISKIOPS] Script Date: 04/07/2013 11:40:15 ******/ /* DROP TABLE [dbo].[DISKIOPS] GO */ --Create the table /****** Object: Table [dbo].[DISKIOPS] Script Date: 04/07/2013 11:40:15 ******/ /* SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO …

1
SqlPackage不从配置文件中提取变量
我想使用.dacpac和sqlpackage.exe升级数据库 这是我运行sqlpackage的方法: SqlPackage.exe /Action:Publish /SourceFile:"my.dacpac" /Profile:"myprofile.publish.xml" 我得到的错误是: *在目标脚本中未定义以下SqlCmd变量:foo。 我已验证myprofile.publish.xml文件确实包含该var: <ItemGroup> <SqlCmdVariable Include="foo"> <Value>bc\local</Value> </SqlCmdVariable> 我还验证了创建dacpac的项目确实可以使用Visual Studio在Visual Studio中成功发布 myprofile.publish.xml 我还能缺少什么? (我正在使用SQL Server 2012)

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.