标签: performance

使用 GROUP BY 和 ORDER BY 对大表进行慢速查询

我有一个包含 720 万个元组的表,如下所示:

                               table public.methods
 column |          type         |                      attributes
--------+-----------------------+----------------------------------------------------
 id     | integer               | not null DEFAULT nextval('methodkey'::regclass)
 hash   | character varying(32) | not null
 string | character varying     | not null
 method | character varying     | not null
 file   | character varying     | not null
 type   | character varying     | not null
Indexes:
    "methods_pkey" PRIMARY KEY, btree (id)
    "methodhash" btree (hash)
Run Code Online (Sandbox Code Playgroud)

现在我想选择一些值,但查询速度非常慢:

db=# explain 
    select hash, string, count(method) 
    from methods 
    where hash not in 
          (select hash from nostring) …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index sorting group-by

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

启用“log_queries_not_using_indexes”会禁用“long_query_time”?

我注意到,在 Mysql 中,当启用log_queries_not_using_indexes,slow_query_log和 时long_query_time,即使查询时间远小于long_query_time.

似乎一旦log_queries_not_using_indexes启用,无论“long_query_time”是什么,Mysql 都会记录所有不使用索引的查询。

有没有办法克服这个问题?我的意思是,有没有办法记录所有比 花费更长时间的查询long_query_time,而不管它们是否使用索引?

mysql performance mysql-5.5 slow-log

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

使用 IN() 提高查询性能

我有以下 SQL 查询:

SELECT
  Event.ID,
  Event.IATA,
  Device.Name,
  EventType.Description,
  Event.Data1,
  Event.Data2
  Event.PLCTimeStamp,
  Event.EventTypeID
FROM
  Event
INNER JOIN EventType ON EventType.ID = Event.EventTypeID
INNER JOIN Device ON Device.ID = Event.DeviceID
WHERE
  Event.EventTypeID IN (3, 30, 40, 41, 42, 46, 49, 50)
  AND Event.PLCTimeStamp BETWEEN '2011-01-28' AND '2011-01-29'
  AND Event.IATA LIKE '%0005836217%'
ORDER BY Event.ID;
Run Code Online (Sandbox Code Playgroud)

我在Event表上也有一个列的索引TimeStamp。我的理解是这个索引没有使用,因为IN()声明。所以我的问题是有没有办法为这个特定的IN()语句建立索引来加速这个查询?

我还尝试将 上Event.EventTypeID IN (2, 5, 7, 8, 9, 14)的索引添加为过滤器TimeStamp,但是在查看执行计划时,它似乎没有使用此索引。对此的任何建议或见解将不胜感激。

下面是图形化计划:

执行计划

这是.sqlplan 文件的链接

performance sql-server-2008-r2 filtered-index query-performance

14
推荐指数
2
解决办法
2973
查看次数

使用 InnoDB 引擎输入几场演出后,MySQL LOAD DATA INFILE 速度降低了 80%

我正在通过 LOAD DATA INFILE 加载一个 100GB 的文件。我在 MyISAM 上取得了很好的成功,几个小时就完成了。

我现在正在尝试使用 InnoDB。负载以超过 10MB/秒的速度快速启动(观察表文件增长,file_per_table已打开)。

但是在大约 5GB 的数据之后它会减慢到 2-4MB/秒的范围,当我超过 20GB 时它会下降大约 2MB/秒。

InnoDB 缓冲池大小为 8G。在运行 LOAD DATA INFILE 命令之前,我已经完成了以下操作:

SET @@session.sql_log_bin=0;
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
alter table item_load disable keys;
//Run LOAD DATA INFILE....
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它开始良好并随着时间的推移放缓。

此外,使用相同的设置,我使用 InnoDB 和 MyISAM 以及 5GB 测试数据集对表运行相同的 LOAD DATA INFILE 命令,MyISAM 速度提高了 20 倍:

InnoDB:

mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (21 …
Run Code Online (Sandbox Code Playgroud)

mysql innodb myisam performance

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

哪个更好:许多加入条件或许多 where 条件?

我正在尝试比较两个查询:

查询 1:

SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c  AND tableA.d=tableB.d  AND tableA.e=tableB.e 
Run Code Online (Sandbox Code Playgroud)

查询 2:

SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c  AND tableA.d=tableB.d  
WHERE tableA.e=tableB.e 
Run Code Online (Sandbox Code Playgroud)

我说这两个查询给出相同的结果是否正确?

此外,说第一个查询构建了一个更大的表来做更大的WHERE条件是否正确?而在第二种情况下,我们有一个较小的构造表,然后将简单WHERE应用于该表。

假设结果相同,应该首选哪个查询?是否存在明显的性能问题?

mysql performance

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

SOS_SCHEDULER_YIELD 等待问题排查

运行我们的企业 ERP (Dynamics AX 2012),我注意到我们的生产环境似乎比我们的开发系统慢得多。

在运行跟踪的同时在开发和生产环境中执行相同的活动后,我确认与开发相比,SQL 查询在我们的生产环境中的执行速度非常慢(平均慢 10-50 倍)。

起初我将此归因于负载,并在下班时间在生产环境上重新运行相同的活动,并在跟踪中发现相同的结果。

我清除了 SQL Server 中的等待统计信息,然后让服务器在正常生产负载下运行一段时间,然后运行以下查询:

WITH [Waits] AS
    (SELECT
        [wait_type],
        [wait_time_ms] / 1000.0 AS [WaitS],
        ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
        [signal_wait_time_ms] / 1000.0 AS [SignalS],
        [waiting_tasks_count] AS [WaitCount],
        100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
        ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
    FROM sys.dm_os_wait_stats
    WHERE [wait_type] NOT IN (
        N'CLR_SEMAPHORE',    N'LAZYWRITER_SLEEP',
        N'RESOURCE_QUEUE',   N'SQLTRACE_BUFFER_FLUSH',
        N'SLEEP_TASK',       N'SLEEP_SYSTEMTASK',
        N'WAITFOR',          N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
        N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',
        N'XE_TIMER_EVENT',   N'XE_DISPATCHER_JOIN',
        N'LOGMGR_QUEUE',     N'FT_IFTS_SCHEDULER_IDLE_WAIT',
        N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT',
        N'CLR_AUTO_EVENT',   N'DISPATCHER_QUEUE_SEMAPHORE', …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 wait-types

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

更多的 CPU 内核与更快的磁盘

我是一家小公司的一员,所以像往常一样负责许多不同的角色。最新的是为我们的 .NET Web 应用程序采购一个专用的 SQL Server 盒。我们在双 Xeon E5-2620(六核)2.00 GHz CPU 配置(共 12 核)上被引用,具有 32 GB 的 RAM。这使我们的磁盘阵列预算有限,该磁盘阵列基本上由 RAID 1 配置中的两个 2.5" SAS 300 GB 驱动器 (15k RPM) 组成。

我知道磁盘设置对于 SQL Server 来说是次优的,我真的很想推动 RAID 10,这样我们就可以将数据库、日志文件和 tempdb 放在他们自己的驱动器上。为了使这与我们的预算兼容,我应该考虑减少 CPU 内核的数量吗?或者我会得到更好的银行来保持核心并使用更少的驱动器,也许在双 RAID 1 设置中使用 4 个?

这是一些额外的统计数据

  • SQL Server 数据库倾向于大量读取到写入,可能分别为 80% 和 20%。当前的数据库大小目前约为10 GB 26 GB,以每月 250 MB 的速度增长。

  • 目前在与 Web 服务器共享的单个四核 Xeon 机器上运行 SQL Server 2008 R2 Standard(RAID 1 中的 12 GB Ram、2 x 10k 300GB SAS 驱动器),希望迁移到 SQL Server …

performance sql-server configuration hardware

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

使用 LIMIT 是否可以提高性能,是否显着?

我想了解以下内容。
假设我有一个复杂的查询,假设通过求和和排序将一组 5 个表连接起来。
抛开对查询本身的任何优化,例如索引等。
使用LIMIT?是否有任何显着的性能优势?我假设应用 LIMIT之前必须处理所有查询(和结果),因此使用 LIMIT 来检索结果的子集,这是否提供了任何显着/显着的改进?

mysql performance join

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

不应该避免吗?

在一些 SQL Server 开发人员中,普遍认为NOT IN速度非常慢,应该重写查询,以便它们返回相同的结果,但不要使用“evil”关键字。(示例)。

这有什么道理吗?

例如,SQL Server 中是否存在一些已知错误(哪个版本?)导致使用NOT IN的查询比使用的等效查询具有更差的执行计划

  • 一个LEFT JOIN结合了NULL支票或
  • (SELECT COUNT(*) ...) = 0WHERE条款中?

performance sql-server except query-performance

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

比较 SQL Server 2012 中的两个查询

我正在比较 SQL Server 2012 中的两个查询。目标是在选择最佳查询时使用查询优化器提供的所有相关信息。两个查询产生相同的结果;所有客户的最大 orderid。

在使用 FREEPROCCACHE 和 DROPCLEANBUFFERS 执行每个查询之前清除缓冲池

使用下面提供的信息,哪个查询是更好的选择?

-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
                 FROM Sales.Orders AS O2
                 WHERE O2.custid = O1.custid);


-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid
Run Code Online (Sandbox Code Playgroud)

统计时间

查询 1 STATISTICS TIME:CPU 时间 = 0 毫秒,经过时间 …

performance sql-server-2012 query-performance

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