标签: query-performance

在 postgres 中禁用嵌套循环有哪些副作用?

多个连接的查询会在嵌套循环上花费大量时间。我禁用了嵌套循环,查询运行得更快。但是,有人告诉我,嵌套循环可能会跳过一些元组,从而给出错误的结果。这是真的?

postgresql performance query-performance

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

即使“执行后忽略结果”,什么也会导致 SELECT 语句执行延迟和高 ASYNC_NETWORK_IO

我们的 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)

sql-server waits sql-server-2017 query-performance

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

提高 30 亿行表的 SQL 查询执行时间

我有一个超过 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 很陌生,对于我应该在这里做什么的任何建议,我们都很感激。

mysql index clustering query-performance

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

SQL Server 突然使用索引扫描而不是查找

我们有一个每天运行的存储过程。在其中一个子查询(执行计划中的查询 20)中,SQL Server 在 2021 年 9 月 24 日之前一直使用索引查找。但突然间,当查询在 2021/09/25 运行时,SQL Server 在同一步骤开始使用索引扫描。

以下是 2021 年 9 月 24 日执行搜寻的计划

2021/09/24查询计划 寻求2021/09/24手术

以下是 2021 年 9 月 25 日 SQL Server 执行索引扫描的计划

2021/09/25查询计划 2021/09/25 扫描操作

EMAIL_SENDS_CCMP_LTD 表是一个相当大的表,下面是该表的空间使用数据

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)

sql-server-2016 query-performance

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

编写一个查询,如果目标行上有锁,该查询将退出

是否可以编写一个UPDATE查询,如果它尝试更改的记录被另一个进程锁定(而不是等待锁被释放),则该查询将简单地退出?

我有一个进程应该更新表中的记录,有时这些记录会被锁定。更新这些记录是可取的,但不是必需的。如果记录正在使用中,我宁愿我的流程忘记更新并继续处理更重要的事情。

我当前的方法是将命令超时设置为 1 秒,但即使这也比我想要等待的时间长 - 正常更新需要不到一毫秒,因此等待一秒是一个主要开销。

postgresql locking update query-performance

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

如何找出当前查询计划中的“Key Lookups”?

我正在放置一个查询来列出当前正在执行的请求中存在的关键查找,我基本上想解决这个问题,看看是否可以从执行计划中消除这些关键查找

为了获取这些键查找,我使用以下查询:

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

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

如何优化存储过程并减少表扫描?

我有一个存储过程,可以识别上次 SSIS 作业运行中候选人信息的任何更改。然后它继续将更改保存在同步表中。

\n
CREATE 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)

sql-server sql-server-2012 query-performance

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

提高大表过滤左外连接的查询性能

我正在尝试优化在 PostgreSQL 15.4 中连接两个大表(40MM+ 行)的查询。

\n
SELECT 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;\n
Run Code Online (Sandbox Code Playgroud)\n

explain (analyze)完全相同的查询的两个计划位于:

\n\n

在 中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

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

更新具有数百万条记录的表时性能下降

我想更新表(我是 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)

postgresql performance update query-performance

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

SQL代码性能

  1. 根据执行计划,你知道这个sql代码是否有效的衡量标准是什么?

  2. 根据执行计划如何知道这个sql代码是否高效?

图片1


图2


图3

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

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