我想找出导致我在性能监视器计数器中看到的高 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)以缩短此事务并减少表中的块?
尽管我们强烈抗议,但我们的管理层决定必须授予开发团队对开发服务器的“sa”权限。问题是我们,DB 支持组仍然负责维护这个盒子。
我们现在被委托为具有这些增强权限的开发团队制定一份注意事项列表的任务。
请添加到此列表中:
DO——将活动限制在正在开发的数据库中
不要 -
任何指向可用于跟踪这些用户活动的工具的指针将不胜感激。
我发现的只是一个DateFormat我可以选择的预定义列表,就像这样
我记得在 MySQL(还有 PostgeSQL?)你可以定义你的日期格式:
DATE_FORMAT(now(),'&m_%Y') --for 02_2012 etc.
Run Code Online (Sandbox Code Playgroud)
SQL Server 有同样的东西吗?我看到人们必须编写一个函数来做这样的事情,它有内置的吗?
编辑:
我刚刚找到了这个DatePart功能。它可以以月份为数字,但总是返回 1 位数字,即使我使用 datePart(MM, getdate())
我要做的是查看我们的数据库并锁定所有auto-shrink设置,以及处理哪些数据库/表高度碎片化。
是否有我可以运行的特定脚本来获得每个数据库的好主意?
我知道我可以在每个表级别(至少 SQL Server 2005)运行以下内容:
DBCC SHOWCONTIG ('DB.TABLE');
Run Code Online (Sandbox Code Playgroud)
但是我可以运行什么来显示数据库中的所有表?
谢谢
我们有一张付款表,代理商会收到付款佣金。佣金取决于几个不同的因素,例如收到付款需要多长时间,因此在计算代理获得的佣金率时会涉及一些计算,但并不复杂。
例如,它可能永远不会比这更复杂:
SELECT Payments.Amount * CASE
WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1
WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2
ELSE Rates.Rate3 END
Run Code Online (Sandbox Code Playgroud)
构建第二个表来保存这些数据而不是在需要时随时查询是否有意义?或者我应该坚持使用在请求时提取数据的运行时查询?
更重要的是,在确定是否应该在需要数据的任何时候运行查询,或者数据是否应该存储在它自己的单独表中时,要使用哪些因素?
我有一个旧系统,表中有大约 1000 万行。在该表中有一个 type 列text,其中大部分是标准文本,但大约 50 万行中有 RTF 标记。我需要将 RTF 格式的文本转换为纯文本。
我当前的方法是我有一个 C# 程序,它使用 a 将查询加载到 DataTable 中,SqlDataAdapter并使用 winformsRichTextBox控件进行转换。
void bw_DoWork(object sender, DoWorkEventArgs e)
{
count = 0;
rtbRTFToPlain = new RichTextBox();
using (SqlDataAdapter ada = new SqlDataAdapter("select note_guid, notes from client_notes", Globals.SQLConnectionString))
using(SqlCommandBuilder cmb = new SqlCommandBuilder(ada))
{
DataTable dt = new DataTable();
ada.UpdateCommand = cmb.GetUpdateCommand();
ada.Fill(dt);
int reportEvery = dt.Rows.Count / 100;
if (reportEvery == 0)
reportEvery = 1;
foreach (DataRow row …Run Code Online (Sandbox Code Playgroud) 当特殊guest用户被孤立(未链接到任何登录)时,可以做什么(如果有的话)?
对于我的一个数据库 (SQL Server 2005),执行以下命令将来宾用户列为孤立用户。
exec sp_change_users_login 'report'
Run Code Online (Sandbox Code Playgroud)
结果:
UserName UserSID
guest 0x3C2E66759FFBC14F84127D6795C27FD3
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用该过程修复来宾用户,则会得到以下信息:
exec sp_change_users_login 'update_one', 'guest', 'guest'
Run Code Online (Sandbox Code Playgroud)
终止此程序。'guest' 是此过程中登录名参数的禁止值。
如果我尝试删除用户,我会得到:
用户 'guest' 不能删除,只能禁用。
select * from sys.database_principals where name = 'guest'
Run Code Online (Sandbox Code Playgroud)
结果是:
name guest
principal_id 2
type S
type_desc SQL_USER
default_schema_name guest
create_date 11/13/98 2:58 AM
modify_date 10/16/01 4:31 PM
owning_principal_id NULL
sid 0x3C2E66759FFBC14F84127D6795C27FD3
is_fixed_role 0
Run Code Online (Sandbox Code Playgroud)
数据库似乎对这是否是特殊用户感到困惑。有什么可以做的吗?
sql-server-2005 ×10
sql-server ×7
performance ×2
c# ×1
date-format ×1
datetime ×1
permissions ×1