在诊断基数估计不佳的 SQL Server 2008 R2 查询(尽管有简单的索引、最新的统计数据等)和查询计划不佳时,我发现了一篇可能相关的知识库文章: FIX:运行查询时性能不佳包含 SQL Server 2008 或 SQL Server 2008 R2 或 SQL Server 2012 中的关联 AND 谓词
我可以猜测知识库文章中“相关”的含义,例如谓词#2 和谓词#1 主要针对相同的行。
但我不知道 SQL Server 是如何知道这些相关性的。表是否需要包含来自两个谓词的列的多列索引?SQL 是否使用统计信息来检查一列中的值是否与另一列相关?还是使用了其他方法?
我问这个有两个原因:
performance sql-server statistics sql-server-2008-r2 query-performance
我们希望在单个 Windows 服务器上安装多个 SQL Server 实例。我们不能使用虚拟机,因为服务器是裸机 Windows 2008 R2。
出于安全考虑,我们需要确保两个实例不共享任何东西,包括管理、Windows 服务、帐户等。所以我猜问题是:
在 Windows 服务器上安装多个 SQL Server“实例”时,共享什么?
我们正在做一个 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 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 按照我编写的方式运行查询(相同的顺序)?
我们有一个 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 升级脚本。
谢谢你的时间!富有的
这个问题在 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) 我们的一台生产服务器在日志中报告错误
错误: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) 我有许多大表,每个表都有 > 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 2008 R2,当我将结果另存为 CSV 时,没有标题。我可以通过使用 "Copy with Headers" 复制和粘贴来解决这个问题,或者只是获取标题并将它们粘贴到 CSV 等中,但是有没有更好的方法来做到这一点?
我得到了这样的错误:
正在恢复数据库“MyDb”。等待恢复完成。
那时我做了一个危急的手术。
造成这种情况的原因是什么?以及如何避免?
sql-server ×9
blocking ×1
csv ×1
etl ×1
except ×1
instance ×1
optimization ×1
performance ×1
recovery ×1
ssms ×1
statistics ×1
windows ×1