我性能调优Dynamics AX的应用程序,看到一个SQL跟踪长时间运行,高I / O查询的形式exec sp_cursorexecute 1073742882 ...。当我尝试运行在一个新的SQL Management Studio中的窗口,查询,我得到一个错误Could not find prepared statement with handle 1073742882.我”我不确定,但似乎缓存计划是特定于连接的。我无sp_cursorprepare迹可寻;重复用例会显示相同的准备好的句柄 ID 和新游标。由于它是我要连接的共享环境,因此我想我必须重置应用服务器并跟踪其启动才能看到它。
dm_exec_cached_plans与这个游标相关联?dm_exec_query_plan或其他方式查看执行计划?我想使用 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
当我想在两个数据库(例如源:Oracle,目标:SQL Server)之间移动数据时,我想我有两个选择:链接服务器和 SQL Server 集成服务。但是使用链接服务器有什么好处吗?如果我手上有 SSIS,是否可以使用 Linked Server?
哪个会跑得最快?
我们目前有一些程序需要维护其表的过滤副本。
涉及的表:
[MasterTable] 包含过滤条件[ChildTable] 被过滤[ChildFilterTable] 保存过滤后的记录目前正在通过以下方式完成这项工作:
示例 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) 这是非常微不足道的,但如果有人手头有答案,我会很感激。
我使用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,所以就是这样。
我决定使用 2008 年的内置维护计划来执行简单的重建索引任务,而不是使用我的旧学校索引重建脚本。
详情如下:
当我手动运行 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 服务器实例:
一个是发布者,另一个是单个(大型)数据库的订阅者。复制类型是事务性的。
它们都从我复制的数据库的相同快照开始。
我有一个运行在发布者机器上的实用程序,它针对它执行 SQL 命令(都是插入、更新、删除)。然后将这些更改推送给订阅者。
我想知道我是否能够 TRUNCATE 发布者数据库中的数据,以便它具有较低的开销(我想要的是复制能力,只要它,我就不会关心复制发布者中的实际数据将其发送给订阅者)。
如果我执行上述操作并修改我的实用程序,该实用程序执行将 INSERTS 和 UPDATES 转换为 MERGE 命令的命令,数据是否会正确复制到所有订阅者?
示例场景:
我的实用程序将执行的原始命令:
更新日历 SET active = 0 WHERE id = 1932
发布者数据库没有 ID 为 1932 的日历记录,因为我截断了它,所以更新将影响零记录。
但是订阅者数据库确实有一个 ID 为 1932 的日历记录。
如果我的实用程序将上面的 UPDATE 转换为 MERGE,即使它在发布者上作为 INSERT 执行,但在订阅者上作为 UPDATE 执行,更改是否会被推送到订阅者数据库?
提前致谢。
我们正在使用 SQL 2008 事务复制将数据从我们的生产数据库复制到我们的报告数据库。
我们最近创建了一个新的“全球”数据库,我们希望将其复制到我们在世界各地的各种生产数据库中。此数据库中的表数量很少(小于 30),并且任何给定表中的最大行数可能是几千。我们不会经常向这个全局数据库添加表和数据。
我们的 DBA 说“复制的固定开销与实际复制的数据量不成比例”。我对事务复制略知一二,但不足以反驳这个论点。复制是否真的存在大量“固定开销”,以至于如果我们不复制大量数据,仍然会占用大量资源?
我目前正在使用以下查询从 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) 并非不可能。
我需要找到 SQL Server 2008 R2 将哪些文件存储在每个数据库中的位置。关键是服务器已经完全崩溃(硬件故障)。我设法恢复了所有 .mdf/.ldf 文件。
我需要尽快在另一台服务器上启动并运行一个数据库,但是最初设置服务器的人并没有很好地将数据库名称与文件名匹配,所以我需要以某种方式提取两者之间的映射而无需通过SQL Server 的完整还原,即我需要知道数据库 XXXXX 的文件名称,因为它附加到 SQL Server。
这可能吗?正在考虑将恢复的主数据库附加到另一个 SQL Server 实例,但我似乎无法在另一个主数据库中找到有关数据文件的任何信息,因此可能是在浪费时间。
谢谢
sql-server-2008 ×10
sql-server ×6
replication ×2
cursors ×1
foreign-key ×1
index-tuning ×1
metadata ×1
performance ×1