标签: optimization

通过 Base36 编码进行数据压缩

我正在尝试存储大量在存储为INT值时会被截断的大数。不幸的是,它们对于这种类型来说太大了。

我正在考虑使用Base36编码来实现这一点。有没有其他方法可以解决这个问题?

mysql database-design optimization

7
推荐指数
2
解决办法
713
查看次数

优化器未选择索引联合计划

为什么下面的查询很慢?

select count(*) 

from [dbo].[mt_dispatch_link] 
   , [dbo].[_mt_dispatch] [_mt_dispatch]

where   (mt_dispatch_link.contract_id_1 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_1 = _mt_dispatch.dispatch_id)

   or   (mt_dispatch_link.contract_id_2 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_2 = _mt_dispatch.dispatch_id)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这需要 10 多分钟,然后我倾向于在那个时候停止它。我的问题更多是关于如何理解查询计划。

查看查询计划,我可以看到底部聚集索引扫描返回大约 250000 条记录,但成本为 0% 并且它正在放入临时表中。

顶部索引扫描大约是 25000 条记录。

但是 95% 的成本来自嵌套连接。我应该从中得出什么结论?

上面的查询计划显示了两次索引扫描,是说它在做 25000 + 250000 次索引扫描,还是说它在做 25000 * 250000 次索引扫描?

如果我将查询更改为此(添加FORCESEEK):

select count(*) 

from [dbo].[mt_dispatch_link] 
   , [dbo].[_mt_dispatch] [_mt_dispatch] 

    WITH (FORCESEEK)

where   (mt_dispatch_link.contract_id_1 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_1 = _mt_dispatch.dispatch_id)

   or   (mt_dispatch_link.contract_id_2 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_2 = _mt_dispatch.dispatch_id)
Run Code Online (Sandbox Code Playgroud)

我最终得到了一个更好的计划,查询立即运行:

在此处输入图片说明

我在两个表上运行了更新统计信息。可惜没修好。表设计不是很好,所以我认为 SQL Server 并不真正理解,因此提出了一个糟糕的查询计划。有关 …

sql-server optimization execution-plan

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

MySQL 优化 - 年份列分组 - 使用临时表,文件排序

我有一个包含 600,000 条记录的交易表,我需要在财政年度的基础上列出仪表板的计数。使用的表是 MyISAM。我尝试为交易日期 ( tran_date)添加索引。即使它正在使用索引,它也会创建临时表,由于临时表和文件排序需要更多时间。有什么办法可以优化查询以提高查询时间?

SELECT COUNT( * ) AS cnt, CASE WHEN MONTH( tran_date ) >=3
THEN concat( YEAR( tran_date ) , '-', YEAR( tran_date ) +1 )
ELSE concat( YEAR( tran_date ) -1, '-', YEAR( tran_date ) )
END AS 财务年
从`交易1`
WHERE tran_date >= '2010-06-01'
按财务年分组

显示第 0 - 4 行(共 5 行,查询耗时 1.2095 秒)
id select_type table type possible_keys key key_len ref rows Extra
1 简单交易 1 范围 PRIMARY,tran_date tran_date 8 NULL 346485 使用 …

mysql mysql-5 performance optimization mysql-5.5 query-performance

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

SQL Server:没有直方图的准确行估计?

我正在探索 SQL Server 中的优化器,特别是直方图,我看到了一些奇怪的结果。

如果我执行下面的查询,我知道字段上没有直方图,SQL Server 会输出一个行估计值,等于实际结果。如果我要在我使用的地方运行相同的查询DECLARE @i NUMERIC(19,2) = 30.0而不是常量WHERE [Rate] < @i,那么估计值94.8与我对显示的查询的期望一样,因为数据库没有关于该字段的统计信息。

查询估计

所以我的问题是为什么 SQL Server 在没有该字段的统计信息时输出正确的结果?


AUTO_CREATE_STATISTICS按照我的回答所示关闭时,我在行估计中遇到了一些奇怪的行为。

表上存在一个约束,限制[Rate]在 之间6.5 - 200.0。估计取决于如果在实验时有很大的差异>,使用或>=以及24.064格式的查询,其中谓词表示隐式转换输入money

对于WHERE [Rate] > 6.5估计值28.44,然后以高于 的速率停止100

对于WHERE [Rate] > 7排除小数的地方,28.44估计一直运行到255

对于WHERE [Rate] >= 6.528.44估算使用长达约100然后改到17.7764多达1000之前估计下降到1。

所以似乎没有太多的一致性。似乎 …

sql-server optimization

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

找到 OPTIMIZE FOR UNKNOWN 正在使用的值

如果我的OPTIMIZE FOR UNKNOWN存储过程中有一个,我是否能够看到数据库确定的最佳值?

performance sql-server stored-procedures optimization plan-cache

7
推荐指数
2
解决办法
360
查看次数

如何在减少膨胀或 ALTER (ing) 表的同时最小化访问独占表锁?

在某些情况下,我被告知不要对生产中的表执行 VACUUM FULL(或 CLUSTER),因为这将独占锁定它的时间比预期的要长。这同样适用于几个 ALTER TABLE 操作(例如更改几个列的类型)。

提出的替代方案始终是执行以下操作:

 CREATE TABLE new_table AS SELECT * FROM old_table ;
 -- recreate all indices and constraints
 ALTER TABLE old_table RENAME TO going_to_drop_table ;
 ALTER TABLE new_table RENAME TO old_table ;
 DROP TABLE going_to_drop_table ;
Run Code Online (Sandbox Code Playgroud)

这适用于没有依赖关系的场景old_table(意味着没有任何依赖它的视图,也没有任何外键约束、函数等),并且old_table没有任何插入或更新。但在大多数数据库中,这将是一个例外,而不是规则。

有没有办法在不丢失依赖关系的情况下进行这样的“表交换”?

[为了完整起见:我对如何为 PostgreSQL 9.5 或 9.6 做这件事特别感兴趣]


研究到现在(关于根本原因):

  1. 是否可以在 Postgres 中异步运行 VACUUM FULL?=> pg_repack。注意事项:在 Windows 上可能不容易实现,未使用 postgresql 9.6 进行测试。看起来是最有希望的选择。
  2. pg_reorg: 类似于 pg_repack(是它的基础)=> 自 postgresql 9.4 以来似乎没有更新,并且它主要被pg_repack.
  3. 来自 …

postgresql optimization maintenance online-operations postgresql-9.6

7
推荐指数
0
解决办法
690
查看次数

Mariadb MySQL Tuner 报告令人困惑

我想请您澄清 mysqltuner 关于 MariaDB 数据库的报告。mysqltuner 是用 --nogood 标志调用的!

 >>  MySQLTuner 1.7.1 - Major Hayden <major@mhtx.net>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering

[--] Skipped version check for MySQLTuner script
[!!] Currently running unsupported MySQL version 10.0.29-MariaDB-0ubuntu0.16.04.1

-------- Log file Recommendations ------------------------------------------------------------------
[--] Log file: (0B)
[!!] Log file  doesn't exist
[!!] Log file  isn't readable.

-------- Storage Engine Statistics -----------------------------------------------------------------
[--] Status: +ARCHIVE +Aria +BLACKHOLE +CSV +FEDERATED +InnoDB …
Run Code Online (Sandbox Code Playgroud)

mysql innodb mariadb optimization mysqltuner

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

我应该在加入之前使用子查询来限制表吗?

在连接后跟 where 子句的情况下,使用子查询来限制结果,然后进行连接会更好吗?例子:

SELECT * 
FROM Customers 
    NATURAL JOIN Orders 
WHERE shipped=1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它接缝 DBMS 将整个客户表与整个订单表连接,然后根据 where 子句过滤结果。使用子查询的等效查询是:

SELECT * 
FROM Customers 
    NATURAL JOIN (SELECT * 
                     FROM Orders 
                     WHERE shipped=1) AS O
Run Code Online (Sandbox Code Playgroud)

在这里,可能有一个较小的 Orders 表要加入。同样,如果有限制客户和订单的 where 子句:

SELECT * 
FROM Customers 
    NATURAL JOIN Orders 
WHERE country='US' AND shipped=1
(assuming country attribute belongs to Customers table)
Run Code Online (Sandbox Code Playgroud)

等效的子查询查询:

SELECT * 
FROM (SELECT *
            FROM Customers 
            WHERE country='US') AS C 
    NATURAL JOIN (SELECT * 
                                 FROM Orders 
                                 WHERE shipped=1) AS O
Run Code Online (Sandbox Code Playgroud)

performance optimization subquery query-performance

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

使用 WITH 构造的奇怪优化效果

我有 4 个表,让我们将它们命名为:

  1. 表 A,15M 行
  2. 表 B,40K 行,
  3. 表 C,30K 行,
  4. 表 D,25M 行

(kk - 表示数百万)

我有一个遗留查询,它是这样构造的:

select C.<some_fields>,B.<some_fields>,D.<some_fields> from C
inner join A on C.x = A.x
inner join D on D.z = 123 and D.a_id = A.a_id
inner join B on C.x = B.x and B.z = 123
where A.type = 'Xxx'
Run Code Online (Sandbox Code Playgroud)

此查询非常慢,执行结果最多需要 3 分钟(对于特定情况,它返回 35k 行)。

但是当我将其更改为以下结构时:

with t as (
   select C.<some_fields>,D.<some_fields> from C
   inner join A on C.x = A.x
   inner join D …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization execution-plan amazon-rds query-performance

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

为什么 PostgreSQL 9.5 不使用我最新的 ORDER BY 索引,即使它使用类似的索引就好了?

(这篇文章的后续内容:当我在子查询中 ORDER BY 时,为什么我的 PostgreSQL 表达式索引没有被使用?

PostgreSQL 9.5。

我不能透露全部细节,但table有 22 列和 5 个索引:

  1. 主键 ('pk'), text(btree)
  2. 另一个text(btree)
  3. 一个timestamp with time zone(btree)
  4. 一个tsvector(杜松子酒)
  5. 我最新的一个bigint(btree)

(从上一篇文章你知道我试图避免创建这个额外的列,只是使用表达式索引——将两integer列加在一起——没有成功。bigint这里的列可能只是“整数”,但我做了一个创建它时出错;添加列、填充它并重新编制索引花了大约一个小时,所以我希望这不相关,但要提及它以防万一。)

除了tsvector.

以下查询都只需要 12ms 并且只使用一个Index Scan

  1. SELECT pk FROM table ORDER BY pk DESC LIMIT 10
  2. SELECT pk FROM table ORDER BY text_column DESC LIMIT 10
  3. SELECT pk FROM table ORDER BY timestamp_column DESC LIMIT 10 …

postgresql performance index optimization postgresql-9.5 postgresql-performance

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