AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[cardinality-estimates](dba)

Martin Hope
kyletme
Asked: 2020-12-28 17:51:36 +0800 CST

SQL Server基数估计警告[重复]

  • 3
这个问题在这里已经有了答案:
使用隐式类型转换插入会导致基数估计警告 1 个答案
1 年前关闭。

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

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

在此处输入图像描述

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

sql-server cardinality-estimates
  • 2 个回答
  • 449 Views
Martin Hope
Yevgeni Grinberg
Asked: 2018-06-04 23:26:23 +0800 CST

存储过程执行计划中的估计失败

  • -1

我在不同的数据库中有以下两个表:

CREATE TABLE [dbo].[UnitPermission]
(
    [userID] [varchar](10) NOT NULL,
    [unitID] [nvarchar](10) NOT NULL,

    CONSTRAINT [PK_UnitPermission] PRIMARY KEY CLUSTERED 
    (
        [userID] ASC,
        [unitID] ASC
    )
)

和

CREATE TABLE [dbo].[tb_Request]
(
    [ID] [int] NOT NULL,
    [typeID] [int] NOT NULL,
    [statusID] [int] NOT NULL,
    [userUnit] [nvarchar](10) NULL,

    CONSTRAINT [PK_tb_Request] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )
)

使用非聚集索引

CREATE NONCLUSTERED INDEX [unitIndex] ON [dbo].[tb_Request] 
(
    [userUnit] ASC
)
INCLUDE 
(
    [ID],
    [typeID],
    [statusID]
)

以下存储过程(不是我写的)导致了一些问题:

CREATE PROCEDURE [dbo].[sp_GetRequestsByFilter] 
    @userID as varchar(10)

AS
BEGIN

    SELECT 
    dbo.tb_Request.ID,
    dbo.tb_Request.userUnit

    from tb_Request
    inner join otherdb.dbo.UnitPermission on (otherdb.dbo.UnitPermission.unitID = dbo.tb_Request.userUnit or otherdb.dbo.UnitPermission.unitID like '0')
    where otherdb.dbo.UnitPermission.userID = @userID

END

在执行计划中,有一个 PK_UnitPermission 上的 Clustered Index Seek,成本为 94%,估计行数 = 1,实际行数 = 6855。

Seek Predicate:
Prefix: otherdb.dbo.UnitPermission.userID = Scalar Operator (@userID)  
Start: otherdb.dbo.UnitPermission.unitID > Scalar Operator([Expr1016]),
End: otherdb.dbo.UnitPermission.unitID < Scalar Operator([Expr1017])

是什么导致了这种估计失败?

我猜它与like '0'on 有关unitID,但不明白为什么以这种方式创建谓词。

我无法提供执行计划。这是本地网络,无法访问 www。

sql-server cardinality-estimates
  • 1 个回答
  • 74 Views
Martin Hope
wellwellwell
Asked: 2018-04-26 13:10:40 +0800 CST

实施双边零对多关系?

  • 0

如何实现以下关系?

  • 一辆车可能属于零个人或多人
  • 一个人可能拥有零辆或多辆汽车

Car理想情况下,我可以有一个联结表,它与表和表都有零到多的关系Person。那是正确的表格组织吗?

database-design cardinality-estimates
  • 1 个回答
  • 238 Views
Martin Hope
Sajid
Asked: 2018-04-18 08:20:19 +0800 CST

SQL Server 2016 兼容级别和日期时间 2

  • 3

我们已经运行 SQL Server 2016 一段时间了,但最初将数据库兼容性级别保留为 SQL Server 2008 (100)。最近我们确实将数据库兼容级别更新为 2016 (130),但我们在那里遇到的问题很少。我们设法找到了一个特定的查询,其中查询将 datetime 转换为 datetime2,当它应该返回一个值时它返回 NULL,不确定它是 CE 还是什么?请看下面的例子:

CREATE TABLE TestCE
(
    Id           INT IDENTITY(1,1),
    CurrentDateTime  DATETIME
)
GO

INSERT dbo.TestCE(CURRENTDATETIME)
SELECT GETDATE()
UNION ALL SELECT '2018-04-11 08:44:42.643'
UNION ALL SELECT '2018-04-12 09:49:45.334'
GO

SELECT * FROM TestCE 
--The resultset

1    2018-04-17 16:49:02.813
2    2018-04-11 08:44:42.643
3    2018-04-12 09:49:45.333

但是当我运行以下查询时,没有得到任何结果:

SELECT * FROM TESTCE 
  WHERE CURRENTDATETIME = CONVERT(DATETIME2, '2018-04-12 09:49:45.333') 
GO

SELECT * FROM TESTCE 
  WHERE CURRENTDATETIME = CONVERT(DATETIME2, '2018-04-11 08:44:42.643') 
GO

SELECT * FROM TESTCE 
  WHERE CURRENTDATETIME = CONVERT(DATETIME2, '2018-04-17 16:49:02.813') 

我也尝试过使用 QueryTraceOn 选项来实现后向 CE,但没有成功:

SELECT * FROM TESTCE 
  WHERE CURRENTDATETIME = CONVERT(DATETIME2, '2018-04-12 09:49:45.333') 
  OPTION(QUERYTRACEON 9481);
GO

SELECT * FROM TESTCE 
  WHERE CURRENTDATETIME = CONVERT(DATETIME2, '2018-04-11 08:44:42.643') 
  OPTION(QUERYTRACEON 9481);
GO

SELECT * FROM TESTCE 
  WHERE CURRENTDATETIME = CONVERT(DATETIME2, '2018-04-17 16:49:02.813') 
  OPTION(QUERYTRACEON 9481);

还设置了以下数据库选项,但也没有成功:

ALTER DATABASE SCOPED CONFIGURATION 
  SET LEGACY_CARDINALITY_ESTIMATION = ON

一旦我将兼容级别改回 2008,查询就会开始按预期返回数据。

sql-server-2016 cardinality-estimates
  • 1 个回答
  • 700 Views
Martin Hope
Vic Work
Asked: 2017-02-04 05:46:07 +0800 CST

日期时间到格式化日期的隐式转换

  • 2

我正在查看我的存储过程中的隐式转换,而我的 prod 数据库中最大的转换是 SQL 2014 中基数估计器发出的关于将日期时间转换为格式化日期的警告。

我已阅读以下问题: 查询计划“基数估计”中的警告和 格式化的日期时间:隐式转换但这些都没有提到 FORMAT() 删除了警告,它们只是描述问题不会得到解决,这不是我正在寻找的解决方案,FORMAT() 是一个可行的解决方案。

以前我们使用 CONVERT() 上的格式化选项来格式化日期,但任何时候我使用 CONVERT() 都会得到隐式转换。

CREATE TABLE #temptable ( [Birthdate] datetime )
INSERT INTO #temptable
VALUES
( N'1891-12-30T00:00:00' ), 
( N'1918-10-31T00:00:00' ), 
( N'1917-12-21T00:00:00' ), 
( N'1906-10-29T00:00:00' ), 
( N'1916-12-12T00:00:00' ), 
( N'1916-11-08T00:00:00' ), 
( N'1918-10-01T00:00:00' ), 
( N'1913-03-18T00:00:00' ), 
( N'1920-08-03T00:00:00' ), 
( N'1919-10-22T00:00:00' )


SELECT CONVERT(VARCHAR(26),t.Birthdate,109) AS varConvert,
        CONVERT(NVARCHAR(26), t.Birthdate, 109) AS nvarConvert,
        TRY_CONVERT(VARCHAR(26),t.Birthdate, 109) AS tryCon,
        FORMAT(t.Birthdate, 'MMM dd yyyy') AS form
FROM #temptable AS t

DROP TABLE #temptable

唯一不隐式转换为格式化日期的是 FORMAT() 函数:

在此处输入图像描述

有没有办法不使用 FORMAT() 函数并继续使用 Convert 函数返回格式化日期?即我是否需要在转换过程中延长或减少格式化日期的长度。我想避免隐式转换,但将所有 CONVERT() 重写为 FORMAT() 将比更改当前的 CONVERT 功能进行更多测试。

sql-server cardinality-estimates
  • 1 个回答
  • 807 Views
Martin Hope
Oxon
Asked: 2014-11-13 06:21:23 +0800 CST

表达式 try_cast 中的类型转换可能会影响查询计划选择中的基数估计

  • 11

我有一个运行速度很慢的查询,所以我开始研究执行计划。TRY_CAST是一种确定数据是否可以转换为类型的安全方法。并且计划中有关于 的警告TRY_CAST。

 Type conversion in expression try_cast may affect "CardinalityEstimate" in query plan choice

请注意,我不是 DBA,而是编码员。当我谈到数据库的东西时,把我当作一个新手。

提高查询速度的最佳方法应该是什么(基于此问题标题中的警告)?除此之外还有什么TRY_CAST可能有助于加快查询速度,例如,CAST它本身很容易出现异常,而我所知道的安全强制转换的唯一方法是TRY_CAST?

在此处输入图像描述

sql-server cardinality-estimates
  • 1 个回答
  • 26616 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve