标签: sql-server-2008-r2

SQL Server 如何知道谓词是相关的?

在诊断基数估计不佳的 SQL Server 2008 R2 查询(尽管有简单的索引、最新的统计数据等)和查询计划不佳时,我发现了一篇可能相关的知识库文章: FIX:运行查询时性能不佳包含 SQL Server 2008 或 SQL Server 2008 R2 或 SQL Server 2012 中的关联 AND 谓词

我可以猜测知识库文章中“相关”的含义,例如谓词#2 和谓词#1 主要针对相同的行。

但我不知道 SQL Server 是如何知道这些相关性的。表是否需要包含来自两个谓词的列的多列索引?SQL 是否使用统计信息来检查一列中的值是否与另一列相关?还是使用了其他方法?

我问这个有两个原因:

  1. 确定使用此修补程序可以改进我的哪些表和查询
  2. 知道我应该在索引、统计等方面做些什么来影响 #1

performance sql-server statistics sql-server-2008-r2 query-performance

15
推荐指数
1
解决办法
1611
查看次数

同一台服务器上的两个实例之间共享什么?

我们希望在单个 Windows 服务器上安装多个 SQL Server 实例。我们不能使用虚拟机,因为服务器是裸机 Windows 2008 R2。

出于安全考虑,我们需要确保两个实例不共享任何东西,包括管理、Windows 服务、帐户等。所以我猜问题是:

在 Windows 服务器上安装多个 SQL Server“实例”时,共享什么?

sql-server windows instance sql-server-2008-r2

15
推荐指数
2
解决办法
4737
查看次数

相互验证两个表的快速方法

我们正在做一个 ETL 过程。当一切都说完后,有一堆表格应该是相同的。验证这些表(在两个不同的服务器上)实际上相同的最快方法是什么?我说的是架构和数据。

我可以在表上做一个散列,就像我可以在单个文件或文件组上一样 - 将一个与另一个进行比较。我们有 Red-Gate 数据比较,但由于有问题的表每个都包含数百万行,我想要一些性能更高的东西。

一种让我感兴趣的方法是对 union 语句的这种创造性使用。但是,如果可能的话,我想进一步探索散列的想法。

发布答案更新

对于任何未来的访客......这是我最终采取的确切方法。它工作得很好,我们在每个数据库的每个表上都这样做。感谢下面的答案为我指明了正确的方向。

CREATE PROCEDURE [dbo].[usp_DatabaseValidation]
    @TableName varchar(50)

AS
BEGIN

    SET NOCOUNT ON;

    -- parameter = if no table name was passed do them all, otherwise just check the one

    -- create a temp table that lists all tables in target database

    CREATE TABLE #ChkSumTargetTables ([fullname] varchar(250), [name] varchar(50), chksum int);
    INSERT INTO #ChkSumTargetTables ([fullname], [name], [chksum])
        SELECT DISTINCT
            '[MyDatabase].[' + S.name + '].['
            + T.name + ']' …
Run Code Online (Sandbox Code Playgroud)

sql-server etl sql-server-2008-r2 except

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

强制 SQL Server 按照书面形式运行查询条件?

我正在使用 SQL Server 2008 R2 并且我有这个伪查询 (SP):

select ...
from ...
WHERE    @LinkMode IS NULL
     AND (myColumn IN (...very long-running query...))
     ...
     ...
Run Code Online (Sandbox Code Playgroud)

问题是查询需要很长时间才能执行——即使我使用@LinkMode=2.

正如您所注意到的,只有当 @LinkMode 为 null 时才应该执行长时间运行的查询,而这里不是这种情况。在我的情况下 @LinkMode = 2 !

但是,如果我将其更改为:

 select ...
    from ...
    WHERE    1=2
         AND (myColumn IN (...very long time exeted query...))
     ...
     ...
Run Code Online (Sandbox Code Playgroud)

SP确实跑得很快。

我以前听说有时优化器可以优化标准的顺序。

所以我问:

  • 即使优化器选择了不同的路由,还有什么比检查 if 更快=null?我的意思是,我认为检查if a==null比正在运行的其他长的查询速度更快...

  • 如何强制SQL Server 按照我编写的方式运行查询(相同的顺序)?

sql-server optimization sql-server-2008-r2

15
推荐指数
2
解决办法
5347
查看次数

供应商希望每 5 分钟为业务应用程序运行一次 MSDB 作业

我们有一个 3rd 方供应商试图集成 2 个不同的应用程序,其中两个数据库都驻留在我们的 SQL Server 实例上与 150 多个其他数据库,并且他们想要创建一个 MSDB 作业以每 5 分钟“同步”2 个不同的应用程序(起初他们想每分钟运行一次)。

我最初的预感是,他们应该在应用程序层中以某种方式使用 Windows 计划作业,或者甚至是一个可怕的触发器(我们通常在这种情况下使用)来执行此操作。

我更喜欢为 DBA 任务保留尽可能多的 MSDB 作业以减少那里的混乱,并且在查看具有这样的超级活跃作业的作业历史记录时也会遇到 MSDB 的缓慢查询(这也会淹没和丢弃重要的作业历史记录)更重要的事情,如备份历史)。但话又说回来,也许我的偏好是错误的,我需要为 MSDB 中的应用程序层腾出一些空间,卷起袖子,解决工作历史需要永远加载的问题,当我需要保留更多历史条目来捕获重要的东西,如备份(或清除超活跃作业条目)。

我遇到的另一个问题是,现在我需要在供应商通过 GUI 执行升级时为其数据库授予“系统管理员”权限,而不仅仅是“dbo”权限,并希望他们不会炸毁我的关键任务实例DB 是(整合的缺点之一)。

我想我可以把它们放在另一个“分离”的情况下,我们把所有的不玩好供应商,但这时我们就需要重新配置应用程序以指向新的SQL实例(可惜在这种情况下,不平凡的)。

供应商已经反驳了我关于触发器有多糟糕的担忧。因此,我对此进行了“谷歌搜索”,但结果是空的。有没有人在那里看到任何“权威性的”链接,认为这是一个坏主意,我可以向他们推荐吗?还是我应该接受他们的方法?

我不相信我在寻求帮助之前曾在 sql 论坛上发过帖子,所以希望我的查询得到了正确的框架。

编辑:我们正在运行 SQL Server 2008 Enterprise R2 x64 SP1(感谢您指出我忘记提及版本!)。嗯,希望他们在我们升级到更新版本时不需要更改他们的 MSDB 升级脚本。

谢谢你的时间!富有的

sql-server sql-server-2008-r2

15
推荐指数
1
解决办法
1442
查看次数

sp_procedure_params_90_rowset 上的过度编译阻塞

这个问题在 MSDN 上再次出现:Blocked-process-report: what is this waitresource "OBJECT: 32767:124607697:0 [COMPILE]"

我在 Profiler 中发现了这些语句。它们的持续时间都超过 3 秒。一些超过 10+。阻止活动与来自MSDN的链接相同。

调用都使用 3 部分命名。都指定了一个不同的过程,它们看起来像下面这样:

exec [db1].[sys].sp_procedure_params_90_rowset N'proc1', 1, NULL, NULL
exec [db2].[sys].sp_procedure_params_90_rowset N'proc2', 1, NULL, NULL
exec [db3].[sys].sp_procedure_params_90_rowset N'proc3', 1, NULL, NULL
exec [db4].[sys].sp_procedure_params_90_rowset N'proc4', 1, NULL, NULL
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来减少这种级别的阻塞?

(编辑)我现在看到同样的事情:

exec [db1].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db2].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db3].[sys].sp_primary_keys_rowset N'view1', N'dbo'
exec [db4].[sys].sp_primary_keys_rowset N'view1', N'dbo'
Run Code Online (Sandbox Code Playgroud)

有系统性的事情正在发生,但我不知道还能做什么。调用者是通过 ADO 的 VB6。是 ADO 进行这些调用。

下面是一个被阻止的进程报告示例

 <blocked-process-report>
    <blocked-process>
        <process
            id="process5bc1288"
            taskpriority="0"
            logused="0"
            waitresource="OBJECT: 32767:124607697:0 [COMPILE]" …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008-r2 blocking

15
推荐指数
1
解决办法
1534
查看次数

资源池“内部”中的系统内存不足,无法运行此查询

我们的一台生产服务器在日志中报告错误

错误:701,严重性:17,状态:123
。资源池“内部”中的系统内存不足,无法运行此查询。

我搜索了这个错误,发现它是一个错误,并且有一个带有 service pack 2 的热修复。这些是服务器的详细信息:

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 标准版(64 位)
处理器数量:24(有 2 个 NUMA 节点,每个有 12 个内核)
内存:为 SQL Server 分配 24GB RAM。
查询批量/分钟:5000+

我的问题是

  • 为什么我们会收到此错误?
  • 这是一个严重的问题吗?
  • 我们如何解决?

编辑内存状态:

MEMORYBROKER_FOR_RESERVE (internal) Pages ---------------------------------------- ---------- Allocations 200362 Rate 4510 Target Allocations 200362 Future Allocations 588626 Overall 2521497 Last Notification 0
MEMORYBROKER_FOR_STEAL (internal) Pages ---------------------------------------- ---------- Allocations 431548 Rate 1973 Target Allocations 323529 Future Allocations 0 Overall 2521497 Last Notification 2
MEMORYBROKER_FOR_CACHE (internal) Pages …
Run Code Online (Sandbox Code Playgroud)

sql-server full-text-search sql-server-2008-r2

15
推荐指数
1
解决办法
6436
查看次数

查询大量数据行之间的详细差异

我有许多大表,每个表都有 > 300 列。我正在使用的应用程序通过在辅助表中复制当前行来创建更改行的“档案”。

考虑一个简单的例子:

CREATE TABLE dbo.bigtable
(
  UpdateDate datetime,
  PK varchar(12) PRIMARY KEY,
  col1 varchar(100),
  col2 int,
  col3 varchar(20),
  .
  .
  .
  colN datetime
);
Run Code Online (Sandbox Code Playgroud)

存档表:

CREATE TABLE dbo.bigtable_archive
(
  UpdateDate datetime,
  PK varchar(12) NOT NULL,
  col1 varchar(100),
  col2 int,
  col3 varchar(20),
  .
  .
  .
  colN datetime
);
Run Code Online (Sandbox Code Playgroud)

在 上执行任何更新之前dbo.bigtable,将在 中创建该行的副本dbo.bigtable_archive,然后dbo.bigtable.UpdateDate使用当前日期进行更新。

因此,UNION将两个表放在一起并分组按PK创建更改的时间线,按 排序时UpdateDate

我希望创建一个报告,详细说明行之间的差异,ordered by UpdateDate, grouped by PK,格式如下:

PK,   UpdateDate,  ColumnName,  Old Value, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2

15
推荐指数
3
解决办法
637
查看次数

在 SSMS 中将结果另存为 CSV *with* 标题

使用 SQL Server 2008 R2,当我将结果另存为 CSV 时,没有标题。我可以通过使用 "Copy with Headers" 复制和粘贴来解决这个问题,或者只是获取标题并将它们粘贴到 CSV 等中,但是有没有更好的方法来做到这一点?

sql-server ssms sql-server-2008-r2 csv

14
推荐指数
2
解决办法
4万
查看次数

正在恢复数据库“MyDb”。等待恢复完成

我得到了这样的错误:

正在恢复数据库“MyDb”。等待恢复完成。

那时我做了一个危急的手术。

造成这种情况的原因是什么?以及如何避免?

sql-server sql-server-2008-r2 recovery

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