标签: sql-server-2019

“tempdb 元数据内存优化”配置选项

检查 SQL Server 2019 CTP 2.5 (15.0.1500.28) 我发现了这个新的配置选项,并在它背后徘徊。到目前为止找不到任何信息,想知道您是否知道在哪里可以找到更多信息?

sql-server tempdb memory-optimized-tables sql-server-2019

5
推荐指数
1
解决办法
278
查看次数

标量 UDF 内联是否损坏?

此 SQL 代码返回“a”而不是“asdfg”:

CREATE FUNCTION [dbo].[GetPayload2] (@ID int) RETURNS VARCHAR(300) AS
BEGIN
IF @ID = 1
RETURN 'asdfg'
RETURN ''
END
GO
SELECT dbo.GetPayload2(1)
Run Code Online (Sandbox Code Playgroud)

转载于 15.0.2000.5 和 15.0.2070.41。在 SQL Server 2017 中工作正常。解决方法是使用 WITH INLINE = OFF。

编辑:如果您同意这是一个错误,请在此处投票:https : //feedback.azure.com/forums/908035-sql-server/suggestions/39190126-sql-server-2019-scalar-functions-with-inline-are -b

编辑 2:用于 MS SQL Server 2019 的 CU2 正在解决这个问题:-)

t-sql sql-server-2019

5
推荐指数
1
解决办法
133
查看次数

尽管定义了 RETURN VARCHAR(10),但用户定义的函数仅返回第一个字符?

每个人,

我无法弄清楚以下用户定义函数中缺少什么:

CREATE OR ALTER FUNCTION ufn_GetSalaryLevel(@Salary money)
RETURNS VARCHAR(10)
AS
BEGIN 
    IF (@Salary < 30000) RETURN 'Low';
    ELSE IF (@Salary <= 50000) RETURN 'Average';
    ELSE RETURN 'High';
    RETURN '';
END;

SELECT dbo.ufn_GetSalaryLevel(100440)
Run Code Online (Sandbox Code Playgroud)

输出仅包括“低”/“平均”/“高”返回值的第一个字符:

-----------------------------------------------------------------------
H

(1 row affected)
Run Code Online (Sandbox Code Playgroud)

为什么 MS SQL Server Management Studio 不考虑 VARCHAR(10)?

提前致谢!

Ps 请在下面找到我的输出 - 我不明白为什么它不能按预期工作?

在此处输入图片说明

ps2:该函数只有一个参数,我好像没有找到另一个同名的函数……下面可以找到与该函数相关的代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
CREATE FUNCTION …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql functions sql-server-2019

5
推荐指数
1
解决办法
566
查看次数

使用局部变量时散列连接提示返回错误

下面的查询使用 StackOverflow2010 示例数据库:

DECLARE @Id INT = 18471

SELECT c.UserId FROM dbo.Comments AS c
INNER HASH JOIN dbo.Users AS u
ON c.UserId = u.Id
AND c.UserId = @Id
Run Code Online (Sandbox Code Playgroud)

使用散列连接提示,它返回以下错误:

由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询

当我添加时它有效 OPTION(RECOMPILE)用字符串文字或替换变量。

什么可能导致这个问题?

sql-server hints execution-plan parameter sql-server-2019

5
推荐指数
0
解决办法
167
查看次数

SQL Server 2019 列存储索引 - 维护

我在用于日志记录的表上有一个聚集的列存储索引 - 仅插入(但不是批量插入)。当前的表统计是:

  • 3541 百万行
  • 6.6 GB 预留空间

我今天早上通过以下操作看到以下操作sp_whoisactive

ALTER INDEX [...] ON [...].[...] 
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
Run Code Online (Sandbox Code Playgroud)

我使用以下查询来检查row_group_id我们有多少行:

SELECT
    tables.name AS table_name,
    indexes.name AS index_name,
    partitions.partition_number,
    dm_db_column_store_row_group_physical_stats.row_group_id,
    dm_db_column_store_row_group_physical_stats.total_rows,
    dm_db_column_store_row_group_physical_stats.deleted_rows,
    dm_db_column_store_row_group_physical_stats.state_desc,
    dm_db_column_store_row_group_physical_stats.trim_reason_desc
FROM sys.dm_db_column_store_row_group_physical_stats
INNER JOIN sys.indexes
ON indexes.index_id = 
    dm_db_column_store_row_group_physical_stats.index_id
AND indexes.object_id = 
    dm_db_column_store_row_group_physical_stats.object_id
INNER JOIN sys.tables
ON tables.object_id = indexes.object_id
INNER JOIN sys.partitions
ON partitions.partition_number = 
    dm_db_column_store_row_group_physical_stats.partition_number
AND partitions.index_id = indexes.index_id
AND partitions.object_id = tables.object_id
Run Code Online (Sandbox Code Playgroud)

我们33831048576行和很少的行来排列组,如下所示: …

sql-server t-sql columnstore sql-server-2019

5
推荐指数
1
解决办法
195
查看次数

在我看来,如何实现谓词下推

我有一个报告表(大约 10 亿行)和一个很小的维度表:

CREATE TABLE dbo.Sales_unpartitioned (
    BusinessUnit    int NOT NULL,
    [Date]          date NOT NULL,
    SKU             varchar(8) NOT NULL,
    Quantity        numeric(10, 2) NOT NULL,
    Amount          numeric(10, 2) NOT NULL,
    CONSTRAINT PK_Sales_unpartitioned PRIMARY KEY CLUSTERED (BusinessUnit, [Date], SKU)
);

--- Demo data:
INSERT INTO dbo.Sales_unpartitioned
SELECT severity AS BusinessUnit,
       DATEADD(day, message_id, '2000-01-01') AS [Date],
       LEFT([text], 3) AS SKU,
       1000.*RAND(CHECKSUM(NEWID())) AS Quantity,
       10000.*RAND(CHECKSUM(NEWID())) AS Amount
FROM sys.messages
WHERE [language_id]=1033;

--- Artificially inflate statistics of demo data:
UPDATE STATISTICS dbo.Sales_unpartitioned WITH ROWCOUNT=1000000000;

--- …
Run Code Online (Sandbox Code Playgroud)

optimization sql-server-2019 query-performance

5
推荐指数
1
解决办法
228
查看次数

计算区间表的集合差

我经常遇到以下问题。我有两张间隔表。它们受日期限制(没有时间部分)。每个表中的间隔不重叠。

开始时间 结束时间
2015-01-03 2015-03-02
2015-03-05 2015-04-01
开始时间 结束时间
2015-01-07 2015-02-27
2015-03-01 2015-03-13
2016-01-01 2016-01-02

我想找到两个表的集合差异,即代表第一个表中而不是第二个表中的时间的间隔。

上面的虚拟示例所需的输出:

开始时间 结束时间
2015-01-03 2015-01-06
2015-02-28 2015-02-28
2015-03-14 2015-04-01

即,如果第一个表的日期在下面用黄色标记,并且第二个表的范围用框包围,我将寻找未装箱的黄色日期的连续范围。

在此输入图像描述

我目前将两端都视为包含间隔,并使用 DateTime 作为时间戳。我当前的方法是通过三重自连接(恶心)获取第二个表的补集,然后通过连接将结果与第一个表相交。不好玩。

有更好的方法吗?

sql-server datetime interval sql-server-2019

5
推荐指数
1
解决办法
357
查看次数

门号 1、2 或 3?...安全更改、错误或从 SQL Server 2016 就地升级到 SQL Server 2019 的升级失败?

我做了什么:

ServerA最近,我测试了在运行 SQL Server 2016 (SP 2 CU17) 标准版到 SQL Server 2019 标准版的开发服务器上进行就地升级。(我知道这不是进行升级的首选方法,但同样只是在开发服务器上进行测试,所以没有坏处。)

在安装向导过程中,其中一个步骤挂起很长时间,因此我的同事单击“下一步”按钮跳过该步骤。我不太记得那是哪一步,但我相信它是产品更新或安装设置文件步骤。我记得接下来它说它跳过了几种不同类型的下载。剩下的安装一切顺利,顺利完成。

我能够启动实例、登录并访问我们的数据库。然后,我将数据库兼容级别提高到 150(SQL Server 2019 的兼容级别)。我运行了一些性能测试查询,然后最终决定打开旧基数估计器。到目前为止一切似乎都正常。

发生的事情是:

然后我注意到 上有一些有趣的事情ServerB,这是另一台已经运行 SQL Server 2019 的开发服务器,并且有一个指向 的链接服务器设置ServerA。一切都运行良好ServerB,除了任何跨链接服务器引用视图的查询,ServerA该视图在其中使用架构绑定标量函数。我收到错误The EXECUTE permission was denied on the object 'MyFunction', database 'Database1OnServerA', schema 'dbo'。如果我返回ServerA并更改该函数并WITH SCHEMABINDING注释掉该行,则ServerB可以从再次引用该函数的视图中进行选择。

附加信息:

链接服务器对象中使用的帐户是一个 SQL Server 登录帐户ServerA,只有映射db_datareader到它的角色(当然除了数据库角色之外)。没有对其设置额外的细粒度权限,并且也仅分配有服务器角色。Database1ServerAPublicPublic

有趣的是,我的问题的另一种解决方案是向链接服务器帐户或专门授予链接服务器帐户的EXECUTE权限。但在升级到 SQL …

sql-server upgrade linked-server sql-server-2016 sql-server-2019

5
推荐指数
1
解决办法
227
查看次数

时态表:每次更新时多次插入?

实际问题: sql 2019 服务器中是否有任何东西(除了触发器之外)可以导致在临时表中更新单行时在历史表中插入多行?

背景: 我有一个名为 Candidate 的现有表,它没有计算列,也没有触发器。我实现版本控制如下:

ALTER TABLE dbo.Candidate 
     ADD BeginDate datetime2 GENERATED ALWAYS AS ROW START NOT NULL DEFAULT SYSUTCDATETIME(),
     EndDate datetime2 GENERATED ALWAYS AS ROW END NOT NULL DEFAULT CAST('9999-12-31 23:59:59.9999999' AS datetime2),
     PERIOD FOR SYSTEM_TIME (BeginDate,EndDate)
GO

ALTER TABLE dbo.Candidate
     SET(SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Candidate_History, DATA_CONSISTENCY_CHECK = ON))
Run Code Online (Sandbox Code Playgroud)

当我对表进行更新时,即使是单个列( update候选集 lastContacted = '2021-10-16 23:27:46.927' where id = 44999 )也会有多行添加到历史表中:

| BeginDate | EndDate |
| --------- | ------- |
| 2022-01-24 08:25:55.3718538 | 2022-01-24 …
Run Code Online (Sandbox Code Playgroud)

sql-server temporal-tables sql-server-2019

5
推荐指数
1
解决办法
881
查看次数

SQL Server / SSMS 占用大量磁盘空间

我为我的大学课程安装了 SQL Server + SSMS,从那时起我的磁盘空间就丢失了(每隔一段时间,就会丢失大约 3 GB 的空间)。我强烈怀疑 SQL Server 和/或 SSMS 有问题(因为它只在我安装它们之后发生),但是我不知道如何找到丢失的空间。它是否进行了大量的日志记录?备份?不知道。

我可以在哪里找到该磁盘空间和/或检查它是否是 SQL Server 和/或 SSMS 的恶作剧?

感谢您的时间。

注意:我使用的是 SSMS 18.9.1 和 SQL Server 2019 开发人员版。我也许可以更新,但出现的任何问题都将是我因偏离官方提供的版本而造成的。

sql-server ssms disk-space sql-server-2019

5
推荐指数
1
解决办法
5001
查看次数