标签: sql-server-2008

查看 SQL 2008 sp_cursorexecute 底层查询和执行计划

我性能调优Dynamics AX的应用程序,看到一个SQL跟踪长时间运行,高I / O查询的形式exec sp_cursorexecute 1073742882 ...。当我尝试运行在一个新的SQL Management Studio中的窗口,查询,我得到一个错误Could not find prepared statement with handle 1073742882.我”我不确定,但似乎缓存计划是特定于连接的。我无sp_cursorprepare迹可寻;重复用例会显示相同的准备好的句柄 ID 和新游标。由于它是我要连接的共享环境,因此我想我必须重置应用服务器并跟踪其启动才能看到它。

  • 有什么办法可以使用游标准备好的句柄ID来查看底层查询吗?
  • 有没有办法将一行dm_exec_cached_plans与这个游标相关联?
  • 有没有办法通过dm_exec_query_plan或其他方式查看执行计划?

sql-server-2008 execution-plan cursors

5
推荐指数
1
解决办法
1631
查看次数

如何在 SQL Server 2008 中获取表的外键和主键详细信息

我想使用 2 个查询,一个列出具有以下信息的给定表的所有外键,Schema name, foreign table name另一个列出所有主键。

这个列出主键的查询是否正确:

select syssc.name as schemaname , cast(c.name as  varchar(255)) as foreign_table , 
cast(p.name as varchar(255)) as primary_table 
from sysobjects f 
inner join sysobjects c on  f.parent_obj = c.id 
inner join sysreferences r on f.id =  r.constid 
inner join sysobjects p on r.rkeyid = p.id 
inner  join syscolumns rc on r.rkeyid = rc.id and r.rkey1 = rc.colid 
inner  join syscolumns fc on r.fkeyid = fc.id and r.fkey1 = fc.colid 
left join  syscolumns …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 foreign-key database-design sql-server metadata

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

链接服务器解决方案和 SSIS 解决方案有什么区别?

当我想在两个数据库(例如源:Oracle,目标:SQL Server)之间移动数据时,我想我有两个选择:链接服务器和 SQL Server 集成服务。但是使用链接服务器有什么好处吗?如果我手上有 SSIS,是否可以使用 Linked Server?

sql-server-2008 sql-server linked-server

5
推荐指数
1
解决办法
8987
查看次数

哪个更快:选择现有行与不存在行的更新?

哪个会跑得最快?

  1. 使用主键从表中选择(整数、聚集索引、1,000,000+ 行)
  2. 尝试在不同的表上进行更新,其中该行不存在?(整数主键的 where 子句,聚集索引,200,000+ 行)

背景

我们目前有一些程序需要维护其表的过滤副本。

涉及的表:

  • [MasterTable] 包含过滤条件
  • [ChildTable] 被过滤
  • [ChildFilterTable] 保存过滤后的记录

目前正在通过以下方式完成这项工作:

  1. 选择过滤条件
  2. 如果过滤条件匹配,则:
    1. 尝试更新
    2. 如果没有记录更新,插入一条新记录

示例 SQL:

DECLARE @FilterValue INT

/* Get FilterValue to check */
SELECT @FilterValue = FilterValue FROM [MasterTable] WHERE ID = @IDFromChildTable

IF @FilterValue = 123
BEGIN
    /* Attempt update */
    UPDATE [ChildFilterTable] SET
        ...
    WHERE ChildID = @IDFromChildTable

    IF @@ROWCOUNT = 0
    BEGIN
        /* Row not there yet, insert it! */
        INSERT INTO [ChildFilterTable] (ChildID, ....) VALUES (@IDFromChildTable, ....) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server-2008

5
推荐指数
1
解决办法
2006
查看次数

有没有办法强制 sp_send_dbmail 使用 ANSI,或者不包含 Unicode 前缀?

这是非常微不足道的,但如果有人手头有答案,我会很感激。

我使用msdb..sp_send_dbmail存储过程作为分发简单报告的轻量级方法。这通常需要生成 CSV。但是,存储过程包括 Unicode little-endian 前缀 FF FE。这会混淆 Excel,导致它不会自动将 CSV 解析为列。

有许多变通方法:使用真正的报告平台(我们有 Crystal,但它从来没有可靠地工作过);将文件发送到一个小应用程序,该应用程序将文件转换为 ANSI 并继续发送;使用制表符分隔符(我最喜欢的);或教育收件人如何使用 CSV(开个玩笑,我们都知道这是不可能的)。

但是,我很想在某处拨动一个开关并告诉 SQL Server 停止将附件创建为 Unicode,因为我没有这样的需要。我还没有找到这样的设置;这可能吗?

谢谢!


编辑

根据 Rohan 的回答,SQL 代理作业步骤中的这个脚本几乎可以工作:

$reportQuery = "EXEC Routine..TopTenReviewsReport @DoNotLog = 1"
$filePath = "\\SQLBI001\RawData\TopTenReviewsReport.csv"
$mailQuery = "
  EXEC msdb..sp_send_dbmail
  @profile_name = 'X',
  @recipients = 'X',
  @subject = 'X',
  @file_attachments = '" + $filePath + "'"

Invoke-Sqlcmd -query $reportQuery | export-csv $filePath
$result = Invoke-Sqlcmd -query $mailQuery
Run Code Online (Sandbox Code Playgroud)

该文件现在有一个“#TYPE System.Data.DataRow”前缀,而不是 0xFF FE,但它现在是 ANSI,所以就是这样。

sql-server-2008 database-mail

5
推荐指数
1
解决办法
4316
查看次数

SQL Server 2008 维护计划失败

我决定使用 2008 年的内置维护计划来执行简单的重建索引任务,而不是使用我的旧学校索引重建脚本。

详情如下:

  • 连接 = 本地服务器连接
  • 数据库 = 特定数据库(只有一个)
  • 对象 = 表和视图
  • 可用空间选项 = 我已经尝试了默认数量并将百分比更改为 70%
  • 高级选项 = 在重新索引时保持索引在线是唯一选中的选项。这是我想使用它的主要原因是为了看看我们是否可以在重建的同时保持索引在线。

当我手动运行 T-SQL 时,一切正常,但我认为它没有使索引保持在线。每当我运行这项工作时,我都会遇到这个非常奇怪的错误,但并没有让我走到任何地方:

执行查询“ALTER INDEX [Agreement_PK] ON [dbo].[Agreement] RE...”失败,出现以下错误:“字符串或二进制数据将被截断。语句已终止。”。可能的失败原因:查询有问题,“ResultSet”属性设置不正确,参数设置不正确,或者连接建立不正确。

USE [<dbase>]
GO
ALTER INDEX [Agreement_PK] ON [dbo].[Agreement] REBUILD PARTITION = ALL WITH ( FILLFACTOR = 30, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, ONLINE = ON, SORT_IN_TEMPDB = OFF ) 
GO
USE [<dbase>] 
GO
ALTER INDEX [IX_Agreement_1] ON [dbo].[Agreement] REBUILD PARTITION = ALL WITH ( …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 index-tuning

5
推荐指数
1
解决办法
882
查看次数

SQL Server 事务复制 - 订阅者与发布者上的 MERGE 命令的行为

背景

我有两个运行在两台不同机器上的 SQL 服务器实例:

一个是发布者,另一个是单个(大型)数据库的订阅者。复制类型是事务性的。

它们都从我复制的数据库的相同快照开始。

我有一个运行在发布者机器上的实用程序,它针对它执行 SQL 命令(都是插入、更新、删除)。然后将这些更改推送给订阅者。

我想知道我是否能够 TRUNCATE 发布者数据库中的数据,以便它具有较低的开销(我想要的是复制能力,只要它,我就不会关心复制发布者中的实际数据将其发送给订阅者)。

如果我执行上述操作并修改我的实用程序,该实用程序执行将 INSERTS 和 UPDATES 转换为 MERGE 命令的命令,数据是否会正确复制到所有订阅者?


示例场景:

我的实用程序将执行的原始命令:

更新日历 SET active = 0 WHERE id = 1932

  1. 发布者数据库没有 ID 为 1932 的日历记录,因为我截断了它,所以更新将影响零记录。

  2. 但是订阅者数据库确实有一个 ID 为 1932 的日历记录。

  3. 如果我的实用程序将上面的 UPDATE 转换为 MERGE,即使它在发布者上作为 INSERT 执行,但在订阅者上作为 UPDATE 执行,更改是否会被推送到订阅者数据库?


提前致谢。

replication sql-server-2008 sql-server

5
推荐指数
1
解决办法
339
查看次数

SQL Server 2008 复制 - 固定的复制开销?

我们正在使用 SQL 2008 事务复制将数据从我们的生产数据库复制到我们的报告数据库。

我们最近创建了一个新的“全球”数据库,我们希望将其复制到我们在世界各地的各种生产数据库中。此数据库中的表数量很少(小于 30),并且任何给定表中的最大行数可能是几千。我们不会经常向这个全局数据库添加表和数据。

我们的 DBA 说“复制的固定开销与实际复制的数据量不成比例”。我对事务复制略知一二,但不足以反驳这个论点。复制是否真的存在大量“固定开销”,以至于如果我们不复制大量数据,仍然会占用大量资源?

replication sql-server-2008 sql-server

5
推荐指数
1
解决办法
299
查看次数

页面预期寿命是什么单位?

我目前正在使用以下查询从 SQL Server 获取页面预期寿命:

declare @PLE int

select @PLE=cntr_value 
from psql1.master.sys.dm_os_performance_counters 
where counter_name='Page life expectancy' 
and instance_name='';
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我不知道这是毫秒、秒还是什么。我目前得到的值是 88936。这可能以秒或毫秒为单位。

如果以毫秒为单位会更有意义,但是该服务器目前没有那么多使用,因此在内存中停留 24 小时 (88936/3600=24.7) 并非不可能。

performance sql-server-2008 sql-server page-life-expectancy

5
推荐指数
1
解决办法
910
查看次数

每个数据库为 SQL Server 2008 R2 存储了哪些文件的信息在哪里

我需要找到 SQL Server 2008 R2 将哪些文件存储在每个数据库中的位置。关键是服务器已经完全崩溃(硬件故障)。我设法恢复了所有 .mdf/.ldf 文件。

我需要尽快在另一台服务器上启动并运行一个数据库,但是最初设置服务器的人并没有很好地将数据库名称与文件名匹配,所以我需要以某种方式提取两者之间的映射而无需通过SQL Server 的完整还原,即我需要知道数据库 XXXXX 的文件名称,因为它附加到 SQL Server。

这可能吗?正在考虑将恢复的主数据库附加到另一个 SQL Server 实例,但我似乎无法在另一个主数据库中找到有关数据文件的任何信息,因此可能是在浪费时间。

谢谢

sql-server-2008 sql-server

5
推荐指数
1
解决办法
359
查看次数