相关疑难解决方法(0)

表达式中的类型转换可能会影响查询计划选择中的“CardinalityEstimate”?

我维护一个存档数据库,该数据库将历史数据存储在分区视图中。分区列是日期时间。视图下的每个表存储一个月的数据。

我们使用日期时间列上的检查约束来约束每个表上的事件。这允许优化器限制为在事件日期时间列上过滤的查询而搜索的表。

检查约束的名称是由 SQL Server 生成的,因此通过查看名称很难知道它们的作用。

我希望约束名称的形式为“CK_TableName_Partition”。

我可以使用此查询生成重命名脚本并从 sql_text 列复制数据。WHERE 子句匹配名称看起来像是由 SQL Server 生成的检查约束:

SELECT
  checks.name AS check_name,
  tabs.name AS table_name,
  skemas.name AS schema_name,
  cols.name AS column_name,
  N'
EXECUTE sys.sp_rename
  @objname = N''' + skemas.name + N'.' + checks.name + N''',
  @newname = N''CK_' + tabs.name + N'_Partition'',
  @objtype = ''OBJECT'';' AS sql_text
FROM sys.check_constraints AS checks
INNER JOIN sys.tables AS tabs ON
  tabs.object_id = checks.parent_object_id
INNER JOIN sys.schemas AS skemas ON
  skemas.schema_id = tabs.schema_id
INNER JOIN sys.columns AS cols …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization cardinality-estimates

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

为什么我会得到从 Int / Smallint 到 Varchar 的隐式转换,它真的会影响基数估计吗?

我正在尝试对实际执行计划使用显示计划分析 (SSMS) 来解决执行缓慢的查询。分析工具指出,在计划中的几个地方,对行数的估计与返回的结果不一致,并进一步给了我一些隐式转换警告。

我不明白这些 int 到 Varchar 的隐式转换 - 引用的字段不是查询中任何参数/过滤器的一部分,并且在所有涉及的表中,列数据类型是相同的:

我收到以下 CardinalityEstimate 警告:

表达式中的类型转换 (CONVERT_IMPLICIT(varchar(12),[ccd].[profileid],0)) 可能会影响查询计划选择中的“CardinalityEstimate”——这个字段在我的数据库中到处都是整数

表达式中的类型转换 (CONVERT_IMPLICIT(varchar(6),[ccd].[nodeid],0)) 可能会影响查询计划选择中的“CardinalityEstimate”——这个字段在我的数据库中到处都是 smallint

表达式中的类型转换 (CONVERT_IMPLICIT(varchar(6),[ccd].[sessionseqnum],0)) 可能会影响查询计划选择中的“CardinalityEstimate”——这个字段在我的数据库中到处都是 smallint

表达式中的类型转换 (CONVERT_IMPLICIT(varchar(41),[ccd].[sessionid],0)) 可能会影响查询计划选择中的“CardinalityEstimate”——这个字段在我的数据库中到处都是小数

[编辑]这里是查询和实际执行计划供参考 https://www.brentozar.com/pastetheplan/?id=SysYt0NzN

和表定义..

/****** Object:  Table [dbo].[agentconnectiondetail]    Script Date: 1/10/2019 9:10:04 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[agentconnectiondetail](
    [sessionid] [decimal](18, 0) NOT NULL,
    [sessionseqnum] [smallint] NOT NULL,
    [nodeid] [smallint] NOT NULL,
    [profileid] [int] NOT NULL,
    [resourceid] [int] NOT NULL,
    [startdatetime] [datetime2](7) NOT NULL,
    [enddatetime] [datetime2](7) NOT NULL, …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan type-conversion cardinality-estimates sql-server-2017

11
推荐指数
2
解决办法
561
查看次数

SQL Server 基数估计警告

如何修复以下基数估计警告?

while exists(select 1 from @images)
begin
   declare @imageid     int
   declare @filename    varchar(max)
   select TOP (1)
      @imageid = [imageid],
      @filename = concat([imageid], '.', [extension])
   from
      @images
   order by
      [imageid]
   ...
   delete @images where [imageid] = @imageid
end
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

SQL Server 兼容级别:SQL Server 2019 (150)

sql-server cardinality-estimates

3
推荐指数
2
解决办法
266
查看次数