标签: sql-server

检查计划缓存而不是查询存储有哪些优点和缺点?

即使对于相同的查询,计划缓存和查询存储也不相同。当寻找特定查询或一组相关查询的性能或监视信息时,每个查询的优点/缺点是什么?

我的在线研究表明的总体​​印象是,查询存储可以比计划缓存更快地查询(我不确定为什么),并且它的条目往往持续更长时间(这是可配置的),但我没有发现任何说法关于计划缓存优于查询存储的情况。

假设我不关心 SQL Server 2017 和 2022 引入的使用查询存储进行自动性能调优的功能。相反,假设我比较查询存储和计划缓存是出于两者可以执行的任务的目的。

monitoring sql-server t-sql plan-cache query-store

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

我如何决定应删除哪些重复统计信息?

我在 SQL Server 上运行查询发现重复的统计信息。本次查询结果返回 1 条记录。在 AutoCreatedStatistics 列下显示“_WA_Sys_XX”,在 Index 列下显示“_dta_index_XX”。据我了解,这两个是重复的。我想删除其中 1 个。但我该如何决定应该删除哪一个呢?做出决定后,为了从 SSMS 中删除统计信息,我需要将鼠标悬停在统计信息上,右键单击并查找删除按钮,但删除按钮显示为灰色。有谁知道为什么它看起来是灰色的?

sql-server

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

移动模型数据库后 SQL Server 2008 R2 无法启动

移动模型数据库后,SQL Server 2008 R2 无法启动。有任何想法吗?错误:945,严重性:14,状态:2。有什么想法吗?Sql 2008 R2 不会以trace -f -T3608 或单用户模式-m 启动。需要参数来启动短信以将模型移回原处。

sql-server sql-server-2008-r2 system-databases

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

SQL Server 中的公制到标准单位转换

我给出了两个表格的简化版本,如下所示。

表记录

ID  unit  val
--- ---   ---
1   KV    3
1   BAR   4
2   KV    7
2   KG    5
3   C     37
Run Code Online (Sandbox Code Playgroud)

表单位

unit    convUnit    formula
---     ---         ---
KV      CV          @val * .865
KG      lbs         @val / 2.205
BAR     PSI         @val / 14.504
C       F           @val * 9/5 + 32
Run Code Online (Sandbox Code Playgroud)

我将无法更改表结构。

我知道哪个单位将转换为哪个单位(即我知道 KV 将转换为 CV,KG 将转换为磅等..)。

请注意,公式是一varchar列,我从表格tblRecords.unit中引用了tblUnit.unit

但我的问题是如何在单个查询中动态计算公式。即我想要以下输出。

ID  unit    val     convVal(column will be counted on the fly using formula stored in tblUnit.formula …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql

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

什么阻止了“SELECT...WITH(NOLOCK)”?

在关注 BrentOzar 的“索引重建期间离线多少? ”时,我很好奇运行:

SELECT Quantity FROM [Production].[TransactionHistory]  WITH(NOLOCK)
Run Code Online (Sandbox Code Playgroud)

在执行上述文章中的重建时,观察到它被延迟,直到索引重建完成

什么是阻塞SELECT ... WITH(NO LOCK)以及如何避免它?

更新:
Windows NT 6.1 上 的 Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
企业评估版(64 位)(内部版本 7601:Service Pack 1)

index sql-server index-tuning

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

什么会导致 SQL Server 2008R2 上的读取速度变慢?

我们的主数据库大小为 15GB。服务器有 16GB RAM。我们使用简单的恢复模型。

最近,我们注意到我们的自定义应用程序查找(只是使用即席 SQL 语句进行基本读取)速度明显减慢。大多数情况下会多几秒钟。

我不是 SQL Server 管理员,并且不知道接下来该去哪里。

我们监控了CPU,它似乎从未达到峰值。与 RAM 相同。我们有大量的索引,但我认为这只是写入速度的问题......

对我下一步可以看什么有什么建议吗?

sql-server database-tuning sql-server-2008-r2

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

如果表存在而不使用 sp_executesql 更新表中的行

我有一种情况,我需要对大量类似的数据库运行查询。他们中的大多数人都会有一个表,我需要更新其中的一些行,但其中一些人没有该表。

我想编写一个查询,该查询具有IF检查表是否存在EXEC sp_executesqlUPDATE语句,而无需使用该语句。有没有办法在 SQL Server 中做到这一点?

这是我今天正在做的一个例子:

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[MyTableName]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
  -- this is what I want to be able to do but cannot
  UPDATE [dbo].[MyTableName] SET [SomeColumn] = NULL WHERE [SomeColumn] NOT IN (1, 2, 3)

  -- this is the only way I know to do this without an error
  EXEC sp_executesql N'UPDATE [dbo].[MyTableName] SET [SomeColumn] = NULL WHERE [SomeColumn] NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2017

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

在 cast/convert 中使用 varchar(max) 而不是 varchar(n) 对性能有什么影响吗?

考虑以下表达式,它从日期时间值截断(不舍入)毫秒数:

declare @now datetime2 = sysdatetime();
select @now;
select convert(datetime2, convert(varchar(20), @now, 120));

-- Output
2021-07-30 09:38:33.5566666
2021-07-30 09:38:33.0000000
Run Code Online (Sandbox Code Playgroud)

请注意varchar(20). 我不喜欢那个特定的长度值,因为如果我应该更改我的数据类型,可能会丢失数据:

declare @now datetimeoffset = sysdatetimeoffset() at time zone 'Pacific Standard Time';
select @now;
select convert(datetimeoffset, convert(varchar(20), @now, 120));

-- Output
2021-07-30 02:39:12.7200000 -07:00
2021-07-30 02:39:12.0000000 +00:00 -- oops, we lost the time zone too!
Run Code Online (Sandbox Code Playgroud)

因此,我更愿意使用以下内容:

declare @now datetimeoffset = sysdatetimeoffset() at time zone 'Pacific Standard Time';
select @now;
select convert(datetimeoffset, convert(varchar(max), @now, 120)); -- note …
Run Code Online (Sandbox Code Playgroud)

performance sql-server datatypes

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

SQL Server 不使用 OPTION(MAXDOP 20)创建并行计划

我们在具有 8 个套接字和 20 个处理器的 VM 上托管了一个 UAT3 服务器,我们在具有相同配置的同一 VM 上托管了类似的 UAT2 服务器。

我们在两个服务器上运行以下查询

select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)

两个服务器具有相同的数据和相同的结构。

UAT2 和 UAT3 具有默认设置并行5 和最大并行度的成本阈值0。

IN UAT2 服务器并行处理正在发生。它需要 10 秒才能完成,但 UAT3 串行处理正在发生,因为它需要 3 分 30 秒。

我们比较 UAT2 和 UAT3 服务器配置都相同。不知道为什么 SQL Server 在 UAT2 中选择并行执行而不是在 UAT3 中。

下面是表定义

select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)

下面是视图

CREATE TABLE [dbo].[FKMB_CUSTOMER]( 
    [RECID] [nvarchar](64) NOT NULL, 
    [XMLRECORD] [xml] NULL, 
    [ALT_CUSTOMER] AS 
        ([dbo].[IX_CUSTOMER_ALT_CUSTOMER]([XMLRECORD])) 
        PERSISTED, 
    [SMS] AS 
        ([dbo].[IX_CUSTOMER_SMS_1]([XMLRECORD])) …
Run Code Online (Sandbox Code Playgroud)

sql-server parallelism execution-plan query-performance

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

获得第三个星期五之后的第一个星期一

我在这个网站上看到了如何获得本月的第三个星期五:

select quote_date
FROM table
 where  datename(weekday, quote_date) = 'Friday'
and datepart(day, quote_date)>=15 and datepart(day, quote_date)<=21;
Run Code Online (Sandbox Code Playgroud)

在第三个星期五之后,我将如何获得第一个星期一?

sql-server date-math

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