标签: sql-server-2005

TSQL:分别查找导致 SQL 编译和 SQL 重新编译过多的查询

我想找出导致我在性能监视器计数器中看到的高 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: …

performance sql-server-2005

8
推荐指数
1
解决办法
5099
查看次数

Sql Server 2005 中的 DBMail 疑难解答

在 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 都非常感谢。

sql-server-2005

8
推荐指数
2
解决办法
448
查看次数

SSMS 中的 SQLCMD 模式和@@variable 扩展

在 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)

徒劳的追求 …

sql-server-2005 sql-server-2008 sql-server

8
推荐指数
1
解决办法
6969
查看次数

sql server 并发性能

我们在生产环境中遇到了一些性能问题。

我们发现,当活动会话数超过 25 时,CPU 使用率达到 100%,并且需要很长时间才能下降。


我们拥有的环境:

产品 Microsoft SQL Server 企业版 9.3(sp2)

CPU 2(至强 2.13)

内存7G

会话详细信息 1 的快照

活动会话 25

496 章

空闲会话 289

被阻止的交易29

会话详细信息 2 的快照

活动会话 59

活跃交易 885

267 章

被阻止的交易49


我想知道:

  1. 2CPU 是否可以处理25 个活动会话(500 个活动事务)。 PS:我们测试过,没有并发请求,一个事务,读/写5 个表,在应用程序级别大约需要1 秒。

  2. 阻塞的事务是否占用更多的CPU。 PS:阻塞的事务主要是因为2个表上的锁。

解决方案是什么:添加 CPU 或调整应用程序(java/hibernate)以缩短此事务并减少表中的块?

sql-server-2005

8
推荐指数
3
解决办法
1697
查看次数

在开发盒上为开发人员授予 SA 权限

尽管我们强烈抗议,但我们的管理层决定必须授予开发团队对开发服务器的“sa”权限。问题是我们,DB 支持组仍然负责维护这个盒子。

我们现在被委托为具有这些增强权限的开发团队制定一份注意事项列表的任务。

请添加到此列表中:

DO——将活动限制在正在开发的数据库中

不要 -

  • 更改任何 SQL 实例设置
  • sp_configure(包括 cmdshell)
  • 添加/更改/删除任何安全设置
  • 添加/更改/删除数据库对象
  • 添加/更改/删除服务器对象,如备份设备和链接服务器
  • 添加/更改/删除复制
  • 添加/更改/删除维护计划
  • 接触任何不属于您团队的数据库

任何指向可用于跟踪这些用户活动的工具的指针将不胜感激。

sql-server-2005 sql-server permissions

8
推荐指数
3
解决办法
1871
查看次数

SQL Server 有 Date_Format 函数吗?

我发现的只是一个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())

sql-server-2005 sql-server date-format datetime

8
推荐指数
1
解决办法
1万
查看次数

获取整个 SQL Server 数据库统计信息的最有效方法

我要做的是查看我们的数据库并锁定所有auto-shrink设置,以及处理哪些数据库/表高度碎片化。

是否有我可以运行的特定脚本来获得每个数据库的好主意?

我知道我可以在每个表级别(至少 SQL Server 2005)运行以下内容:

DBCC SHOWCONTIG ('DB.TABLE');
Run Code Online (Sandbox Code Playgroud)

但是我可以运行什么来显示数据库中的所有表?

谢谢

sql-server-2005 sql-server

8
推荐指数
1
解决办法
364
查看次数

如何确定何时创建新表来保存可以从查询中获取的数据?

我们有一张付款表,代理商会收到付款佣金。佣金取决于几个不同的因素,例如收到付款需要多长时间,因此在计算代理获得的佣金率时会涉及一些计算,但并不复杂。

例如,它可能永远不会比这更复杂:

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)

构建第二个表来保存这些数据而不是在需要时随时查询是否有意义?或者我应该坚持使用在请求时提取数据的运行时查询?

更重要的是,在确定是否应该在需要数据的任何时候运行查询,或者数据是否应该存储在它自己的单独表中时,要使用哪些因素?

performance sql-server-2005 sql-server query-performance

8
推荐指数
2
解决办法
357
查看次数

将文本列中的 RTF 批量转换为纯文本

我有一个旧系统,表中有大约 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)

sql-server-2005 sql-server c#

8
推荐指数
1
解决办法
3万
查看次数

修复孤儿用户“访客”?

当特殊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 sql-server

8
推荐指数
1
解决办法
1716
查看次数