Questions tagged «sql-server-2005»

SQL Server 2005(主要版本9.00.xxxx)。还请标记sql-server。

4
SQL Server 2005/8查询优化提示
我正在教育一个团队编写更好的SQL Server查询,并且想知道人们对提高性能的最佳提示是什么。 例如,我曾经有一个DBA坚持认为count(*)的性能会比count(1)差(我不知道她是对的还是对最新的查询优化器仍然有效)。 我应该告诉团队尝试哪些简单的事情,并始终使用或避免使用?理想情况下,我正在寻找能够(a)产生合理影响且(b)直截了当的陈述(1-2条陈述)的事物。

1
如何解决RESOURCE_SEMAPHORE和RESOURCE_SEMAPHORE_QUERY_COMPILE等待类型
我们试图找出运行缓慢的sql服务器查询从以下配置之一托管的服务器(大小为300 GB)中命中/获取数据的根本原因: Windows Server 2003 R2,SP2,企业版,16 GB RAM,12 CPU 32位 SQL Server 2005 SP4企业版32位。 我们已经通知企业升级到64位需要一个多月的时间。 但是对于当前问题,如果可以解决内存压力或最终得出结论以增加RAM,则我们正在尝试收集数据。 完成的操作:重新索引和更新统计信息适用于此数据库。 如下图所示,我们已经注意到过去5天在加载时间内运行的信号量等待类型: 以下查询后很少有信息:缓冲区大小= 137272 SELECT SUM(virtual_memory_committed_kb) FROM sys.dm_os_memory_clerks WHERE type='MEMORYCLERK_SQLBUFFERPOOL' 和以下每个查询的信号量内存= 644024 SELECT SUM(total_memory_kb) FROM sys.dm_exec_query_resource_semaphores 以下是从dm_exec_query_resource_semaphores和sys.dm_exec_query_memory_grantsdvv 收集的更多信息 因此,从上面收集的信息和每个SP_Blitz数据来看,资源信号似乎是问题所在。 与可用的16 GB RAM相比,是否为资源信号ID分配的内存'target_memory_kb'太低。 注意*运行8小时的每次分析“ target_memory_kb”始终小于1 GB,而可用的16 GB是多少? 这里可能是什么问题以及如何解决,请提出建议 谢谢


2
SQL Agent Powershell上下文参考
在我的新工作中,每个服务器上都有多个命名实例。例如 Server1 \ Dev Server1 \ DevIntegrated 服务器1 \质量检查 我的作品中有一个SQL PowerShell脚本,可以调用OS,调用它,Foo.exe但需要传递命令行参数(连接字符串)。每个实例上都将存在一个SQL Agent作业,其步骤为PowerShell类型,该步骤需要知道当前上下文是什么。即此执行从DevIntegrated开始。 我不希望每个脚本都以...开头 $thisInstance = "Dev" ...特别是因为在接下来的几个月中,当我们迁移到环境(新服务器和命名实例)时,我必须对其进行编辑。 如果启动SQLPS,则可以通过将Get-Location的结果切片和切块或运行来确定实例 (Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName 当SQL Agent启动PowerShell类型的作业时,它将在C:\ windows \ system32中启动,并且该Get-Location路由不起作用,因为它不在SQLSERVER上下文中。我可以更改为该上下文,但是我将位于SQL Server的“根目录”,并且不知道我应该在哪个实例中使用。Invoke-Sqlcmd由于相同的原因,使用路由也不起作用(从技术上讲,它在那里超时了)不是默认实例) 据我所知,我已经列举了所有可以进入工作日志的基本“内容”,但似乎没有任何显示 SQLSERVER:\SQL\Server1\DevIntegrated Get-ChildItem Get-Host Get-Location Get-Process Get-PSDrive Get-PSProvider Get-Service Get-TraceSource Get-Variable Get-Process似乎我可以使用它以及通过敲击实例和匹配spid来拼凑事物的一些巫术,但这听起来像是来自地狱的血腥骇客。我必须缺少一些基本的东西,有人可以阐明吗? 研究了PowerShell的替代方法 我调查了其他工作类型,但没有得到满意的解决方案。研究表明,SQL代理下列出的PowerShell为SQLPS,并通过右键单击该代理来启动它的实例,从而自动将我放到正确的位置。如前所述,只有当我将交互式代码粘贴到工作步骤中时,我才知道其中的区别。 作业类型的OS使我进入了相同的状态,因为我无法找到确定哪个实例将我放入命令外壳的方法。当然,我可以sqlcmd并获取的值,@@servername但是如果我知道启动sqlcmd的连接,则无需查询数据库;) 如果启用了TSQL,TSQL可能会起作用,xp_cmdshell但是我不确定它们是否已启用---政府工具,并且在使用非默认设置时可能会感到困惑。即便如此,我仍然沉迷于动态SQL,并失去了PowerShell提供的许多表达能力。 虽然有点麻烦,但我认为第一步要定义一个变量,然后将其传递给后续步骤,但是研究发现这篇文章处理多个作业步骤(BOL) 作业步骤必须是独立的。也就是说,作业无法在作业步骤之间传递布尔值,数据或数字值。但是,您可以使用永久表或全局临时表将值从一个Transact-SQL作业步骤传递到另一步骤。您可以使用文件将运行可执行程序的作业步骤中的值从一个作业步骤传递到另一作业步骤。 我不能使用常见的技巧,例如Foo.exe寻找众所周知的文件/环境变量/注册表设置,因为那样会阻止跨实例的并发执行。 …

3
查找孤立的用户
在SQL Server 2005中,有一种方法可以找到在服务器级别不存在的用户(在服务器级别已删除但在删除之前未与数据库解除关联的帐户)或未链接的用户(可能已在服务器级别删除了一个帐户,但未删除数据库级别,然后读取了该帐户,但从未清除过该数据库级别)。 我的服务器非常凌乱,如果要运行查询来查找这些服务器,那就太好了。

1
将SQL Server 2005升级到SQL Server 2012
我有一个以下测试环境: 虚拟机(Hyper-V) Windows Server 2008 R2 SP1(x64位) Windows SQL Server 2005 Developer Edition SP4(x64位)(默认实例名称) 设置了1个具有合并复制的数据库... 3个发布,每个都有2个订阅者。 我们正在测试升级到SQL Server 2012 Developer Edition(sp1)的过程。 我已经下载了64位SQL Server 2012 Dev的iso。(sp1)来自MSDN(完整许可副本),并且已开始沿升级路径进行。在开始检查不同条件的最后阶段之一中,我们遇到了一个奇怪的问题,如下所述: Rule "Upgrade architecture mismatch" failed. The CPU architectures of upgrading feature(s) are different. To upgrade these features, Setup architecture must be the same as the …

2
ETL:从200个表中提取-SSIS数据流或自定义T-SQL?
根据我的分析,我们数据仓库的完整维模型需要从200多个源表中提取。这些表中的某些将作为增量负载的一部分被提取,而另一些则将作为全负载。 需要注意的是,我们有大约225个具有相同模式的源数据库。 从我所看到的,在具有OLE DB源和OLE DB目标的SSIS中构建简单的数据流要求在设计时确定列和数据类型。这意味着仅用于提取,我最终将获得200多个数据流。 从可维护性的角度来看,这是我遇到的一个大问题。如果需要对提取代码进行某种彻底的更改,则必须修改200个不同的数据流。 另一个选择是,我编写了一个小脚本,该脚本读取要从一组元数据表中提取的源数据库,表名和列。该代码在多个循环中运行,并使用动态SQL通过链接服务器和OPENQUERY从源表中提取。 根据我的测试,这仍然不及将SSIS数据流与OLEDB源和目标一起使用的速度。所以我想知道我有什么样的选择。到目前为止的想法包括: 使用EZAPI以编程方式生成具有简单数据流的SSIS包。要提取的表和列将来自前面提到的相同的元数据表。 购买第三方软件(动态数据流组件) 解决此问题的最佳方法是什么?当涉及到.NET编程时,我是一个初学者,因此仅考虑基础知识所需的时间也是一个问题。

2
改用ARITHABORT ON的风险
我正在与一家供应商合作,安排他们提供核心应用程序,只要不修改核心应用程序,我就可以构建自己的扩展。它内置在ColdFusion中,可连接到SQL Server 2005数据库。 我构建的某些报告依赖于使用从核心表计算出的函数的视图,并且随着表的增大,报告变得非常慢。为了加快报告速度,我想使用索引视图。但是,在我的测试环境中创建了索引视图之后,核心应用程序无法再插入到核心表中(它返回了一条错误消息,这ARITHABORT是ON使用索引视图时所必需的)。 因此,似乎为了使用索引视图,SET ARITHABORT ON每当插入/更新核心表时,我都需要拥有核心应用程序。我在测试环境中运行了此命令: ALTER DATABASE MyDatabase SET ARITHABORT ON; 而且似乎工作正常。但是我的供应商说,由于应用程序具有成千上万的查询,因此该设置可能会中断其中一个查询,并且如果将来出现一些意外的数据库问题,他们会坚持要求我恢复默认设置。 是否有实际的查询会被打破SET ARITHABORT ON?在任何情况下都最好保留它OFF? TL; DR为了使新的索引视图生效,我需要ARITHABORT ON为整个数据库进行设置,但是我的供应商警告说,这将由我自己承担风险。实际上有风险吗?

1
大内存环境中的SQL Server TempDB行为
阅读这个问题使我想起了我前一段时间遇到的一个问题。 我们有一个具有512GB RAM的SQL Server,主数据库是450 GB。我们在TempDB中看到了很多动作(好吧,我认为这是“很多动作”-可能不是!)。我安装了演示版的RamDisk Plus服务器,创建了一个50GB的ramdrive,将其指向TempDB,并且根本看不到性能的提高。 是对TempDB的写入始终导致对磁盘的实际物理写入,还是由SQL Server缓存TempDB的写入以像Windows文件系统缓存一样延迟写入? 在这种情况下,虚拟磁盘毫无意义吗? 我知道SQL Server 6.5支持对TempDB-In-Ram,但很久以前就停止了它!

1
镜像-无法访问服务器网络地址
我已经安装了SQL Server 2008 R2。它包含三个实例。 默认(MSSQLServer) 第一个例子 第二审 所有这些都是作为网络服务登录。 默认实例是主体服务器,第一个实例是镜像,第二个实例是见证服务器 最初,我对主体数据库进行了完整备份和事务日志备份。通过保持相同的数据库名称将其还原到第一个实例,并且恢复状态为“不可恢复” 最后,我启动了镜像,并收到以下两条错误消息。

3
在一个列上选择DISTINCT,同时返回其他列?
我有一个查询,该查询使用三个查找表来获取我需要的所有信息。我需要DISTINCT为一列提供值,但是我还需要与之关联的其余数据。 我的SQL代码: SELECT acss_lookup.ID AS acss_lookupID, acss_lookup.product_lookupID AS acssproduct_lookupID, acss_lookup.region_lookupID AS acssregion_lookupID, acss_lookup.document_lookupID AS acssdocument_lookupID, product.ID AS product_ID, product.parent_productID AS productparent_product_ID, product.label AS product_label, product.displayheading AS product_displayheading, product.displayorder AS product_displayorder, product.display AS product_display, product.ignorenewupdate AS product_ignorenewupdate, product.directlink AS product_directlink, product.directlinkURL AS product_directlinkURL, product.shortdescription AS product_shortdescription, product.logo AS product_logo, product.thumbnail AS …

3
为什么使用GROUP BY子句比不使用GROUP BY子句的集合查询显着更快?
我很好奇为什么有GROUP BY子句的聚合查询比没有子句的查询运行得这么快。 例如,此查询将花费近10秒钟来运行 SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 虽然这个过程不到一秒钟 SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 GROUP BY CreatedDate CreatedDate在这种情况下只有一个,因此分组查询返回的结果与未分组查询相同。 我注意到两个查询的执行计划是不同的-第二个查询使用Parallelism,而第一个查询则没有。 如果SQL Server没有GROUP BY子句,则以不同的方式评估聚合查询是否正常?在不使用GROUP BY子句的情况下,我可以做些什么来提高第一查询的性能? 编辑 我刚刚学会了可以将OPTION(querytraceon 8649)并行性的开销开销设置为0,这使查询使用某种并行性,并将运行时间减少到2秒,尽管我不知道使用此查询提示是否有任何弊端。 SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 OPTION(querytraceon 8649) 我仍然希望运行时间更短,因为查询是要在用户选择时填充一个值,因此理想情况下应该像分组查询一样是瞬时的。现在,我只是包装查询,但我知道这并不是理想的解决方案。 SELECT Min(CreatedDate) FROM ( SELECT Min(CreatedDate) as …

2
临时表和表变量之间的INSERT性能差异
我在SQL Server 2005中遇到以下问题:与使用临时表进行相同插入相比,尝试将一些行插入表变量中需要花费大量时间。 这是要插入到表变量中的代码 DECLARE @Data TABLE(...) INSERT INTO @DATA( ... ) SELECT .. FROM ... 这是要插入到临时表中的代码 CREATE #Data TABLE(...) INSERT INTO #DATA( ... ) SELECT .. FROM ... DROP TABLE #Data 临时表没有任何键或索引,两个查询之间的选择部分相同,并且选择返回的结果数约为10000行。单独执行选择所需的时间约为10秒。 临时表版本最多需要10秒才能执行,我不得不在5分钟后停止表变量版本。 我必须使用表变量,因为查询是表值函数的一部分,该函数不允许访问临时表。 表变量版本的执行计划 临时表版本的执行计划

4
您知道过去12小时内每小时产生一条记录的简单方法吗?
我有一个报告,其中显示了过去12小时内按小时分组的事件计数。听起来很容易,但是我正在努力的是如何包括弥补空白的记录。 这是一个示例表: Event ( EventTime datetime, EventType int ) 数据如下所示: '2012-03-08 08:00:04', 1 '2012-03-08 09:10:00', 2 '2012-03-08 09:11:04', 2 '2012-03-08 09:10:09', 1 '2012-03-08 10:00:17', 4 '2012-03-08 11:00:04', 1 我需要创建一个结果集,该结果集在过去12个小时的每个小时都有一个记录,无论该小时是否有事件发生。 假设当前时间是“ 2012-03-08 11:00:00”,该报告将大致显示: Hour EventCount ---- ---------- 23 0 0 0 1 0 2 0 3 0 4 0 5 0 …

4
确定表上的索引未使用
我一直在运行此脚本以尝试查找无关的索引 select o.name as TableName, i.name as IndexName, p.reserved_page_count * 8.0 / 1024 as SpaceInMB, s.* from sys.dm_db_index_usage_stats s inner join sys.objects o on s.object_id = o.object_id inner join sys.indexes i on i.index_id = s.index_id and i.object_id = o.object_id inner join sys.dm_db_partition_stats p on i.index_id = p.index_id and o.object_id = …

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.