多个连接的查询会在嵌套循环上花费大量时间。我禁用了嵌套循环,查询运行得更快。但是,有人告诉我,嵌套循环可能会跳过一些元组,从而给出错误的结果。这是真的?
我们的 SQL Server 面临性能问题。
7 台服务器,都运行相同的应用程序,都存在相同的问题。
SELECT @@VERSION
Microsoft SQL Server 2017 (RTM-CU19) (KB4535007) - 14.0.3281.6 (X64) Jan 23 2020 21:00:04 Copyright (C) 2017 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)
当您查看累积的服务器总等待统计信息时,会显示 99% ASYNC_NETWORK_IO。我们首先假设这是由应用程序引起的。然而:
当我们获取查询(从应用程序捕获)并从 SSMS 中将其作为测试运行时,执行后忽略结果。当我们通过 TCP 连接运行它时,大约需要 6 秒,通过命名管道连接运行它大约需要 50 秒。我们得到的结果非常慢。
(不考虑执行后的结果,查询给出的结果为 57k 行 227 列,大小为 221MB。)
它是核心版本,因此我们无法使用本地连接。我们测试了使用 TCP 和命名管道进行远程连接。
通过 TCP
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time …Run Code Online (Sandbox Code Playgroud) 我有一个超过 2 亿行的 mysql 表。我每天还写 100 万行。该表包含一些大列,例如varchar(255)(用于保存长网址)
为了在此表上执行分析,我创建了 5 个特定索引,这确实加快了执行时间。(对于某些查询,从 25 分钟以上到 2 分钟)。
问题仍然存在,2 分钟对于一个查询来说已经是很多时间了。我想运行多个查询以进行分析和报告。
此外,该表每天都在快速增长,我非常确定索引已尽可能优化。
这是集群可以解决我的问题的地方吗?也就是说,如此大小的表仍然在单个 sql 节点上运行,这是否不寻常?
或者是否仍然可以在如此大的表中以毫秒为单位运行查询?
我的一个示例查询是:
SELECT name, url, SUM(visits), AVG(price), AVG(loc) FROM mytable
WHERE sname IN ('white') AND usage IN ('three') AND date BETWEEN '2001-01-01' AND '2003-03-10'
GROUP BY name, url ORDER BY SUM(visits);
Run Code Online (Sandbox Code Playgroud)
我对集群和 HPC 很陌生,对于我应该在这里做什么的任何建议,我们都很感激。
我们有一个每天运行的存储过程。在其中一个子查询(执行计划中的查询 20)中,SQL Server 在 2021 年 9 月 24 日之前一直使用索引查找。但突然间,当查询在 2021/09/25 运行时,SQL Server 在同一步骤开始使用索引扫描。
以下是 2021 年 9 月 24 日执行搜寻的计划
以下是 2021 年 9 月 25 日 SQL Server 执行索引扫描的计划
EMAIL_SENDS_CCMP_LTD 表是一个相当大的表,下面是该表的空间使用数据
以下是上面突出显示的存储过程中的查询 -
insert into TALBOTS_BASE.dbo.EMAIL_ACTIVITIES
(EMAILTYPE,INTSOURCE,EMAIL,ACCTNO,FNAME,LNAME,EMAILDATE,DNEFLAG,SOURCE_CD,CREATE_ID,EMAILPREF,HASH,FILENAME,SEQ,FILEDATE,MODDATE,IPADDRESS,HAV_EMAILDATE)
SELECT
'OPEN' AS EMAILTYPE
,'CCMP' AS INTSOURCE
, a.[P_email] AS EMAIL
,'' AS ACCTNO
,'' AS [FNAME]
,'' AS [LNAME]
,CASE WHEN ISNULL(c.Subchannel,'')<>'HWW'
THEN
CASE WHEN ISDATE([click_time])=1 THEN CAST([click_time] AS DATE) ELSE NULL END
ELSE NULL
END AS EMAILDATE
,'' as …Run Code Online (Sandbox Code Playgroud) 是否可以编写一个UPDATE查询,如果它尝试更改的记录被另一个进程锁定(而不是等待锁被释放),则该查询将简单地退出?
我有一个进程应该更新表中的记录,有时这些记录会被锁定。更新这些记录是可取的,但不是必需的。如果记录正在使用中,我宁愿我的流程忘记更新并继续处理更重要的事情。
我当前的方法是将命令超时设置为 1 秒,但即使这也比我想要等待的时间长 - 正常更新需要不到一毫秒,因此等待一秒是一个主要开销。
我正在放置一个查询来列出当前正在执行的请求中存在的关键查找,我基本上想解决这个问题,看看是否可以从执行计划中消除这些关键查找。
为了获取这些键查找,我使用以下查询:
SELECT
er.session_id,
er.blocking_session_id,
er.start_time,
er.status,
dbName = DB_NAME(er.database_id),
er.wait_type,
er.wait_time,
er.last_wait_type,
er.granted_query_memory,
er.reads,
er.logical_reads,
er.writes,
er.row_count,
er.total_elapsed_time,
er.cpu_time,
er.open_transaction_count,
er.open_transaction_count,
s.text,
qp.query_plan,
logDate = CONVERT(DATETIME,GETDATE()),
logTime = CONVERT(DATETIME,GETDATE())
FROM sys.dm_exec_requests er
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) s
CROSS APPLY sys.dm_exec_query_plan(er.plan_handle) qp
WHERe er.session_id <> @@SPID
and CONVERT(VARCHAR(MAX), qp.query_plan) LIKE '%IndexScan Lookup%'
Run Code Online (Sandbox Code Playgroud)
我在这个查询中面临的问题是它返回任何,无论其成本key lookup如何。
我想过滤那些,我只想看到昂贵的关键查找。
如何过滤查询以仅显示昂贵的查找操作?
index sql-server execution-plan index-tuning query-performance
我有一个存储过程,可以识别上次 SSIS 作业运行中候选人信息的任何更改。然后它继续将更改保存在同步表中。
\nCREATE PROCEDURE [dbo].[IdentifyCandidateChanges]\xc2\xa0\xc2\xa0\n(\xc2\xa0\xc2\xa0\n@MoreToProcess BIT = 0 OUTPUT\xc2\xa0\xc2\xa0\n)\xc2\xa0\xc2\xa0\nAS\xc2\xa0\xc2\xa0\n\nSET NOCOUNT ON\xc2\xa0\xc2\xa0\n\nDECLARE @BatchSize INT\xc2\xa0\xc2\xa0\n\nSELECT\xc2\xa0\xc2\xa0\n@MoreToProcess = 0\xc2\xa0\xc2\xa0\n, @BatchSize = 200000\xc2\xa0\xc2\xa0\n\nDECLARE @Changes TABLE\xc2\xa0\xc2\xa0\n(\xc2\xa0\xc2\xa0\n CandidateNo VARCHAR(10) NOT NULL\xc2\xa0\xc2\xa0\n, CentreNo CHAR(5) NOT NULL\xc2\xa0\xc2\xa0\n, CandidateModifiedDate DATETIME NOT NULL\xc2\xa0\xc2\xa0\n, ChangeStatus CHAR(1) NOT NULL\xc2\xa0\xc2\xa0\n)\xc2\xa0\xc2\xa0\n\n-- If this is the first run (or the CandidateSync table is empty for another reason) then just take the hit now\xc2\xa0\xc2\xa0\n-- and process the entire set of candidates in one go.\xc2\xa0\xc2\xa0\n\nIF EXISTS(SELECT TOP 1 1 FROM CandidateSync)\xc2\xa0\xc2\xa0\nSET ROWCOUNT @BatchSize\xc2\xa0\xc2\xa0\n\nINSERT INTO @Changes\xc2\xa0\xc2\xa0\n(\xc2\xa0\xc2\xa0\n CandidateNo\xc2\xa0\xc2\xa0\n, …Run Code Online (Sandbox Code Playgroud) 我正在尝试优化在 PostgreSQL 15.4 中连接两个大表(40MM+ 行)的查询。
\nSELECT files.id, ARRAY_AGG(b.status)\nFROM files\nLEFT OUTER JOIN processing_tasks b\n ON (files.id = b.file_id AND b.job_id = 113)\nWHERE files.round_id = 591\nGROUP BY files.id;\nRun Code Online (Sandbox Code Playgroud)\nexplain (analyze)完全相同的查询的两个计划位于:
https://explain.depesz.com/s/cUXB需要 87 秒,使用并行 Seq 扫描processing_tasks.job_id(默认计划)
https://explain.depesz.com/s/j39G需要 4 秒,使用位图索引扫描processing_tasks.job_id(当 时set local enable_seqscan = OFF)
在 中files,908,275 / 39,000,105 (2.3%) 个元组有round_id=591; 它是静态的。
\n在 中processing_tasks,4,026,364 / 60,780,802 (6.6%) 个元组有job_id=113,并且随着行的插入,这个值将变得越来越常见,可能达到表的 …
postgresql optimization query-performance postgresql-performance postgresql-15
我想更新表(我是 20-30 ),每个表都有数百万条记录。
问题是更新过程花费了太多时间,而且那时 CPU 使用率也很高。我想以一种在处理数据时不能使用太多 CPU 的方式来做。如果处理时间增加,那么这对我来说不是问题,但它应该使用有限的 CPU 资源来处理(更新)表。我使用 PostgreSQL 作为数据库,服务器操作系统是 Linux。
我的示例查询可以是这样的
UPDATE TEMP
SET CUSTOMERNAME =
( select customername from user where user.customerid = temp.customerid );
Run Code Online (Sandbox Code Playgroud) 根据执行计划,你知道这个sql代码是否有效的衡量标准是什么?
根据执行计划如何知道这个sql代码是否高效?



SELECT [CustomerID], [CompanyName], [City], [Region]
FROM [Northwind].[dbo].[Customers]
WHERE [Country] = 'Germany'
ORDER BY [CompanyName]
SELECT [CustomerID], [CompanyName], [City], [Region]
FROM [Northwind].[dbo].[Customers]
WHERE [Country] = 'Germany'
Run Code Online (Sandbox Code Playgroud) performance index sql-server-2008 execution-plan query-performance
postgresql ×4
index ×3
performance ×3
sql-server ×3
update ×2
clustering ×1
index-tuning ×1
locking ×1
mysql ×1
optimization ×1
waits ×1