标签: performance

SQL Server 索引和查询计划器的奇怪问题

几天前我们发生了一系列崩溃和恢复,在这些之后,SQL Server 数据库一直表现得很奇怪。我们知道故障转移集群存在一些问题,因此我们不得不再次启动服务器以最终使数据库看似正常工作。

随之而来的问题之一是,我们运行了一个大脚本,该脚本动态删除现有索引并重新创建它们,唯一的区别是它们现在使用 WHERE 列 NOT NULL 进行过滤。然而,出于某种原因,当我从 SSMS 对象资源管理器中选择 SCRIPT INDEX -> CREATE TO -> NEW QUERY WINDOW 时,它提供了基本的索引创建脚本,其中不过滤索引。当我们具有完全权限的客户执行相同操作时,创建脚本会正确显示它已被过滤。

这可能是权限问题(在 Google 上没有找到任何此类问题),还是有可能在脚本正确记录更改时,节点或查询优化器或任何不同步的东西?

类似地,以前执行良好的几个查询(并且仍然在作为此数据库副本的不同数据库中执行良好),现在通过执行计划显示它们的行为有所不同。例如,其中之一有以下问题:

  1. 默认情况下,执行计划器显示 SQL Server 使用了错误的索引,在嵌套循环中产生了数百万行而不是它应该的 2 行。
  2. 另一个索引是正确的,但会产生数百万个嵌套循环,而在此服务器的副本中,我们只能得到 3 个。
  3. 当副本被迫使用与第 1 部分中的问题 DB 相同的错误索引时,它仍然只在嵌套循环中返回 2 行。

这些问题的原因可能是什么,甚至如何开始诊断问题?如上所述,数据库是彼此的副本。唯一的区别是问题数据库崩溃了,数据库被移动到故障转移集群,然后再次返回到正确的节点。索引没有碎片化,统计数据刚刚更新,SQL Server 的查询计划器似乎负载过重。

我真的很感激一些关于可能是什么原因以及我将如何诊断实际问题的专家建议,谢谢。

performance sql-server-2008 clustering

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

通过分区提高性能

我正在使用 SQL Server 2012。我正在使用 CTE 从项目表中创建一个订单表。订单表的最终计数约为 1.2 亿。整个过程大约需要2个小时。

对表进行分区是否有助于减少完成时间?

如果是这样,我可以按订单年份对空表进行分区,然后从 CTE 插入到订单表中吗?或者我是否需要在 items 表上创建一个分区,因为 CTE 是从 items 表中汇总的?

此外,我估计的行数与实际行数有很大不同。

performance sql-server partitioning sql-server-2012

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

涉及 XML 列的两个类似查询的相对成本

我有两个查询,如下所示,它们做同样的事情。这xmlcolumn是一个数据类型为 XML 的列。我使用这些查询在 XML 列中的任何位置搜索字符串。

我检查了这两个查询的执行计划,发现第一个查询的 I/O 成本和子树成本低于第二个。我原以为第一个会在使用cast和 时具有更高的成本charindex,但事实并非如此。

为什么它的成本更低?

第一个查询:

SELECT * 
FROM mytable
WHERE ( Charindex('abc',CAST([xmlcolumn] AS VARCHAR(MAX)))>0 ) 
Run Code Online (Sandbox Code Playgroud)

第二个查询:

SELECT * 
FROM mytable t1
WHERE t1.[xmlcolumn].exist('//*/text()[contains(.,"abc")]')=1
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2008 xml execution-plan

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

布尔用途列 char(0) 或 tinyint(1)

对于布尔用途列,哪个更好:可为空char(0)tinyint(1).

我知道 bool 是 tinyint(1) 的别名,但在 O'reilly 出版的“高性能 MySQL”一书中说:

“如果您想在单个存储空间中存储真/假值,另一种选择是创建一个可为空的 CHAR(0) 列。该列能够存储值 (NULL) 或零的缺失-length 值(空字符串)。"

哪个更适合大小、性能、索引或...

更新:我发现此链接对这个问题很有用: Innodb Tables 的高效布尔值存储

mysql performance database-design optimization datatypes

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

使用 like over charindex 来搜索模式

我们在这里使用 charindex 来搜索一个字符串,如下所示

SELECT *
FROM tablename
WHERE ( Charindex('47a%$.abc',CAST(columnname AS VARCHAR(MAX)))>0 )
Run Code Online (Sandbox Code Playgroud)

我打算用 LIKE 替换 charindex,因为我只需要搜索模式是否存在而不是位置。所以我想知道在我的情况下使用 LIKE 而不是 charindex 有什么缺点。我在几种情况下使用 charindex。所以我希望它适用于所有 sql 数据类型,包括特殊字符在内的所有字符(包括 %(就像已经使用了 %pattern%)。所以请告诉我使用 like 超过 charindex 有什么缺点

performance sql-server-2008-r2 pattern-matching

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

如果表将有数十亿行,则在设计数据库架构时的注意事项

我即将开始从事电话词典类项目。它确认字典表中将有数十亿条记录,并且该字典表中的每个条目可能有参考字典表的进一步库存表。我之前没有使用过如此庞大的数据库。

InnoDB 有利于维护关系数据库。有类别和子类别引用,所以我将使用 InnoDB。会出现一种情况,我需要根据类别或子类别,甚至根据州和城市来显示总数。等等……它可以是任意组合。

我熟悉在大多数搜索列上创建索引。我听说过表分区也有助于加快查询速度。

我的问题是在创建此类将有数十亿行的数据库表时,在早期阶段我应该考虑哪些要点,以便以后当表变大时,我可以通过选择查询和 DML 查询将表性能保持在高水平(插入,更新)。

指导会给我很大帮助。

mysql performance database-design database-recommendation query-performance

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

恢复模式会影响查询速度吗?

使用完全恢复模型会使长时间运行的 DELETE 操作比在简单恢复模型下更慢吗?

performance sql-server-2008-r2

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

优化 Postgres 查询

我有从用户到地址表的一对一关系。一位用户可以拥有一个搜索地址和一个经过验证的地址。

我在地址表上有两个索引:

  • 状态字段索引
  • user_id 上的索引

我正在尝试仅为某些用户获取地址,而那些状态不是manual_verification.

这是我的查询:

SELECT users.id 
FROM "users" INNER JOIN addresses 
     ON  addresses.user_id = users.id 
     and addresses.type = 'VerifiedAddress' 
WHERE ("users".deleted_at IS NULL) 
  AND (users.id in (11144,10569,21519,783,15671,21726,17787,11665,
                    19579,12226,1324,9413,5461,20981,12906) 
  and addresses.state != 'manual_verification')
Run Code Online (Sandbox Code Playgroud)

解释上面的查询:http : //explain.depesz.com/s/rTj

需要 37 毫秒。有时更多取决于用户数量。

我认为这是一个很好的查询,但是我们的团队需要对此进行调查,我正在寻找一些优化技巧。我的意思是我做了一个字段选择,user_id(地址)和状态(地址)上有一个索引。

还有什么我可以做/尝试的吗?

更新

我发现这个查询的工作速度要快得多:

 SELECT "addresses"."user_id" 
    FROM "addresses" 
    WHERE "addresses"."type" IN ('VerifiedAddress') 
    AND (user_id in (9681,23824,23760,20098,962,14730,12294,9552,534,
                     553,5837,6768,6583,956,24179) and state != 'manual_verification')
Run Code Online (Sandbox Code Playgroud)

解释这个查询:http : //explain.depesz.com/s/nHrr

postgresql performance index postgresql-performance

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

高并发下如何保持MySQL性能

使用“mysqlslap”观察到以下情况。

mysqlslap -u root -p --create-schema=matrix --query=monthly_kpi.sql --iterations=1 --concurrency=1 --delimiter=";"
Benchmark
        Average number of seconds to run all queries: 2.735 seconds
        Minimum number of seconds to run all queries: 2.735 seconds
        Maximum number of seconds to run all queries: 2.735 seconds
        Number of clients running queries: 1
        Average number of queries per client: 24

mysqlslap -u root -p --create-schema=matrix --query=monthly_kpi.sql --iterations=1 --concurrency=4 --delimiter=";"
Benchmark
        Average number of seconds to run all queries: 14.600 seconds
        Minimum number of seconds to run …
Run Code Online (Sandbox Code Playgroud)

mysql performance concurrency

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

如何加速包含大量带有 ILIKE 条件的连接的 Postgres 查询

我有一个奇怪的问题,我真的不明白。简单地说,我有一个包含 4 个表连接的连接,我相信它们都有适当的索引,但是查询需要大量的时间,除非我删除它的一部分。

更大的图片是,有 3 种类型的对象 A、B 和 C,每个对象都有自己的表,并且相关联,A 是孩子,B 是父母,C 是祖父母。除此之外,还有一个关系表 R,允许多个 B 与多个 C 相关,并且由于关系 R 属于特定类型,因此还有一个附加表 T。

现在在有问题的查询中,我试图获取类型 A 的记录列表,谁的父母与祖父母有特定类型的关系,祖父母的名字 ILIKE 另一个字符串。

表A有~700k条记录,表B有~60k条记录,表C有~8k条记录,表R有~90k条记录,表T有~100条记录。

由于 A 包含链接到字段 B.id 的字段 parent_id,因此 B 不需要直接包含在查询中。

所以查询是这样的:

SELECT DISTINCT A.id, A.name
FROM A
JOIN R ON A.parent_id=R.lhs
JOIN T ON R.type=T.id AND T.alias='type-name'
JOIN C ON R.rhs=C.id
WHERE A.flag=1 AND A.strvalue='value' AND C.name ILIKE '%substr%'
ORDER BY A.name ASC
LIMIT 25;
Run Code Online (Sandbox Code Playgroud)

像这样运行查询需要超过 10 秒(我从来没有让它运行完成,因为它需要太长时间)。

在我的实际设置中,我在关键 ID 字段中有类型,所以查询实际上挂在类型中的一个字段上,但索引也会这样做。

奇怪的是我已经尝试从查询中取出位,因此尝试确定花费太长时间的位,并删除 T 部分或 ILIKE 部分似乎使其在正常时间范围内执行。 …

postgresql performance optimization query-performance

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