今天,我们的生产 sql 服务器的性能下降了。在发生这种情况时,我们记录了几个"The query processor could not start the necessary thread resources for parallel query execution"错误。我所做的阅读表明,这与执行复杂查询时要使用的 CPU 数量有关。但是,当我在停电期间检查我们的CPU Utilization was only at 7%. 还有什么其他的东西可以指代我还没有遇到过吗?这是性能下降的可能罪魁祸首还是我在追逐红鲱鱼?
我的 sp_configure 值如下:
name minimum maximum config_value run_value
cost threshold for parallelism 0 32767 5 5
Run Code Online (Sandbox Code Playgroud) 我今天正在Dynamic Ports与我的一位同事讨论,可以使用一些帮助来澄清他们的工作方式。
第一个问题:如果IPALL TCP Dynmaic Ports设置是一个特定的数字(比如 1971),这是否表示您有一个 1971 的静态端口或一个当前为 1971 的动态端口,并且可能会在将来的某个时候发生变化。

第二个问题:这是我最好奇的一个。我们有一个实例,IPALL TCP Dynmaic Ports通过数十次实例重启,该实例具有相同的端口(设置中的值)数年。是什么导致实例重启后动态端口实际发生变化?
我在一个表上有一个持久计算列,它只是由连接列组成,例如
CREATE TABLE dbo.T
(
ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_T_ID PRIMARY KEY,
A VARCHAR(20) NOT NULL,
B VARCHAR(20) NOT NULL,
C VARCHAR(20) NOT NULL,
D DATE NULL,
E VARCHAR(20) NULL,
Comp AS A + '-' + B + '-' + C PERSISTED NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
这Comp不是唯一的,并且 D 是每个组合的有效起始日期A, B, C,因此我使用以下查询来获取每个组合的结束日期A, B, C(基本上是 Comp 相同值的下一个开始日期):
SELECT t1.ID,
t1.Comp,
t1.D,
D2 = ( SELECT TOP 1 t2.D
FROM dbo.T t2
WHERE t2.Comp = …Run Code Online (Sandbox Code Playgroud) sql-server-2008 sql-server execution-plan computed-column bookmark-lookup
多语句表值函数在表变量中返回其结果。
这些结果是否曾被重用,还是每次调用时总是对函数进行全面评估?
当我看到一个看起来像这样的查询时,我正在调查一些阻塞:
SELECT SomeField FROM SomeTable NOLOCK
Run Code Online (Sandbox Code Playgroud)
我看到了NOLOCK并且很好奇它是如何阻塞其他查询的,在这种情况下是DELETE语句。我快速查看了使用的锁sp_lock,这是我所看到的:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Run Code Online (Sandbox Code Playgroud)
现在,我的理解是NOLOCK应该只需要一个 Schema-Stability 锁,为什么它会抓住一个 IS 锁?
我的好奇心被勾起来了。我查看了 BOL,发现有两种使用方法,WITH (NOLOCK)以及已弃用的 . (NOLOCK),所以我决定尝试一下。我运行了以下查询,然后运行sp_lock:
SELECT SomeField FROM SomeTable WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
DB S 赠款 TAB Sch-S 授权
SELECT SomeField FROM SomeTable (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
DB S 赠款 TAB Sch-S 授权
果然,有我的模式稳定性锁。所以我的问题是:这里发生了什么?如果使用 NOLOCK 的公认语法是WITH (NOLOCK)or (NOLOCK),那么为什么查询在只使用普通NOLOCK(不带括号)运行时不会出错?如果支持,为什么要抢 IS 锁?我在这里缺少什么?我一直在网上搜索答案,但到目前为止还不够。
我已经在 2008R2 和 2012 上对此进行了测试。
这是很容易证明,许多日期/时间格式等比下面的两个很容易受到由于设置语言,SET DATEFORMAT,或登录的默认语言误解:
yyyyMMdd -- unseparated, date only
yyyy-MM-ddThh:mm:ss.fff -- date dash separated, date/time separated by T
Run Code Online (Sandbox Code Playgroud)
即使这种没有 T 的格式也可能看起来像一个有效的 ISO 8601 格式,但它在多种语言中都失败了:
DECLARE @d varchar(32) = '2017-03-13 23:22:21.020';
SET LANGUAGE Deutsch;
SELECT CONVERT(datetime, @d);
SET LANGUAGE Français;
SELECT CONVERT(datetime, @d);
Run Code Online (Sandbox Code Playgroud)
结果:
Die Spracheneinstellung wurde auf Deutsch geändert。
Msg 242, Level 16, State 3
Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs。
Le paramètre de langue est passé à Français。 …
如何消除执行计划中的 Key Lookup (Clustered) 运算符?
表tblQuotes已经有一个聚集索引 (on QuoteID) 和 27 个非聚集索引,所以我不想再创建了。
我将聚集索引列QuoteID放在我的查询中,希望它会有所帮助 - 但不幸的是仍然相同。
或查看它:
这是 Key Lookup 运算符所说的:
询问:
declare
@EffDateFrom datetime ='2017-02-01',
@EffDateTo datetime ='2017-08-28'
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
IF OBJECT_ID('tempdb..#Data') IS NOT NULL
DROP TABLE #Data
CREATE TABLE #Data
(
QuoteID int NOT NULL, --clustered index
[EffectiveDate] [datetime] NULL, --not indexed
[Submitted] [int] NULL,
[Quoted] [int] NULL,
[Bound] [int] NULL,
[Exonerated] [int] NULL,
[ProducerLocationId] [int] …Run Code Online (Sandbox Code Playgroud) performance sql-server execution-plan sql-server-2012 bookmark-lookup query-performance
我正在开发一个需要大量选择查询的报告系统,但它基于只填充一次的数据库。数据库管理系统是 Microsoft SQL Server 2017。可能有更好的方法来设计这样的系统,但让我们从理论上来解决这个问题。
理论上来说:
索引每个可能的列组合是否会对选择查询产生负面性能影响?
在生产 SQL 服务器上,我看到数据流量出现间歇性的巨大峰值。高达 200Mbit/s,这会导致 NETWORK IO 等待,从而导致查询超时。如何找出返回大结果集的查询?
最近我们遇到了很多数据库性能问题,我一直在尝试找出原因。我们没有 DBA(我是一名软件开发人员),所以我只是在摸索,而且我在网上找到的大部分内容对我来说就像一门外语。
我们每天早上都会重新启动 SQL Server,因为这是它在工作日运行的唯一方式。我注意到每天早上 5 点左右,我们开始每两分钟在日志中收到一条消息:
FlushCache:在 97168 毫秒内清理了 11848 个 buf,其中 7432 次写入(避免了 8139 个新的脏 buf)用于 db 9:0
最后一个未完成的目标:4,avgWriteLatency 32
平均吞吐量:0.72 MB/秒,I/O 饱和度:11635,上下文切换 18849
当然,每次的数字都不同,但是在我重新启动服务器之前,它以该模式一遍又一遍地传递相同的消息。我不知道如何解释这一点,我一直在尝试谷歌搜索,我收集到的只是这意味着 I/O 可能有问题,并且某些事情花费的时间比预期的要长。我们最近改用SSD,所以我认为这应该不是写入问题。
任何人都可以对此有所了解吗?
sql-server ×10
t-sql ×2
date-format ×1
datetime ×1
index-tuning ×1
nolock ×1
parallelism ×1
performance ×1
syntax ×1
tcpip ×1