dbo.tblborder的表的数据库对象,这个表是非常重要的。
然而,特别是这个问题与此查询的查询计划有关,
因为我在查询计划中看到了警告(在不同的排序运算符中)
两种类型的警告,一种与溢出到tempDB相关,另一种与数据类型转换和基数估计相关。
查询和查询计划在图片之后进一步展示。
问题
由于我正在处理系统对象,我如何找出哪些对象需要更新统计信息?
或者,如何解决查询计划中的这个警告?
关于数据类型转换,有什么办法可以避免这个问题和基数估计问题吗?
也许有一些跟踪标志吗?
这是一个600GB的数据库,我想找出对特定表的所有依赖关系,仅一级就显示了325个对象,但这不是我每天都会运行的查询。我对清除这些警告感兴趣,但这不是生死攸关的问题。
信息
关于tempdb泄漏的警告的第一张图片:
第二张关于tempdb溢出的警告图片。 第三个警告 - 与数据类型转换有关,可能会影响基数估计。;WITH Radhe AS (
SELECT DISTINCT
s2.object_id,
Name=SCHEMA_NAME(S2.schema_id) + '.' + S2.Name,
ObjectType = S2.Type,
DependsOn = s1.object_id,
DependsOn_Name=SCHEMA_NAME(S1.schema_id) + '.' + S1.Name,
0 as Level
FROM sys.sysdepends DP
INNER JOIN sys.objects S1
ON S1.object_id = DP.DepID
INNER JOIN sys.objects S2
ON S2.object_id = DP.ID
WHERE S1.object_id = OBJECT_ID('DBO.tblborder')
UNION ALL
SELECT
s2.object_id,
Name=SCHEMA_NAME(S2.schema_id) + '.' + S2.Name,
ObjectType = S2.Type,
DependsOn = s1.object_id,
DependsOn_Name=s1.Name,
Level + 1
FROM sys.sysdepends DP
INNER JOIN Radhe S1
ON S1.object_id = DP.ID
INNER JOIN sys.objects S2
ON S2.object_id = DP.DepID
WHERE Level < 100
AND S1.object_id <> S2.object_id
AND S2.object_id <> OBJECT_ID('DBO.tblborder')
)
SELECT DISTINCT *
FROM Radhe
ORDER BY LEVEL DESC, DependsOn_Name
在按照如何更新数据库系统表的统计信息的方式更新统计信息之后:
DECLARE @TSql NVARCHAR(MAX) = ''
SELECT @TSql = @TSql + 'UPDATE STATISTICS sys.' + o.name + ' WITH FULLSCAN;' + CHAR(13) + CHAR(10)
FROM sys.objects o
WHERE o.type in ('S')
ORDER BY o.name
--Verify/test commands.
PRINT @TSql
与tempdb溢出相关的警告仍然存在,但是根据下面的图片,它们已经发生了变化。
虽然以下警告没有提到或解决:
在表达式中进行类型转换(CONVERT(bigint,[Bocss2].[sys].[sysobjvalues].[value],0))可能会影响查询计划选择中的"CardinalityEstimate",在表达式中进行类型转换(CONVERT(bigint,[Bocss2].[sys].[sysobjvalues].[value],0))可能会影响查询计划选择中的"CardinalityEstimate"
相关的问答如何更新数据库系统表的统计信息非常好,但似乎并没有完全解决我的问题,并且没有涉及到"cardinality estimate"警告。



