我正在尝试存储大量在存储为INT值时会被截断的大数。不幸的是,它们对于这种类型来说太大了。
我正在考虑使用Base36编码来实现这一点。有没有其他方法可以解决这个问题?
为什么下面的查询很慢?
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 并不真正理解,因此提出了一个糟糕的查询计划。有关 …
我有一个包含 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
我正在探索 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.0或64格式的查询,其中谓词表示隐式转换输入money。
对于WHERE [Rate] > 6.5估计值28.44,然后以高于 的速率停止100。
对于WHERE [Rate] > 7排除小数的地方,28.44估计一直运行到255
对于WHERE [Rate] >= 6.5该28.44估算使用长达约100然后改到17.7764多达1000之前估计下降到1。
所以似乎没有太多的一致性。似乎 …
如果我的OPTIMIZE FOR UNKNOWN存储过程中有一个,我是否能够看到数据库确定的最佳值?
performance sql-server stored-procedures optimization plan-cache
在某些情况下,我被告知不要对生产中的表执行 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 做这件事特别感兴趣]
pg_repack。注意事项:在 Windows 上可能不容易实现,未使用 postgresql 9.6 进行测试。看起来是最有希望的选择。pg_reorg: 类似于 pg_repack(是它的基础)=> 自 postgresql 9.4 以来似乎没有更新,并且它主要被pg_repack.postgresql optimization maintenance online-operations postgresql-9.6
我想请您澄清 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) 在连接后跟 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) 我有 4 个表,让我们将它们命名为:
(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
(这篇文章的后续内容:当我在子查询中 ORDER BY 时,为什么我的 PostgreSQL 表达式索引没有被使用?)
PostgreSQL 9.5。
我不能透露全部细节,但table有 22 列和 5 个索引:
text(btree)text(btree)timestamp with time zone(btree)tsvector(杜松子酒)bigint(btree)(从上一篇文章你知道我试图避免创建这个额外的列,只是使用表达式索引——将两integer列加在一起——没有成功。bigint这里的列可能只是“整数”,但我做了一个创建它时出错;添加列、填充它并重新编制索引花了大约一个小时,所以我希望这不相关,但要提及它以防万一。)
除了tsvector.
以下查询都只需要 12ms 并且只使用一个Index Scan:
SELECT pk FROM table ORDER BY pk DESC LIMIT 10SELECT pk FROM table ORDER BY text_column DESC LIMIT 10SELECT pk FROM table ORDER BY timestamp_column DESC LIMIT 10 …postgresql performance index optimization postgresql-9.5 postgresql-performance
optimization ×10
performance ×5
mysql ×3
postgresql ×3
sql-server ×3
amazon-rds ×1
index ×1
innodb ×1
maintenance ×1
mariadb ×1
mysql-5 ×1
mysql-5.5 ×1
mysqltuner ×1
plan-cache ×1
subquery ×1