【问题标题】:CardinalityEstimate query warningCardinalityEstimate 查询警告
【发布时间】:2016-09-12 10:03:16
【问题描述】:

我有一个数据库视图 (SQL Server 12.0.2269),它汇总了许多表中的数据。我刚刚注意到关于执行计划的警告(尽管它可能一直存在):

表达式中的类型转换 (CONVERT(varchar(30),[t].[RoleID],0​​)) 可能会影响查询计划选择中的“CardinalityEstimate”

它引用的实际查询代码是针对一个结果字段的:-

(SELECT 
    '|' + CAST(t.RoleID AS varchar)
 FROM Tag t
 WHERE t.SourceID = lb.ID
 FOR XML PATH('') ) + '|'
 AS TagIDs,

它会生成一个分隔 ID 的列表,例如“|10|11|12|”。 RoleID 是一个 tinyint;是复合主键的一部分,也是外键。

作为 tinyint,它永远不能超过 3 个字符,但我猜 varchar(30) 是默认值。

我可以放心地忽略此警告吗?

完整的查询是

CREATE VIEW [dbo].[LegalBodyReferenceData] AS
SELECT
	lb.ID,
	lb.DisplayName,
	lb.BirthDate,
	lb.DeathDateAndFlag as DeathDate,
	
	ti.Description AS Title,
	p.FirstNames,
	p.Surname,
	
	lb.Telephone,
	lb.Email,
	
	a.Street,
	a.Town,
	a.Region,
	a.Postcode,
	a.Country,
	
	COALESCE(cf1.ID, ccf.ID) AS ClientFileID,
	COALESCE(cf1.FileStatusID, cf2.FileStatusID) AS ClientFileStatusID,
	COALESCE(cf1.AdviserID, cf2.AdviserID) AS ClientFileAdviserID,
	COALESCE(cf1.DisplayName, cf2.DisplayName) AS ClientFileDisplayName,
	
	ISNULL(CAST(CASE WHEN p.ID IS NOT NULL THEN 1 ELSE 0 END AS bit), 0) AS IsPerson,
	ISNULL(CAST(CASE WHEN co.ID IS NOT NULL THEN 1 ELSE 0 END AS bit), 0) AS IsCorporate,
	ISNULL(CAST(CASE WHEN prov.ID IS NOT NULL THEN 1 ELSE 0 END AS bit), 0) AS IsProvider,
	ISNULL(CAST(CASE WHEN Trust.ID IS NOT NULL THEN 1 ELSE 0 END AS bit), 0) AS IsTrust,
	ISNULL(CAST(CASE WHEN cbp.ID IS NOT NULL THEN 1 ELSE 0 END AS bit), 0) AS IsCorporateBenefitProvider,
	(SELECT 
		'|' + CAST(t.RoleID AS varchar)
	FROM Tag t
	WHERE t.SourceID = lb.ID
	FOR XML PATH('') ) + '|'
	 AS TagIDs,
	NULL AS Tags,
	
	c.MaritalStatusID,
	p.Gender,
	u.ID AS UserID,
	ISNULL(CAST(CASE WHEN ad.ID IS NOT NULL THEN 1 ELSE 0 END AS bit), 0) AS IsAdviser,
	prov.UniqueIdentifier AS ProviderCode,
	CAST(c.DisplayOrder AS tinyint) AS ClientDisplayOrder,

	p.InformalSalutation AS InformalSalutation,
	ISNULL(CAST(CASE WHEN Trust.IsSimpleTrust IS NOT NULL THEN 1 ELSE 0 END AS bit), 0) AS IsSimpleTrust

FROM LegalBody lb
LEFT JOIN Address a ON a.ID = lb.PrimaryAddressID
LEFT JOIN Person p ON p.ID = lb.ID
LEFT JOIN Title ti ON ti.ID = p.TitleID
LEFT JOIN Client c ON c.ID = lb.ID
LEFT JOIN ClientFile cf1 ON cf1.ID = c.PrivateClientFileID
LEFT JOIN Corporate co ON co.ID = lb.ID
LEFT JOIN Provider prov ON prov.ID = co.ID
LEFT JOIN Trust ON Trust.ID = lb.ID
LEFT JOIN CorporateBenefitProvider cbp on cbp.ID = lb.ID
LEFT JOIN CorporateClientFile ccf ON ccf.CorporateID = co.ID
LEFT JOIN ClientFile cf2 ON cf2.ID = ccf.ID
LEFT JOIN [User] u ON u.PersonID = p.ID
LEFT JOIN [Adviser] ad ON ad.ID = u.ID

【问题讨论】:

    标签: sql sql-server view warnings


    【解决方案1】:

    忽略这些基于此项目的警告似乎很好:

    Connect Item

    对 select 子句的转换或强制转换操作不应影响基数估计器。

    【讨论】:

    • 请引用“项目”。 “忽略基于此项目的警告似乎没问题”的声明您是否有可靠的来源?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2012-12-27
    • 2016-03-30
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多