标签: sql-server-2019

创建存储过程时排序规则冲突

我正在尝试创建一个存储过程,但它给了我错误消息
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_BIN2" in the EXCEPT operation.

问题是数据库和服务器排序规则都是SQL_Latin1_General_CP1_CI_AS,但我不知道Latin1_General_BIN2排序规则来自哪里。

create procedure [ETL_1.4.0].update_valve_event_type
(
    @data nvarchar(max)
)
as
    declare @mismatch_table table(id int, [name] varchar(50))

    if isjson(@data) = 0
    begin
        ;throw 50000,'Input argument @data is invalid JSON.', 1
    end

    insert @mismatch_table (id, [name])
    select * from
    (
        select
            value as id,
            [key] as [name]
        from openjson(@data)
        except
        select
            id,
            [name]
        from enum.valve_event
    )data

    --clear mismatches that are deemed ok, e.g. spelling corrections …
Run Code Online (Sandbox Code Playgroud)

sql-server collation json sql-server-2019

3
推荐指数
1
解决办法
2743
查看次数

SQL Server:生成范围内缺失年份的行(系统年份 + 9)

我有一个 SQL Server 2019 表,其中包含某些年份的行:

with data (year_, amount) as (
select 2024, 100 union all
select 2025, 200 union all
select 2025, 300 union all
select 2026, 400 union all
select 2027, 500 union all
select 2028, 600 union all
select 2028, 700 union all
select 2028, 800 union all
select 2029, 900 union all
select 2031, 100
)
select * from data

     YEAR_     AMOUNT
---------- ----------
      2024        100
      2025        200
      2025        300
      2026        400
      2027        500
      2028        600 …
Run Code Online (Sandbox Code Playgroud)

sql-server select sql-server-2019

3
推荐指数
1
解决办法
569
查看次数

SQL 是否保证子查询中的“SELECT *”将被优化以防止完全扫描?

我正在探索扩展事件查询跟踪,并对几个奇怪的查询有疑问,如下所示:

示例1:

select top 10  *   from   (   SELECT [id]       ,[date]       ,[ordnum]       ,
[customer]  ,[amt]   ,[gm pc]   FROM [DbName].[dbo].[tblSales]  ) as [_]
where [date]>='2022-01-01T00:00:00.000'
Run Code Online (Sandbox Code Playgroud)

示例2:

select [_].[id],      [_].[date],   [_].[ordnum],  [_].[customer], [_].[amt], 
[_].[gm pc]  
from   (  SELECT [id] ,[date] ,[ordnum] ,  [customer]  ,[amt]  ,[gm pc]   
FROM [DbName].[dbo].[tblSales]  ) as [_]  where [_].[date] >= 
convert(datetime2, '2020-01-01 00:00:00') 
    and [_].[date] < convert(datetime2, '2021-01-01 00:00:00')
Run Code Online (Sandbox Code Playgroud)

因此在子查询中它选择所有行。然后在外部查询中应用 where 条件。

如果它确实像这样工作,则意味着子查询将执行全表扫描,然后将 where 子句应用于结果。或者此查询是否经过优化,以便将 where 子句直接应用于表?

sql-server sql-server-2019

3
推荐指数
1
解决办法
1030
查看次数

SQL Server 如何估计嵌套循环索引查找的基数

我试图了解 SQL Server 如何估计下面的 Stack Overflow 数据库查询的基数

首先,我创建索引

CREATE INDEX IX_PostId ON dbo.Comments
(
    PostId
)
INCLUDE
(
    [Text]
)
Run Code Online (Sandbox Code Playgroud)

这是查询:

SELECT  u.DisplayName,
        c.PostId,
        c.Text
FROM    Users u
        JOIN Comments c
            ON u.Reputation = c.PostId
WHERE   u.AccountId = 22547
Run Code Online (Sandbox Code Playgroud)

执行计划在这里

首先,SQL Server 扫描用户表上的聚集索引以返回与 AccountId 谓词匹配的用户。我可以看到它使用了这个统计数据:_WA_Sys_0000000E_09DE7BCC

在此输入图像描述

我可以看到该用户没有范围高键,因此 SQL Server 使用 avg_range 行并估计 1

在此输入图像描述

评论索引搜索的搜索谓词是

在此输入图像描述

soScalar Operator([StackOverflow2010].[dbo].[Users].[Reputation] as [u].[Reputation]表示users表中accountId为的用户的信誉值22547

我可以看到总共加载了三个统计数据:

_WA_Sys_0000000E_09DE7BCC- Users.AccountId(用于估计聚集索引查找谓词)

IX_PostId- Comments.PostId(用于估计索引查找谓词)

_WA_Sys_0000000A_09DE7BCC- 用户.声誉 (?)

SQL Server 如何得出索引查找的估计值?它无法在编译时知道 accountId 的信誉,22547因为帐户 …

sql-server execution-plan cardinality-estimates sql-server-2019

3
推荐指数
1
解决办法
298
查看次数

SELECT 查询的 TempDB GAM 争用

我有以下问题,我的 TempDB 知识还没有涵盖这一点:

  • 在 SSMS 中运行约 200 毫秒的分析查询,从应用程序启动时在 SQL Server 上继续运行 60 秒以上 - 这种情况只是偶尔发生,大多数时候问题并不存在
  • 可运行/挂起查询的队列可能会增长到同一查询文本的数十个查询,其中一个 SELECT 查询是阻止其他相同 SELECT 的头阻塞程序
  • 当可运行/挂起队列与基线相比开始显着增长时,对于相同文本和参数值的特定查询,最主要的等待是 SOS_SCHEDULER_YIELD 和 PAGELATCH_UP
  • 当问题发生时,排队的数十个查询具有相同的文字参数值(轮班开始时间戳、员工 ID 和生产区域)
  • 被挂起的查询(在我们的监控快照期间 - DBA Dash)将 PAGELATCH_UP 等待作为最主要的等待,并且它们正在等待 tempdb 中的 GAM 页面
  • 当我使用在可运行/挂起队列中不断堆积的查询参数检查 SSMS 中的执行计划时,查询不会溢出到 tempdb

服务器、数据库和数据库流量的配置:

  • 4 到 6 个核心(问题独立发生在具有不同核心数的两台不同服务器上)
  • 4 - 6 个大小统一的 TempDB 文件
  • 分配给实例的 40GB RAM
  • 在特定数据库中,启用了 RCSI + 快照(因此 TempDB 受到攻击)
  • 运行查询的两个表上没有发生删除,只有 INSERT 和 SELECT - 当时仅插入 1 行
  • SELECT 通常会命中最年轻的记录(最近插入的记录)
  • 服务器通常每秒处理 400 - 700 个批量请求;当问题出现时,与正常操作相比,它会达到峰值 1500,从而产生较高的 IO + CPU …

tempdb sql-server-2019

3
推荐指数
1
解决办法
625
查看次数

在 SQL Server 2019 中比较 Unicode 字符串文字时使用的排序规则是什么?

我的理解是,比较 Unicode 字符串文字的排序规则是由数据库排序规则决定的。

\n

我的数据库正在使用SQL_Latin1_General_CP1_CI_AS排序规则。

\n

当我将 N\'\xc3\x9f\' 与 \'ss\' 进行比较时,我预计比较会失败。但事实并非如此。我正在尝试找出原因。这是复制品:

\n
    set nocount on \n    go\n    use tempdb\n    go\n    \n    SELECT \n       @@version as SqlServerVersion,\n       CONVERT(nvarchar(128), SERVERPROPERTY(\'collation\')) as SqlServerCollation,\n     DB_NAME() AS DatabaseName\n    ,DATABASEPROPERTYEX(DB_NAME(), \'Collation\') AS CollationUsedBySQLServerDatabase\n    GO\n    declare @ss varchar(255) = \'ss\'\n    declare @Nscharfess nvarchar(255) = N\'\xc3\x9f\'\n    declare @scharfess varchar(255) = \'\xc3\x9f\'\n    \n    select case  when @Nscharfess   = @ss then \'Unicode : Strings match\' else \'Unicode : Strings do not match\' end,\n            case when @scharfess    = @ss …
Run Code Online (Sandbox Code Playgroud)

sql-server collation encoding sql-server-2019

3
推荐指数
1
解决办法
354
查看次数

授予用户还原数据库的权限

在数据库中,我创建了一个具有以下角色的用户:

服务器角色

  • 民众

数据库角色

  • db_backupoperator
  • db_ddladmin
  • db_datareader
  • db_datawriter

问题是我不想更改用户的角色,但我想授予恢复数据库的权限。

是否有解决方法只授予还原权限但不删除或更改数据库?

背景资料:

我工作的公司创建了一个应用程序,他们希望该应用程序的用户有权备份和恢复数据库,但不能创建另一个数据库或删除现有数据库。而且,他们不希望有另一个具有 角色的用户db_owner,这将允许客户随心所欲地操纵事物。

该应用程序的价格取决于客户拥有的员工人数,因此在客户端安装该应用程序时,他们使用一个文件来创建一个数据库,在其中指定所有详细信息(包括员工人数),但他们担心有人可能会多次更改文件并添加数据库,因此他们希望通过不授予任何用户执行任何操作的权限来保护实例。这很复杂,但这正是他们想要的。

sql-server permissions role restore sql-server-2019

2
推荐指数
1
解决办法
1399
查看次数

从 sys.dm_exec_query_stats 中删除了关键查询计划,而保留了琐碎的项目

运行 SQL Server Express 2019。

有一个包含 11 条 sql 语句的复杂存储过程(当从sys.dm_exec_query_statsby 中选择时plan_handle)。

其中 9 个语句是基于传入参数的简单变量设置,最后 2 个语句 ( IF/ELSE) 完成所有工作并返回数据(例如query_hash0x111... 和 0x222...)。

基于输入参数的数据量有很大的可变性,所以我用最佳值“准备”存储过程以确保快速执行。

我注意到每隔几天(有时更频繁),我的最后 2 个语句(query_hash0x111...和 ​​0x222...)被转储sys.dm_exec_query_stats,然后根据下一个存储过程中来自用户的任何参数重新生成称呼。

我通过查看creation_time列知道这一点,它反映了前 9 个查询的“启动”时间,以及query_hash0x111... 和 0x222...的稍后时间。

据我了解,缓存计划在内存压力下被清除,较少使用的计划首先被清除。我的查询被大量使用,并且我有很多其他缓存计划,其中 1 次执行会持续一段时间。

问题:为什么我最常用的查询会转储表单缓存,我该如何阻止它发生?

sql-server plan-cache sql-server-2019

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

在新服务器上托管旧的 SQL DB - 我可以设置的最大兼容性级别是多少

关于向后兼容性,我可以在一些较新版本的 SQL Server(具体是 SQL Server 2019)中托管的旧数据库上设置的最大兼容模式是什么?

在一个 MS Workshop 我被告知 SQL 2012 通常是一个安全的赌注,但我想听听是否对此有任何不同的意见。

sql-server migration sql-server-2019

2
推荐指数
1
解决办法
237
查看次数

Force_legacy_cardinality_estimation 提示问题

  1. force_legacy_cardinality_estimation 提示是否会更改整个查询(或存储过程)的基数或仅更改其应用的代码部分?(例如,如果存储过程中有多个 SELECT 语句,但提示仅在其中一个 SELECT 语句上。)
  2. 您可以在视图中使用提示吗?

sql-server sql-server-2019

2
推荐指数
1
解决办法
183
查看次数