我有一个通过事务复制发布的表。开发人员已请求修改订阅表以添加用于报告目的的列。该列将通过外部进程进行更新。
将列添加到已发布表并在其中插入数据是不明智的,因为更新列所需的数据位于订阅服务器上。
这可能吗?有没有更好的办法?
我有一个通过事务复制发布的表。开发人员已请求修改订阅表以添加用于报告目的的列。该列将通过外部进程进行更新。
将列添加到已发布表并在其中插入数据是不明智的,因为更新列所需的数据位于订阅服务器上。
这可能吗?有没有更好的办法?
在创建特定于环境的登录名(开发、质量检查、暂存、生产等)时,我面临着选择是将表示作为登录名的前缀还是后缀。
prod_MyAppLogin
MyAppLogin_prod
有什么理由让我更喜欢一种策略而不是另一种策略?
(显然,我应该与我做出的任何选择保持一致)
我有一个查询,它从多个视图中进行选择并且 I/O 相当繁重。如果我使用 Management Studio 执行此查询,它会在 16 个 CPU 中的大部分使用并行性并在 10 秒内完成。但是,当从 SpotFire(Tibco 的产品)执行它时,它仅使用 1 个 CPU,并且可能需要数小时才能完成。
如果我使用查询提示OPTION (MAXDOP 1) ,我可以在 Management Studio 中重现该问题。
我当时认为这可能是 SpotFire 问题,但它使用 Microsoft JDBC 驱动程序进行连接,我看不到有关并行性的连接属性。我已经使用 Profiler 确认来自 SpotFire 和来自 Management Studio 的查询看起来完全一样。这。相同的。唯一的区别似乎是并行执行。
谁能提供有关为什么会发生这种情况的见解?
!解决了![有点儿]
我重新运行 SQL Profiler 跟踪,发现查询确实相同,但执行方式不同。
来自 SpotFire:
declare @p1 int
set @p1=0
declare @p2 int
set @p2=0
declare @p7 int
set @p7=0
exec sp_cursorprepexec @p1 output,@p2 output,NULL,N'SELECT a, b, c , d FROM MyView',16,8193,@p7 输出
选择 @p1, @p2, @p7
从 Management Studio:
从 MyView 中选择 a、b、c、d
然后,我向 SQL Profiler 添加了两个新事件并重新运行查询:
- 性能/并行度
- 性能/全部显示计划
这表明来自 SpotFire 的查询使用的是 DOP 0 (BinaryData = 0x00000000),来自 Management Studio 的查询使用的是 DOP 12 (BinaryData = 0x1200000)。接下来,SHOWPLAN 向我展示了 SpotFire 查询在将数据返回给客户端之前将视图中的结果插入到临时表中。
那么它为什么要这样做呢?可能是因为sp_cursorprepexec语句。但为什么这会导致 DOP 降至 0?我不知道。
我认为“解决方案”将与 SpotFire 一起使用并可能调整 JDBC 连接字符串。
我继承了一个系统,其中以前的 DBA 将 7 个数据文件添加到 PRIMARY 文件组(初始大小为 8MB),并将 AUTOGROW 选项保留为 8MB。我现在拥有的是一组八个文件,每个文件大小约为 3 - 4GB,在两年内缓慢增长。我想以最快的方式删除文件碎片。
以下是我想出的选项:
或者
操作系统级别的“磁盘碎片整理”仍然不是一个选项吗?
我不知道哪个选项是最好的,或者它是否会起作用。
此外,该数据库正在被镜像和复制,因此需要重建它的工作量最少。
谢谢你的帮助。