标签: performance-tuning

处理 CXPACKET 等待 - 设置并行成本阈值

作为我之前关于对 Sharepoint 站点进行性能故障排除的问题的后续问题,我想知道我是否可以对 CXPACKET 等待做些什么。

我知道下意识的解决方案是通过将 MAXDOP 设置为 1 来关闭所有并行性 - 听起来是个坏主意。但另一个想法是在并行开始之前增加成本阈值。执行计划成本的默认值 5 相当低。

所以我想知道是否已经写了一个查询,可以找到执行计划成本最高的查询(我知道你可以找到那些执行持续时间最长的查询等等 - 但是执行计划成本是否可以在某处检索,也是?),这也会告诉我这样的查询是否已并行执行。

有没有人手头有这样的脚本,或者可以向我指出相关的 DMV、DMF 或其他系统目录视图的方向以找出这一点?

performance sql-server-2008 parallelism query-performance performance-tuning

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

为大量 INSERTS 和 bytea 更新优化 PostgreSQL

我们有什么(软件):

  • 带有基本配置的PostrgeSQL 9.3(在 中没有变化postgresql.conf
  • 视窗 7 64 位

硬件:

  • 英特尔酷睿 i7-3770 3.9 GHz
  • 32 Gb 内存
  • WDC WD10EZRX-00L4HBATa 驱动器(1000Gb,SATA III)

所以,我们必须加载到数据库 aprox。100.000.000行与bytea列,以及更简单的500.000.000行(无 LOB)。varchar第一个表上有 2 个索引(长度为 13、19),varchar第二个表上有 2个索引(长度为 18、10)。每个表也有生成 id 的序列。

到目前为止,这些操作使用 8 个并行连接和 50 个 JDBC 批处理大小进行。下图展示了系统负载:它对postgresql进程是零负载。加载 24 小时后,我们只加载了 10.000.000 行,这是非常缓慢的结果。

在此处输入图片说明

我们寻求帮助调整PostrgreSQL配置的目的是:

1)为了超快加载这个数量的数据,它是一次性操作,所以它可以是临时配置

2) 对于生产模式,通过它们的索引对这 2 个表执行中等数量的 SELECT,无需连接和排序。

performance insert database-tuning postgresql-9.3 bytea performance-tuning

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

在 postgresql.conf 中设置 shared_buffers 好像没有生效

我们使用 CentOS 6.6 版,PostgreSQL 8.4.20 版。(是的,这不是最前沿的。)

postgresql.conf,我们有:

shared_buffers = 4096MB
Run Code Online (Sandbox Code Playgroud)

内核 shm 值设置得很好且很高:

[root@green data]# sysctl -a | grep shm
kernel.shmmax = 15922077696
kernel.shmall = 3887226
kernel.shmmni = 4096
kernel.shm_rmid_forced = 0
Run Code Online (Sandbox Code Playgroud)

我们有足够的内存:

[root@green data]# free
             total       used       free     shared    buffers     cached
Mem:      31097812   30474972     622840    2873672    1961088   20565360
-/+ buffers/cache:    7948524   23149288
Swap:      1959920      93852    1866068
Run Code Online (Sandbox Code Playgroud)

然而,shared_buffersreported by的值pg_settings只有 512MB,而不是 4GB 中设置的postgresql.conf

postgres=# select name, setting, min_val, max_val, context from  
pg_settings where …
Run Code Online (Sandbox Code Playgroud)

postgresql performance configuration performance-tuning

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

统计数据:CPU 时间 vs 已用时间。什么更重要?

在性能调优时,更重要的是:

  • CPU时间或经过的时间?
  • 是否存在其中一个比另一个更重要的场景?

一个例子:虽然性能调整 CPU 时间将减少~38%,但 Elapsed Time增加~22%。这是一种改进吗?

performance sql-server performance-tuning

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

有效处理10-1亿行无关数据行表

提高多达 1 亿行的表的读/写性能的常用方法是什么?

表有 column SEGMENT_ID INT NOT NULL,其中每个段有大约 100.000-1.000.000 行。写入 -SEGMENT_ID一次插入所有行,SEGMENT_ID之后不更新。读取 - 非常频繁,我需要良好的SELECT * FROM table WERE SEGMENT_ID = ?.

最明显的方法是SEGMENT_ID动态创建新表,但动态表意味着使用 ORM 甚至本机 SQL 查询框架进行黑客攻击。换句话说,你完成了有味道的代码。

您也可以使用分片,对吗?数据库是否在幕后创建新表?

我可以通过SEGMENT_ID. 但是,如果我一次插入所有与段相关的数据,我的插入是否会聚集在一起?

Postgres 还建议使用分区来处理非常大的表

也许有某种神奇的索引可以帮助我避免动态创建新表或配置分片?

还有其他选择吗?

postgresql performance partitioning sharding performance-tuning

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

批量删除后是否需要重新索引 mysql 表?

我在 MySQL 中有一个表,每秒钟都有很多 INSERT 和 SELECT。并且每天都会批量删除一些旧数据。删除后是否需要重新索引表?我想提高性能。有人可以提出一些建议吗?使用“innodb”作为存储引擎。我需要改变它吗?我认为它更适合并发插入和选择。请提出您的建议。我需要重新索引吗?

提前致谢..

mysql innodb performance delete performance-tuning

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

优化超过 25 万行的查询

我正在使用 MS SQL,我必须根据不同的条件在同一个表上运行多个查询。起初我在原始表上运行每个查询,尽管它们都共享一些过滤器(即日期、状态)。这花了很多时间(大约 2 分钟)。

数据行中有重复项,所有索引都是非聚集的。我只对我的标准的 4 列感兴趣,结果应该只输出所有查询的计数。

需要的列:TABLE, FIELD, AFTER, DATE, 并且每个DATE和上都有一个索引TABLE

在创建一个只有我需要的字段的临时表后,它下降到 1:40 分钟,这仍然很糟糕。

CREATE TABLE #TEMP
(
    TABLE VARCHAR(30) NULL,
    FIELD VARCHAR(30) NULL,
    AFTER VARCHAR(1000) NULL,
    DATE DATETIME,
    SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)

INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
    SELECT TABLE, FIELD, AFTER, DATE 
    FROM mytbl WITH (NOLOCK)
    WHERE TABLE = 'OTB' AND
    FIELD = 'STATUS'
Run Code Online (Sandbox Code Playgroud)

运行此 ->(216598 行受影响)

由于并非所有查询都依赖于日期范围,因此我没有将其包含在查询中。问题是只插入. …

performance sql-server sql-server-2012 performance-tuning

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

>= 和 > 的基数估计,用于步骤内统计值

我试图了解 SQL Server 如何尝试估计 SQL Server 2014 中的“大于”和“大于等于”where 子句。

我想我确实了解基数估计,例如,如果我这样做

    select * from charge where charge_dt >= '1999-10-13 10:47:38.550'
Run Code Online (Sandbox Code Playgroud)

基数估计是 6672,可以很容易地计算为 32(EQ_ROWS) + 6624(RANGE_ROWS) + 16 (EQ_ROWS) = 6672(下面截图中的直方图)

在此处输入图片说明

但是当我这样做时

    select * from charge where charge_dt >= '1999-10-13 10:48:38.550' 
Run Code Online (Sandbox Code Playgroud)

(将时间增加到 10:48 所以它不是一步)

估计是 4844.13。

那是怎么计算的?

performance sql-server sql-server-2014 cardinality-estimates performance-tuning

10
推荐指数
2
解决办法
538
查看次数

EXCEPT 运算符背后的算法是什么?

在 SQL Server 中,Except运算符如何在幕后工作的内部算法是什么?它是否在内部获取每一行的哈希值并进行比较?

David Lozinksi 进行了一项研究,SQL:在不存在新记录的地方插入新记录的最快方法他表明,对于大量行,Except 语句是最快的;与我们下面的结果密切相关。

假设:我认为 Left join 会最快,因为它只比较 1 列,Except 花费的时间最长,因为它必须比较所有列。
有了这些结果,现在我们的想法是,Except 自动并在内部获取每一行的哈希值?我查看了除非执行计划,它确实使用了一些哈希。

背景:我们的团队正在比较两个堆表。表 A 不在表 B 中的行被插入到表 B 中。

堆表(来自旧文本文件系统)没有主键/guids/标识符。有些表有重复的行,所以我们找到每一行的Hash,并去除重复,并创建主键标识符。

1)首先我们运行一个except语句,排除(哈希列)

select * from TableA
Except
Select * from TableB,
Run Code Online (Sandbox Code Playgroud)

2)然后我们在HashRowId上的两个表之间运行左连接比较

select * 
FROM dbo.TableA A
left join dbo.TableB B
    on A.RowHash =  B.RowHash
where B.Hash is null
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,Except Statement Insert 是最快的。

结果实际上与 David Lozinksi 的测试结果接近

在此处输入图片说明

performance sql-server hashing sql-server-2016 except performance-tuning

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

将标量函数转换为用于并行执行的 TVF 函数 - 仍在串行模式下运行

我的一个查询在发布后以串行执行模式运行,我注意到在从应用程序生成的 LINQ to SQL 查询中引用的视图中使用了两个新函数。所以我将这些 SCALAR 函数转换为 TVF 函数,但查询仍然以串行模式运行。

早些时候我在其他一些查询中做了 Scalar 到 TVF 的转换,它解决了强制串行执行的问题。

这是标量函数:

CREATE FUNCTION [dbo].[FindEventReviewDueDate]
(
       @EventNumber VARCHAR(20),
       @EventID VARCHAR(25),
          @EventIDDate BIT
)

RETURNS DateTime
AS
BEGIN

DECLARE @CurrentEventStatus VARCHAR(20)
DECLARE @EventDateTime DateTime
DECLARE @ReviewDueDate DateTime


SELECT @CurrentEventStatus = (SELECT cis.EventStatus
                                 FROM CurrentEventStatus cis 
                                 INNER JOIN Event1 r WITH (NOLOCK) ON (cis.Event1Id = r.Id)
                                 WHERE (r.EventNumber = @EventNumber) AND r.EventID = @EventID)

SELECT @EventDateTime = (SELECT EventDateTime FROM Event1 r 
                          WHERE (r.EventNumber = @EventNumber) AND r.EventID = …
Run Code Online (Sandbox Code Playgroud)

performance sql-server parallelism functions query-performance performance-tuning

10
推荐指数
3
解决办法
574
查看次数