我们正在升级到 SQL Server 2022。在比较旧 QA 服务器 (SQL 2014) 和新 QA 服务器之间的性能时,我们使用 sp_whoisactive 来帮助识别瓶颈。在执行此操作时,我们经常注意到 2022 服务器上的某个会话的blocking_session_id 为-5。有谁知道这意味着什么?
我正在运行以下 Postgres 查询,其中根据消费者使用服务表中的服务的时间,将消费者的使用情况与该时间间隔的服务成本结合起来。下面的查询是一个截断版本,有时我必须执行多达 12 个或更多连接。问题是运行一个查询可能需要 2.5 分钟。我怎样才能减少这个时间?我采取的方法正确吗?
select
c.consumption,
c.interval_start,
c.interval_end,
s1.value_exc_vat as service1_price,
s2.value_exc_vat as service2_price
from
consumer as c
left join service1 as s1 on c.interval_start >= timestamp '2023-03-18T00:00:00Z'
and c.interval_start < timestamp '2024-02-15T00:00:00Z'
and (
s1.payment_method is null
or s1.payment_method = 'DIRECT_DEBIT'
)
and c.interval_start >= s1.valid_from
and (
c.interval_start < s1.valid_to
or s1.valid_to is null
)
left join service2 as s2 on c.interval_start >= timestamp '2024-02-15T00:00:00Z'
and c.interval_start < timestamp '2025-02-15T00:00:00Z'
and (
s2.payment_method is null
or s2.payment_method = 'DIRECT_DEBIT'
)
and c.interval_start >= s2.valid_from
and (
c.interval_start < s2.valid_to
or s2.valid_to is null
)
order by
c.interval_start desc
我已将问题隔离到每个联接中的查询的这一部分:
and c.interval_start >= s1.valid_from
and (
c.interval_start < s1.valid_to
or s1.valid_to is null
)
看来找到正确的间隔来加入表需要花费很多时间。对于消费者表和服务表来说,时间段可能相隔 30 分钟到几个月或几年不等,所以我不能做一个简单的计算c.interval_start = s1.valid_from and c.interval_end = s1.valid_to
这是一个EXPLAIN (ANALYZE, BUFFERS)
:
"QUERY PLAN"
"Sort (cost=5523752586.99..5549030615.96 rows=10111211585 width=28) (actual time=140588.278..140589.028 rows=20593 loops=1)"
" Sort Key: c.interval_start DESC"
" Sort Method: quicksort Memory: 2216kB"
" Buffers: shared hit=396"
" -> Nested Loop Left Join (cost=0.00..2633916836.23 rows=10111211585 width=28) (actual time=12.169..140546.307 rows=20593 loops=1)"
" Join Filter: ((c.interval_start >= '2023-03-18 00:00:00'::timestamp without time zone) AND (c.interval_start < '2024-02-15 00:00:00'::timestamp without time zone) AND (c.interval_start >= s1.valid_from) AND ((c.interval_start < s1.valid_to) OR (s1.valid_to IS NULL)))"
" Rows Removed by Join Filter: 559372220"
" Buffers: shared hit=396"
" -> Nested Loop Left Join (cost=0.00..3979716.14 rows=4302977 width=24) (actual time=0.058..27617.147 rows=20593 loops=1)"
" Join Filter: ((c.interval_start >= '2024-02-15 00:00:00'::timestamp without time zone) AND (c.interval_start < '2025-02-15 00:00:00'::timestamp without time zone) AND (c.interval_start >= s2.valid_from) AND ((c.interval_start < s2.valid_to) OR (s2.valid_to IS NULL)))"
" Rows Removed by Join Filter: 176848172"
" Buffers: shared hit=196"
" -> Seq Scan on consumer c (cost=0.00..337.93 rows=20593 width=20) (actual time=0.007..21.813 rows=20593 loops=1)"
" Buffers: shared hit=132"
" -> Materialize (cost=0.00..214.29 rows=8588 width=20) (actual time=0.000..0.272 rows=8588 loops=20593)"
" Buffers: shared hit=64"
" -> Seq Scan on service2 s2 (cost=0.00..171.35 rows=8588 width=20) (actual time=0.006..0.891 rows=8588 loops=1)"
" Filter: ((payment_method IS NULL) OR (payment_method = 'DIRECT_DEBIT'::bpchar))"
" Buffers: shared hit=64"
" -> Materialize (cost=0.00..675.37 rows=27164 width=20) (actual time=0.000..0.896 rows=27164 loops=20593)"
" Buffers: shared hit=200"
" -> Seq Scan on service1 s1 (cost=0.00..539.55 rows=27164 width=20) (actual time=0.002..2.830 rows=27164 loops=1)"
" Filter: ((payment_method IS NULL) OR (payment_method = 'DIRECT_DEBIT'::bpchar))"
" Buffers: shared hit=200"
"Planning Time: 0.107 ms"
"Execution Time: 140590.312 ms"
在SQLServer 2019中,有没有办法并行安装多个SSL证书?
我有以下情况:服务器所属的部门被出售,因此注册了新的 DNS 别名,*.oldcompany.com
现在调用的所有内容也都有一个新的 DNS 别名*.newcompany.com
。我们的 SQL-Server 现在具有以下名称,全部指向同一服务器/实例:
老公司 | 新公司 |
---|---|
app1.oldcompany.com | app1.newcompany.com |
app2.oldcompany.com | app2.newcompany.com |
app3.oldcompany.com | app3.newcompany.com |
到目前为止,一切都很简单,没有问题,让我们请求一个包含所有这些 DNS 名称的 SSL 证书Subject Alternative Name
...但现在出现了棘手的问题:
对于旧名称,由旧公司负责,对于新名称,由新公司负责,两者都有自己不同的 CA 和证书链,因此我最终得到一个用于 DNS 别名app1.oldcompany.com
、和 的证书,app2.oldcompany.com
以及app3.oldcompany.com
另一个用于app1.newcompany.com
、app2.newcompany.com
和的证书app3.newcompany.com
。
我设法使用 SQLServer 2019 配置管理器安装新公司的证书,如果连接字符串包含新的 DNS 别名之一,则一切正常,这两个选项Encrypt=False
或Encrypt=True
都可以使用,无需TrustServerCertificate=True
,但如果连接字符串包含旧的别名,Encrypt=True
仅与 一起使用TrustServerCertificate=True
。
有没有办法同时注册这两个证书?
如果您曾经使用过error_reported
扩展事件,那么很明显,SQL Server 错误日志仅记录服务器上运行的代码引发的错误的一小部分。事实上,它记录的许多内容都明确表明甚至不是错误。那么,从广义上讲,是什么决定了错误是否值得包含在错误日志中?是否有一些符合条件的错误列表?或者是根据某些标准来确定的?
我创建了一个新架构,archive
并且能够在其中创建、读取、更新和删除表。
我EXTERNAL_USER
想向谁授予权限,以便他们可以select..into
对架构执行操作。
我已授予他们CREATE TABLE
对数据库的权限和SELECT
对架构的权限,但他们收到“指定的架构名称‘存档’不存在或您无权使用它”错误消息。
他们尝试运行的查询是:
select *
into archive.post
from core.post
该查询对我来说运行良好。
我还尝试为他们提供数据库中的db_datareader
和db_datawriter
角色,没有区别。
我完全没有想法了——我没有想到什么?
我使用 AWS 管理的 Aurora PostgreSQL v15 实例作为大量 S3 对象的目录。该level1_dataset
表约有 20 亿行,其架构有一个metadata
JSONB 列。一个旧的软件错误导致在不应该写入元数据时将字符串null
写入列(而不是将其保留为空)。metadata
大约十亿行包含刺null
,我想用以下方法清理它:
UPDATE public.level1_dataset
SET "metadata" = NULL
WHERE "metadata"::text = 'null';
该数据库托管在db.r6g.2xlarge
具有 8 个 vCPU 核心和 64 GB 内存的计算机上。通过此设置,并将所有调整保留为默认值,我得到了大约 42 秒/百万行。可以为此清理任务临时更改 CPU 核心和内存。
最有效的方法是什么?
更新:@laurenz-albe 的方法之一是分批进行。我就是这样做的,因为就我而言,“id”是 UUID,而不是整数。在我的用例中,SELECT 有 10% 的损失。
UPDATE public.level1_dataset
SET "metadata" = NULL
WHERE "id" IN (SELECT "id"
FROM public.level1_dataset
WHERE "metadata"::text = 'null'
LIMIT 10000000);
是否可以pgbouncer
reserve_pool_timeout
以毫秒为单位指定,我尝试用“500 ms”指定它,但抛出错误,然后尝试指定 0.5,这次没有错误,但无法发现它是否真正起作用,或者只是禁用了超时,但保留池正在被利用。
为什么这么多人喜欢列式数据库?据我了解,人们更喜欢列式数据库,因为 CPU 能够可预测地缓存下一个值,因此查询速度更快。
我有一个简单的查询,例如
select * from MyTable where MyTableID=@p1
sp_BlitzCache 警告我“长时间运行且 CPU 不足”。该表在 MyTableID 上有一个聚集索引,它是一个唯一标识符/GUID。
是否是由于执行语句过于频繁导致的?
是的,这就是实体框架,我们正在努力让它运行得更快,而不需要对 C# 代码进行太多更改(因为它需要很长时间)。
目前运行的 vCores = 80,这“有点”昂贵。我尝试遵循https://www.brentozar.com/blitzcache/long-running-low-cpu/,但这些指南对我来说并不是很清楚。
sp_whoisactive 显示了许多带有 Async_Network_IO 的语句
sp_BlitzFirst 显示 CXSYNC_PORT 作为主要等待类型,到目前为止,但我找不到任何关于此的信息,并且我不知道它是否与此查询或正在运行的许多其他查询之一相关。
我试图找到一个执行计划,但 sp_BlitzIndex 只显示 SQL 语句。但鉴于此,我得到了这个计划:https://www.brentozar.com/pastetheplan/
?id=r11D40QQ0 它已在我的测试服务器上执行了 13.441.177 次,已运行 55 小时。
为什么我会收到“长时间运行 CPU 不足”的信息以及如何解决该问题?
我还看到简单的插入和更新获得了这个标签。
所有这些“长时间运行低CPU”是否都是由磁盘速度慢引起的?