我想找出导致我在性能监视器计数器中看到的高 SQL 编译(而不是重新编译)的原因。
这是我的看法:如果我看到很多 SQl 编译,那么这意味着我们系统上的查询没有被缓存,原因如下:
许多即席查询
运行 SQL 不缓存的查询,例如:
UPDATE table1 SET col1='String 长度超过 8000 个字符.....' WHERE key_column = some int
计划超时并从缓存中删除,因为: 缓存空间不足或计划使用时间不够长。
在探查器中捕获缓存插入的唯一方法是存储过程->SP:CacheInserts,但它只关注存储过程缓存。
所以我尝试了以下方法来获取临时查询:
SELECT [cp].[refcounts] -- when Refcounts becomes 0, plan is excluded from cache.
, [cp].[usecounts]
, [cp].[objtype]
, st.[dbid]
, st.[objectid]
, st.[text]
, [qp].[query_plan]
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;
Run Code Online (Sandbox Code Playgroud)
我认为导致编译的查询应该是 objtype= Adhoc 的查询,但这也可能与重新编译有关。现在我必须运行分析器,捕获导致重新编译的查询,然后将其从上面的列表中排除。
我是否朝着正确的方向前进?
是否可以使用单个查询来实现 SQL 编译而无需太多工作?
帮助我获得上述知识的资源:
http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/954b4fba-3774-42e3-86e7-e5172abe0c83 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=143946 http: …
在 SQL Server 2005 机器上,我安装并正确配置了 DBMail。我可以使用“通知操作员”和 EXEC msdb.dbo.sp_send_dbmail 来排队电子邮件。
但问题是排队的邮件永远不会通过。我在查询时看到队列中有 10 封电子邮件
SELECT * FROM msdb.dbo.sysmail_unsentitems
Run Code Online (Sandbox Code Playgroud)
但是,如果我重新启动SQL Server 服务,所有邮件都会通过,并且我会在收件箱中收到电子邮件。
到目前为止,这是我能找到的唯一模式。
所以我的问题是:有没有办法对 DBmail 进行故障排除?我在 MSDN 上阅读了一些步骤,但它们没有太大帮助。任何可以提供帮助的文章的 URL 都非常感谢。
在 SSMS 中使用 SQLCMD 模式时(不是从命令行),有没有办法将当前服务器和实例分配给变量?这不同于分配普通的 TSQL 变量。
我想使用 SQLCMD 变量扩展的强大功能来替换部署脚本中特定于环境的值,而不是我已经进入的现有 tsql 字符串构建混搭。除了当前环境的一个例外,使用 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
Run Code Online (Sandbox Code Playgroud)
这会产生以下结果。
hard_coded_value servername dbNotServer
DEVA2\DEV2 DEVA2\DEV2 @@servername
Run Code Online (Sandbox Code Playgroud)
肉饼说3分之2 还不错,但我宁愿有 3 分之 3 的解决方案。当该脚本部署到测试服务器时,我不想相信部署人员会编辑脚本。
如果使用 SQLCMD 的唯一解决方案是完全从命令行调用脚本,我可以接受这一点,但我想把它扔在这里,因为我对使用 SQLCMD 不感兴趣。
:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked
Run Code Online (Sandbox Code Playgroud)
结果
worked
DEVA\DEV2
Run Code Online (Sandbox Code Playgroud)
我们在生产环境中遇到了一些性能问题。
我们发现,当活动会话数超过 25 时,CPU 使用率达到 100%,并且需要很长时间才能下降。
我们拥有的环境:
产品 Microsoft SQL Server 企业版 9.3(sp2)
CPU 2(至强 2.13)
内存7G
会话详细信息 1 的快照
活动会话 25
第 496 章
空闲会话 289
被阻止的交易29
会话详细信息 2 的快照
活动会话 59
活跃交易 885
第 267 章
被阻止的交易49
我想知道:
2CPU 是否可以处理25 个活动会话(500 个活动事务)。 PS:我们测试过,没有并发请求,一个事务,读/写5 个表,在应用程序级别大约需要1 秒。
阻塞的事务是否占用更多的CPU。 PS:阻塞的事务主要是因为2个表上的锁。
解决方案是什么:添加 CPU 或调整应用程序(java/hibernate)以缩短此事务并减少表中的块?
抱歉,标题令人困惑,我不知道在那里写什么。
我有一张包含几百条记录的表格。我需要将这个表的每条记录分配给一个更小的动态用户表,并且用户应该交替分配他们被分配的记录。
例如,如果表A是
Row_Number() 标识 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
表B是
Row_Number() 标识 1 1 2 2 3 3
我需要一个最终结果集
用户 ID 记录 ID 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 3 9 1 10
我已经设法使用 mod 运算符做了一些有点混乱的事情,但是我很好奇是否可以在没有临时表和变量的情况下运行相同的查询。
使用临时表是因为 TableA 实际上是一个用户定义的函数,它将逗号分隔的字符串转换为表,我需要来自 UDF 的对象的计数。
-- Converts a comma-delimited string into a table
SELECT Num as [UserId], Row_Number() …Run Code Online (Sandbox Code Playgroud) 我想我可以使用 sp_MSforeachdb 来解决这个问题,但我收到一条错误消息。
sp_MSforeachdb '
BEGIN
USE [?]
DECLARE @dbid INT
SET @dbid = DB_ID()
IF(@dbid > 4)
BEGIN
--PRINT ''[?]'' + CONVERT(VARCHAR, @dbid)
--ALTER DATABASE [?] SET AUTO_SHRINK OFF
END
END;
'
Run Code Online (Sandbox Code Playgroud)
如果我在未注释 PRINT 行的情况下运行上述查询,我将获得除系统数据库之外的所有数据库的列表。但是,当我取消注释 ALTER DATABASE 行时,我收到以下两条错误消息:
消息 5058,级别 16,状态 2,第 9 行
无法在数据库“master”中设置选项“AUTO_SHRINK”。
消息 5058,级别 16,状态 1,第 9 行
无法在数据库“tempdb”中设置选项“AUTO_SHRINK”。
这似乎在某些时候中断了操作,因此只有一些数据库被禁用自动收缩。
知道如何在所有数据库上禁用自动收缩吗?额外问题:为什么我的方法不起作用?
我刚刚收到有关 SQL Server 2005 实例的以下通知。该实例的核心与 tempdb 文件的比率为 2:1,tempdb 文件总数为 24 个文件。不应该发生争用 - 我将如何检测这种争用的来源?TempDB 和所有其他数据库都通过 10 GB 以太网存储在 SAN 存储上。SAN 在一个 RAID-60 阵列中配置了 46 个 10k SAS 驱动器。该阵列与多个 VMWare 服务器和一个或两个 Exchange 服务器共享。
来自 Idera SQL 诊断管理器的通知:
2012 年 11 月 8 日下午 10:49:00,MGSQL01 上的 Tempdb 争用 (ms) 至关重要。
在 MGSQL01 上检测到 Tempdb 闩锁争用。检测到的总等待时间为 1782 毫秒。这表明性能受到 tempdb 中分配映射争用的影响。如果这是一个常规问题,可以通过遵循有关 tempdb 文件计数、大小和 IO 子系统的最佳实践来缓解。
PFS 等待时间:1782 ms GAM 等待时间:0 ms SGAM 等待时间:0 ms
Tempdb 争用 (ms):tempdb 分配映射(GAM、SGAM 和 PFS)的当前等待时间,以毫秒为单位。此警报只能在运行 SQL 2005 或更高版本的实例上引发。
我们在一个 SQL Server 2005 实例上有两个数据库,它们之间有事务复制(3 个表作为文章)。该服务器同时充当发布者和分发者。
然后服务器上的 RAID 失败。然而,我们设法.mdf在崩溃之前分离并复制了几乎所有文件。
系统恢复后,我们重新安装了SQL Server,恢复了系统数据库(master、model、msdb)并将.mdf文件放在相同的路径下。于是开始了。
问题出现在复制中。在本地发布文件夹是空的,虽然本地订阅文件夹包含有问题的订阅。当我尝试添加新出版物时,我得到了:
新发布向导在检索发布名称时遇到一个或多个错误。
执行 Transact-SQL 语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo)
无效的对象名称“dbo.syspublications”。(Microsoft SQL Server,错误:208)
我决定尝试删除左订阅(最终我设法)并禁用服务器上的发布和分发,这给了我:
SQL Server 无法禁用“someserver”上的发布和分发。
无效的对象名称“dbo.syssubscriptions”。EXECUTE 之后的事务计数表示缺少 COMMIT 或 ROLLBACK TRANSACTION 语句。先前计数 = 0,当前计数 = 1。 EXECUTE 之后的事务计数表示缺少 COMMIT 或 ROLLBACK TRANSACTION 语句。先前计数 = 0,当前计数 = 1。 EXECUTE 之后的事务计数表示缺少 COMMIT 或 ROLLBACK TRANSACTION 语句。先前计数 = 0,当前计数 = 1。 EXECUTE 之后的事务计数表示缺少 COMMIT 或 ROLLBACK TRANSACTION 语句。先前计数 = 0,当前计数 = 1。 EXECUTE 之后的事务计数表示缺少 COMMIT 或 ROLLBACK …
replication sql-server-2005 sql-server transactional-replication
我正在尝试获取当前活动的全局临时表的列表。它们相互碰撞(同名)似乎存在问题。作为“代理”dba,试图解决这里的混乱。
我们有一个基表,用于定义部件并保存部件号、描述、价格、重量等信息。我们还有大约 400 个表引用基表,并根据部件的类型/类别提供有关部件的附加信息。
我们首先使用外键约束,这样如果某个部分在 400 个特定于部分的表中的一个中被引用,则无法从基表中删除该部分,但我们很快达到了 SQL Server 2005 的最大 253 个推荐外键。
在这种情况下,是否有任何外键替代方案可以确保数据完整性?我们在访问数据时没有看到性能问题,但由于查询计划太复杂,更新基表中的现有部分将失败。