标签: sql-server

需要了解并行查询执行错误

今天,我们的生产 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)

sql-server parallelism sql-server-2008-r2

24
推荐指数
2
解决办法
3万
查看次数

什么时候动态端口是“动态的”?

我今天正在Dynamic Ports与我的一位同事讨论,可以使用一些帮助来澄清他们的工作方式。

第一个问题:如果IPALL TCP Dynmaic Ports设置是一个特定的数字(比如 1971),这是否表示您有一个 1971 的静态端口或一个当前为 1971 的动态端口,并且可能会在将来的某个时候发生变化。

在此处输入图片说明

第二个问题:这是我最好奇的一个。我们有一个实例,IPALL TCP Dynmaic Ports通过数十次实例重启,该实例具有相同的端口(设置中的值)数年。是什么导致实例重启后动态端口实际发生变化?

sql-server dynamic-ports tcpip

24
推荐指数
1
解决办法
4万
查看次数

持久计算列上的索引需要键查找以获取计算表达式中的列

我在一个表上有一个持久计算列,它只是由连接列组成,例如

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

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

SQL Server 是否缓存多语句表值函数的结果?

多语句表值函数在表变量中返回其结果。

这些结果是否曾被重用,还是每次调用时总是对函数进行全面评估?

sql-server execution-plan set-returning-functions

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

(NOLOCK) VS NOLOCK

当我看到一个看起来像这样的查询时,我正在调查一些阻塞:

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 上对此进行了测试。

sql-server syntax nolock

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

哪些日期/时间文字格式是 LANGUAGE 和 DATEFORMAT 安全的?

这是很容易证明,许多日期/时间格式比下面的两个很容易受到由于设置语言,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。 …

sql-server t-sql date-format datetime string-representation

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

消除会降低性能的键查找(集群)运算符

如何消除执行计划中的 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

24
推荐指数
2
解决办法
3万
查看次数

如果一个数据库只有一个插入,那么索引每一个可能的列组合是不是很糟糕?

我正在开发一个需要大量选择查询的报告系统,但它基于只填充一次的数据库。数据库管理系统是 Microsoft SQL Server 2017。可能有更好的方法来设计这样的系统,但让我们从理论上来解决这个问题。

理论上来说:

  1. 如果我们有一个非常大的数据库(多个表上的 150M+ 行)
  2. 我们可以假设数据库只会填充一次。

索引每个可能的列组合是否会对选择查询产生负面性能影响?

sql-server t-sql index-tuning sql-server-2017

24
推荐指数
3
解决办法
5063
查看次数

找出导致最大网络流量的查询

在生产 SQL 服务器上,我看到数据流量出现间歇性的巨大峰值。高达 200Mbit/s,这会导致 NETWORK IO 等待,从而导致查询超时。如何找出返回大结果集的查询?

sql-server

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

FlushCache 消息在特定时间出现在日志中

最近我们遇到了很多数据库性能问题,我一直在尝试找出原因。我们没有 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 sql-server-2012

23
推荐指数
1
解决办法
6万
查看次数