DMV sys.dm_exec_query_stats中last_worker_time和last_elapsed_time是什么意思,它们之间有什么区别?
当我触发以下查询时
SELECT TOP 20
qs.last_worker_time, qs.last_worker_time/1000000 last_worker_time_in_S,
qs.last_elapsed_time, qs.last_elapsed_time/1000000 last_elapsed_time_in_S
FROM sys.dm_exec_query_stats qs
order by qs.last_worker_time desc
Run Code Online (Sandbox Code Playgroud)
我得到如下结果。

我注意到的事情是两者相等或经过的时间超过工作时间。我想了解两者的重要性,因此它也可能有助于我进行性能调整。
我有一个测试环境,设置如下:
我们正在测试升级到 SQL Server 2012 Developer Edition (sp1) 的过程...
我已经下载了 64 位 SQL Server 2012 Dev 的 iso。(sp1) 来自 MSDN(完整许可副本),并已开始走上升级之路。在开始检查不同标准的最后阶段之一,我们遇到了一个奇怪的问题,如下所述:
Rule "Upgrade architecture mismatch" failed. The CPU architectures of upgrading feature(s) are different. To upgrade these features, Setup architecture must be the same as the features being installed.
Run Code Online (Sandbox Code Playgroud)
此外,在升级日志文件中,我发现了以下(更详细的)输出:
(03) 2012-12-28 14:02:45 Slp: Init rule target object: Microsoft.SqlServer.Configuration.SetupExtension.BlockMixedArchitecture …Run Code Online (Sandbox Code Playgroud) replication sql-server-2005 sql-server sql-server-2012 merge-replication
我有一个将两条记录插入到表中的存储过程,记录之间的区别在于第二条记录的时间列在第一条@MinToAdd之后:
CREATE PROCEDURE CreateEntry
/*Other columns*/
@StartTime time(2),
@EndTime time(2),
@MinutesToAdd smallint
AS
BEGIN
SET NOCOUNT ON;
SET @MinutesToAdd = @MinutesToAdd % 1440; --Prevent overflow if needed?
IF (@MinutesToAdd > 0)
BEGIN
INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
OUTPUT inserted.id
VALUES
(/*Other columns*/ @StartTime, @EndTime),
(/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
END
ELSE
BEGIN
/*Whatever ELSE does.*/
END
END
Run Code Online (Sandbox Code Playgroud)
将@MinutesToAdd分钟添加到@StartTime和的正确方法是什么@EndTime?
请注意我使用的是time数据类型。
更新:
正确答案应包含以下信息:
time数据类型。 …使用 SQL Server 时,可以有多个应用程序主机访问它,每个应用程序可以有一个或多个连接。每个连接都可能有多个事务(如果我错了,请纠正我)。每个事务都可以执行查询或非查询 SQL。
根据我的经验,如果我查询一个被独占锁定的表,我很容易遇到超时。如果两个不同的应用程序锁定同一资源,我还看到 SQL Server 检测并抛出死锁异常而不是超时。我还显示了重建索引超时,这可能是由于有人仍然连接到表。
但是,我也遇到了一种死锁,SQL Server 没有检测到它或超时。在这个应用程序中,它打开了两个连接,两个独立的事务,其中第一个事务锁定了一个资源,第二个事务尝试访问相同的资源,但它没有关闭第一个事务。
有人会提供超时和/或死锁类型的列表,这将帮助我在处理应用程序时避免此类情况。
我见过几个人SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在阅读系统 DMV 之前打电话。是否有任何理由这样做,假设您没有在同一事务中混合调用 DMV 和表?
我的应用程序中有很多查询,其中在 have 子句中,我将 count 聚合函数与 int 变量进行了比较。在查询计划中,我可以在比较之前看到一个implicit_convert。我想知道为什么会发生这种情况,因为根据 sql server 文档,count 函数的返回类型是 int。那么为什么要进行隐式转换来比较两个 int 值呢?
以下是一个这样的查询计划的一部分,其中 @IdCount 被定义为一个 int 变量。
|--过滤器(WHERE:([Expr1022]=[@IdCount])) |--计算标量(DEFINE:([Expr1022]=CONVERT_IMPLICIT(int,[Expr1028],0))) |--Stream Aggregate(GROUP BY:([MOCK_DB].[dbo].[Scope].[ScopeID]) DEFINE:([Expr1028]=Count(*)))
我总是看到并将我的列别名写为
SELECT 1 as ColumnName
Run Code Online (Sandbox Code Playgroud)
但是今天遇到了一个使用的查询
SELECT ColumnName = 1
Run Code Online (Sandbox Code Playgroud)
这两个查询的执行方式有什么不同吗?或者 DBA 之间是否有关于使用哪一个的标准?
我个人认为,第二个会更容易阅读/(很好的例子保持更长的列定义在这里从这篇文章),但我从来没有见过,所以今天很奇怪,之前使用的第二语法,如果有某种原因,我不应该使用它。
我有一个带有多个连接的查询,它需要很长时间才能返回一个日期的数据。我已经创建了一个索引视图。在创建视图和索引时,我适当地设置了所有必需的选项。
我想利用索引视图的优势,如果我在其他地方有类似的查询或完全相同的查询,查询优化器会选择索引视图,以便提高性能。我尝试使用用于创建索引的完全相同的查询(带有额外的日期过滤器),但查询计划似乎没有改变。即使我在查询中显式使用视图,视图上的索引仍未使用。我只能让查询优化器使用带有 noexpand 提示的索引。请注意,我使用的是 SQL Server 企业版。
有什么建议?
我们有这个打算“缩小”的大型数据库(> 1TB)。数据库围绕一个主要实体,我们称之为“访问”。为了讨论,假设它是一个医疗实践的数据库。
共有30个访问“类型”,例如程序、年度、随访、免疫等,每个访问“类型”都是“访问”的子表,例如“visit_immuno”。
该数据库自 2000 年以来已经积累了大约 12 年的数据。有人建议我们将大约 3 年的数据保留在“实时”版本中,而将其余的数据保留在“旧数据”数据库中。日期仅存储在“访问”表中,因为它是标准化的。Visit 表还包含一个ROWVERSION列和一个BIGINT伪标识(集群)列。出于所有意图和目的,假设集群键由 SEQUENCE (SQL Server 2012 Enterprise) 填充 - 我们将其命名为cid。
在visit.date当医生的推移延长探视,并与他的数据的“公文包”的回报并不总是以相同的顺序作为聚集键,例如,它被合并到主表。“访问”表也有一些更新,这将导致ROWVERSION列与cid和date列不同步- 简单地说,由于这个原因,ROWVERSION也cid不会制作合适的分区键。
从“实时”中删除数据的业务规则是visit.date必须大于 36 个月并且visit_payment必须存在子记录。此外,“old_data”数据库不包含任何基表,除了visit%.
所以我们最终得到:
直播DB(日常使用) -所有表老数据DB -对于较旧的数据visit%表
该提案要求一个组合数据库,它是一个外壳,其中包含(除外)中所有基表的同义词以及跨两个数据库中的表联合所有的视图。Live DBvisit%visit%
假设在Old-Data数据库中创建了相同的索引,查询会在 UNION-ALL视图上表现良好吗?什么类型的查询模式可能会影响 UNION-ALL视图的执行计划?
我正在尝试删除所有用户,但出现错误:
Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_M02ArticlePersons_M06Persons". The conflict occurred in database "workdemo.no", table "dbo.M02ArticlePersons", column 'M06PersonId'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)
查询:
DELETE FROM [workdemo.no].[dbo].[M06Persons]
WHERE ID > '13'
GO
Run Code Online (Sandbox Code Playgroud)
似乎我需要使用,on delete cascade;但我被卡住了。