Questions tagged «sql-server-2008-r2»

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

2
供应商希望每5分钟运行一次MSDB作业以进行业务应用程序
我们有一个第三方供应商试图将两个数据库都驻留在我们的SQL Server实例上的两个不同的应用程序与150多个其他数据库进行集成,并且他们想创建一个MSDB作业,以每5分钟“同步”这两个不同的应用程序(首先,他们想每分钟运行一次)。 我最初的直觉是,他们应该以Windows计划的作业,或者甚至是可怕的触发器(在这种情况下通常采用这种方法)在Application层中以某种方式执行此操作。 我宁愿尽可能多地为DBA任务保留MSDB作业,以减少混乱,而且在查看具有此类活动的超级作业时的作业历史时,MSDB的查询速度也很慢(这也会淹没和丢弃重要的作业历史)更重要的事情,例如备份历史)。但是话又说回来,也许我的首选项是错误的,我需要在MSDB中为应用程序层腾出一些空间,并袖手旁观,解决工作历史记录的问题,因为当我需要保留更多历史记录条目来捕获工作记录时,这些问题会永远载入重要内容,例如备份(或清除超级活动作业条目)。 我遇到的另一个问题是,当他们通过GUI执行升级时,我现在需要给该供应商“ sysadmin”权限,而不是仅对他们的DB授予“ dbo”权限,并希望他们不要破坏我的关键任务实例数据库是(整合的缺点之一)。 我想我可以把它们放在另一个“分离”的情况下,我们把所有的不玩好供应商,但这时我们就需要重新配置应用程序以指向新的SQL实例(叹可惜在这种情况下,不平凡的)。 供应商已经回避了我的担忧,谈论触发器的糟糕程度。因此,我对此进行了“搜索”,然后空了出来。有没有人看到任何链接“权威的外观”,这是一个坏主意,我可以推荐给他们?还是我应该接受他们的方法? 我不相信在寻求帮助之前我从未在sql论坛中发布过,所以希望我的查询框架正确。 编辑:我们正在运行SQL Server 2008 Enterprise R2 x64 SP1(感谢您指出我忘记提及版本!)。嗯,希望他们在使用新版本时不需要更改MSDB升级脚本。 谢谢你的时间!丰富


1
SQL Server如何知道谓词之间的关联?
在诊断基数估计不佳(尽管索引简单,统计信息最新等)并因此查询计划不佳的SQL Server 2008 R2查询时,我发现了一个可能相关的知识库文章: FIX:运行查询时性能不佳包含SQL Server 2008或SQL Server 2008 R2或SQL Server 2012中的关联AND谓词 我可以猜测知识库文章“关联”的含义,例如谓词2和谓词1主要针对相同的行。 但是我不知道SQL Server如何知道这些相关性。一个表是否需要一个包含来自两个谓词的列的多列索引?SQL是否使用统计信息来检查一列中的值是否与另一列相关?还是使用其他方法? 我问这个有两个原因: 确定使用此修补程序可以改善我的表和查询 知道我应该在索引编制,统计数据等方面做些什么来影响#1

3
通过代码创建新函数(如果不存在)
我想通过脚本在数据库中创建新功能。脚本代码如下: IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return; CREATE FUNCTION fn_myfunc () returns varchar(10) AS Begin ... End 但是当我执行上述脚本时,SQL Server返回错误: 'CREATE FUNCTION' must be the first statement in a query batch.

2
需要SQL Server冻结的Ghost清理解决方法
我有几张表,行数在5M和1.5G之间 每个表都有其BLOB字段,其大小从100字节到30 MBytes不等,并存储为“行外的大值类型” = ON 表存储在不同的文件组中,每个3-4个文件存储在不同的磁盘上@不同的LUNs @快速SAN 这些表每天增长5-100 Gb,并具有60万-150万行 经过一定时间(从2周到6个月不等)后,某些行将被删除或移至归档DB,因此-工作表中没有任何行超过6个月的行。 服务器的当前配置: SQL Server引擎是2008 R2 SP1 Enterprise @ 24核@ 64Gb RAM SQL Server运行时带有额外的启动标志: -T 3640; (无需为存储过程中的每个语句向客户端发送DONE_IN_PROC消息。这类似于SET NOCOUNT ON的会话设置,但是当设置为跟踪标志时,将以这种方式处理每个客户端会话) -T 1118;(将tempDB中的分配从一次1pg(对于前8页)切换到一个范围。) -T 2301;(启用特定于决策支持查询的高级优化。此选项适用于大型数据集的决策支持处理) -T 1117;(一次增长所有数据文件,否则轮流进行。) -E; (增加为文件组中的每个文件分配的扩展区数。此选项对于运行索引或数据扫描的用户数量有限的数据仓库应用程序可能会有所帮助) -T 834;(导致SQL Server使用Windows大页分配用于分配用于缓冲池,存储 http://msdn2.microsoft.com/en-us/library/aa366720.aspx, http://support.microsoft。 com / kb / 920093) SQL Server使用大页面扩展 SQL Server利用快速文件初始化选项 所有数据库的AUTOSHRINK均关闭 …

2
优化:将变量声明移至过程的顶部
在优化某些存储过程的过程中,我与DBA坐下并经历了一些阻塞和/或读/写活动频繁的存储过程。 DBA提到的一件事是我应该TABLE在存储过程的顶部声明所有变量(尤其是变量),以避免重新编译。 这是我第一次听说此消息,并且在重新访问我们拥有的所有不同存储过程之前,正在寻求一些确认。他称其为“代码的后期查看”,并且重新编译锁定了解决阻塞的架构。 将所有变量声明移到存储过程的顶部是否会减少重新编译?

1
解释SQL Server的Showplan XML
我刚刚在网站http://sqlfiddle.com上推出了一项功能,该功能使用户可以查看其查询的原始执行计划。对于PostgreSQL,MySQL和(在某种程度上)Oracle,可以理解原始执行计划的输出。但是,如果您查看SQL Server的执行计划输出(使用生成的SET SHOWPLAN_XML ON),那么即使对于相对简单的查询,也要经过大量的XML。这是一个示例(摘自该“小提琴”的上一个查询的执行计划:http : //sqlfiddle.com/#!3/ 1fa93/1): <ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.50.2500.0"> <BatchSequence> <Batch> <Statements> <StmtSimple StatementText="
select * from supportContacts" StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="0.0032853" StatementEstRows="3" StatementOptmLevel="TRIVIAL" QueryHash="0x498D13A3874D9B6E" QueryPlanHash="0xD5DDBD3C2D195E96"> <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false"/> <QueryPlan CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="72"> <RelOp NodeId="0" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="3" EstimateIO="0.003125" …

1
在SQL Server中本地解码Base64字符串
我varchar在SQL Server的表中有一列,其中包含一个base64编码的文本字符串,我想将其解码为等效的纯文本 SQL Server是否有任何本机功能来处理此类事件? 一个示例base64字符串: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== 解码为: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

4
更改查询以改善操作员估计
我有一个可以在可接受的时间内运行的查询,但我想从中获得最大的性能。 我要改进的操作是计划的右侧节点17处的“索引搜索”。 我已经添加了适当的索引,但是对于该操作,我得到的估计值是它们应有的一半。 我一直在寻找更改索引,添加临时表并重新编写查询的方法,但是为了获得正确的估算值,我无法对其进行简化。 有人对我可以尝试的方法有任何建议吗? 完整计划及其详细信息可以在这里找到。 可以在此处找到非匿名计划。 更新: 我觉得问题的最初版本引起了很多混乱,因此我将在原始代码中添加一些解释。 create procedure [dbo].[someProcedure] @asType int, @customAttrValIds idlist readonly as begin set nocount on; declare @dist_ca_id int; select * into #temp from @customAttrValIds where id is not null; select @dist_ca_id = count(distinct CustomAttrID) from CustomAttributeValues c inner join #temp a on c.Id …

2
使用SqlCommand.Prepare()有什么意义和好处?
我遇到了开发人员代码,其中在执行SQL查询之前广泛使用了SqlCommand.Prepare()(请参见MSDN)方法。我想知道这样做的好处是什么? 样品: command.Prepare(); command.ExecuteNonQuery(); //... command.Parameters[0].Value = 20; command.ExecuteNonQuery(); 我玩了一些,并进行了追踪。调用Prepare()方法后,Command的执行使Sql Server执行以下语句: declare @p1 int set @p1=1 exec sp_prepexec @p1 output,N'@id int,@desc text',N'INSERT INTO dbo.testtable (id) VALUES (@id)',@id=20' select @p1 之后,当获取参数的值并SqlCommand.ExecuteNonQuery()调用该参数时,将在Sql-Server上执行以下操作: exec sp_execute 1,@id=20 对我来说,这看起来像该语句在Prepare()执行后立即得到了编译。我想知道这样做有什么好处?这是否意味着将其放入计划缓存中,并且可以在使用所需参数值执行最终查询后立即重新使用它? 我发现(并记录在另一个问题中)用SqlParameters执行的SqlCommands总是包装在sp_executesql过程调用中。这使Sql Server能够独立于参数值存储和重用计划。 关于这一点,我想知道该prepare()方法是无用的还是过时的,或者我是否在这里遗漏了什么?

5
属性大小不适用于数据库
我最近将数据库还原到了从(SQL Server 2008 R2 Enterprise)备份的同一实例,发现我无法访问数据库属性。 我已经完成以下工作: 检查数据库所有者使用正确设置sp_helpdb。 将数据库所有者更改为sa。不能解决。 将数据库所有者更改回我的sysadmin用户。不能解决。 DBCC updateusage针对受影响的数据库发出。不能解决。 DBCC CheckDB在还原的副本上运行到另一个实例。找不到腐败。访问数据库属性窗口时,从同一备份文件还原的副本没有引发任何错误。 有人可以帮忙吗? 尝试查看属性时收到的错误消息是: 无法显示请求的对话框。(SqlMgmt) 属性大小不适用于数据库“ [DBNAME]”。 该属性对于该对象可能不存在,或者由于访问权限不足而无法检索。(Microsoft.SqlServer.Smo) 我sysadmin在这种情况下。 更新:根据建议,我创建了一个新用户,使其成为sysadmin并将数据库所有者更改为该用户。不幸的是没有修复。我将查看探查器跟踪是否产生任何有用的信息。 更新:Aaron-原始数据库已重命名并脱机,但仍在该实例上。然后使用原始名称还原了该数据库的备份。新数据库文件的文件名与原始文件名不同,因为它们与原始mdf / ldf位于同一文件夹中。恢复的数据库当前正在正常驱动我们的关键应用程序。


1
sp_procedure_params_90_rowset上的编译阻塞过多
MSDN上该问题的死灰复燃:阻塞的进程报告:这个waitresource是什么“对象:32767:124607697:0 [COMPILE]” 我已经在Profiler中捕获了这些语句。它们的持续时间都超过3秒。超过10岁以上。阻止活动与MSDN的链接相同。 呼叫均使用三部分命名。它们都以不同的形式指定不同的proc,它们看起来如下所示: exec [db1].[sys].sp_procedure_params_90_rowset N'proc1', 1, NULL, NULL exec [db2].[sys].sp_procedure_params_90_rowset N'proc2', 1, NULL, NULL exec [db3].[sys].sp_procedure_params_90_rowset N'proc3', 1, NULL, NULL exec [db4].[sys].sp_procedure_params_90_rowset N'proc4', 1, NULL, NULL 我怎样做才能减少这种阻塞? (编辑)我现在看到以下相同的东西: exec [db1].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db2].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db3].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db4].[sys].sp_primary_keys_rowset N'view1', N'dbo' 这是系统性的事情,但我不知道该怎么办。调用者是通过ADO的VB6。是ADO进行这些调用。 以下是阻止的流程报告示例 <blocked-process-report> <blocked-process> …

3
使用IN()提高查询性能
我有以下SQL查询: SELECT Event.ID, Event.IATA, Device.Name, EventType.Description, Event.Data1, Event.Data2 Event.PLCTimeStamp, Event.EventTypeID FROM Event INNER JOIN EventType ON EventType.ID = Event.EventTypeID INNER JOIN Device ON Device.ID = Event.DeviceID WHERE Event.EventTypeID IN (3, 30, 40, 41, 42, 46, 49, 50) AND Event.PLCTimeStamp BETWEEN '2011-01-28' AND '2011-01-29' AND Event.IATA LIKE '%0005836217%' ORDER BY Event.ID; …

2
大型表的性能调整(SQL Server 2008 R2)
背景: 我在UAT阶段有一个事实表。目标是在Prod中加载5年的数据(预期大小为400 Mn记录)。目前,它只有2年的测试数据。 表功能: 尺寸数〜45 措施〜30 非累加措施和其他专栏〜25 当前数据大小〜2亿(2年数据) 时间视图:3种不同的月视图:财政/日历/调整后的(即同一行可以在不同的月份中落入,具体取决于所寻找的视图) 用户一次只需要一个视图。(即,查询中仅使用一个月列,这使我们无法按时间视图进行分区) 索引:1个自然键聚集索引(8列)。在每个月列上创建3个覆盖非聚集索引的索引,其中包括很少的维度SK(FK)和所有度量。 因此,索引很大(总计190 GB)。 空间不受限制(已分配1 TB) 服务器中有64 GB的RAM。 表压缩也完成了。 要求: 此事实表上的查询应在30秒内给出结果(一般查询选择sum(量度),并按Dim值将少量Dims组组合在一起)。报告直接在此事实表的顶部完成。 问题: 任何包含“索引”中可用列的查询都可以正常工作,但是如果我们包含其他不在“ include ..”中的列,则很糟糕。这需要5-10分钟以上。任何人都可以提出一些解决方案,使其适合我们选择的任何尺寸/列的情况。在这种情况下,索引视图可以提供帮助吗?

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.