使用 2 个表(A 和 B),可通过它们的 PK 连接,A 的主键按 DESC 排序(PK 按 MySQL 8 允许的降序排列),并且 A 有 2 个按 ASC 排序的索引。
当我执行类似的查询时
SELECT * FROM `A` a
LEFT JOIN `B` b ON a.id <=> b.id
WHERE a.idx1 = 'X' AND a.idx2 = 'Y';
Run Code Online (Sandbox Code Playgroud)
它不会返回任何内容...但是,如果我添加一个精确的条件,例如:
SELECT * FROM `A` a
LEFT JOIN `B` b ON a.id <=> b.id
WHERE a.idx1 = 'X' AND a.idx2 = 'Y' AND a.id = 1337;
Run Code Online (Sandbox Code Playgroud)
它将查找具有指定值作为 PRIMARY KEY 的行。
解释表明,当 MySQL 没有找到任何内容时,它将使用“index_merge_intersection”优化。如果我们禁用“index_merge”优化,第一个查询将按预期返回所有结果。
为什么?
我试图找出外部排序性能,它依赖于 WORK_MEM 值。我已经测试过增加 WORK_MEM 并不总是加速外部排序(下面的例子,在 PostgreSQL 9.6 上测试过)。是否有关于设置 WORK_MEM 的任何指导,说 WORK_MEM 的值是使用外部排序对 4GB 表进行排序的最佳值?是否可以从表大小和 WORK_MEM 设置中估计 IO 的数量?
我知道我可以研究 tuplesort.c 和底层算法,有现成的结果吗?
create table t1
as
select
c as key
, cast('value' as char(5)) as val
from generate_series(1, 100000000) c;
--4223 MB
select pg_size_pretty(pg_total_relation_size('t1'));
\timing
--time - 146725.833 ms
SET WORK_MEM = '128MB';
create table t_128 as select * from t1 order by key;
--time - 148889.655 ms
SET WORK_MEM = '1024MB';
create table t_1024 as select * from t1 order …Run Code Online (Sandbox Code Playgroud) 我正在运行一个查询并且执行它需要很长时间,查看执行计划我可以看到 51% 的成本在 SORT 中?在实际查询中,我没有按任何东西排序。
任何人都知道如何降低此排序百分比或将其全部删除?这是我正在运行的查询。
SELECT Time_ID,
Site_Type_ID,
Abandoned_ID,
WorkType_ID,
SUM (staging.dbo.measure.ring_time) AS Ring_Time,
SUM (staging.dbo.measure.hold_time) AS Hold_Time,
SUM (staging.dbo.measure.talk_time) AS Talk_Time,
SUM (staging.dbo.measure.acw_time) AS ACW_Time,
COUNT(*) CallCount
FROM measure
INNER JOIN DataMartEnd.dbo.Time_Dim
ON measure.StartTimeDate BETWEEN Time_Dim.Time_Start AND Time_Dim.Time_End
INNER JOIN datamartend.dbo.Site_Type_Dim
ON measure.DBID = Site_Type_Dim.Site_Type_Code
INNER JOIN datamartend.dbo.Abandoned_Call_Dim
ON measure.Abandoned = Abandoned_Call_Dim.abandoned_value
INNER JOIN DataMartEnd.dbo.Work_Type_Dim
ON measure.DBID = work_type_dim.MIG_Site_ID
AND Work_Type_Dim.Work_Type_Code = measure.Queue
AND measure.StartTimeDate BETWEEN Work_Type_Dim.DimEffectiveStartDtm AND Work_Type_Dim.DimEffectiveEndDtm
GROUP BY Abandoned_ID,
WorkType_ID,
Site_Type_ID,
time_id
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助。
添加新类别和更改现有类别时,我需要为类别设置自定义顺序。我相信代码和 sql 查询在两种情况下都是相同的。在我的webshop_categories-table 中,我有一个so-column(排序顺序 INT),我用它来确定应将类别输出给查看器的顺序。
这是我的类别表外观的简化示例(so = sort_order):
id | name | so
--------------------
1 | Shoes | 1
2 | Hats | 2
3 | Bags | 3
4 | Coats | 4
5 | Rings | 5
Run Code Online (Sandbox Code Playgroud)
添加新类别时,无需定义排序顺序,我只需提交一个表单,然后运行如下查询:
$so = $dbh->query('SELECT (MAX(so)+1) FROM webshop_categories WHERE so != 0')->fetchColumn();
$ins = $dbh->prepare('INSERT INTO webshop_categories (name, so)')->execute([$_POST['name'], $so]);
Run Code Online (Sandbox Code Playgroud)
(这将添加一个新类别,并将其放在最后。在这种情况下,so将设置为 6)
这是添加新类别的非常基本的方法。工作正常。但是在大多数情况下,在处理类别时,需要将其按特定顺序进行展示。
但通常在添加新类别时,人们会希望指定该新类别相对于现有类别应放置的位置。那时更新so-column 对我来说是一个脑筋急转弯......
我用于添加新类别的简化表格:
<form>
<input type="text" name="name">
<select name="so">
<option value="0" …Run Code Online (Sandbox Code Playgroud) 我有一个包含活动列表的 SQL Server (RDBMS) 表。每个活动都有一个开始和结束日期。
要求是对它们进行排序,以便首先显示具有 NULL 结束日期的那些(建议“当前” - 开始日期降序),但具有开始和结束值的那些要在“的末尾排序当前”行并按 end_date 降序排序。
最后,开始和结束日期的所有值为 null 的值必须位于结果集的末尾。
具有结束日期但开始日期为空的值应在 END 日期 desc 片段中排序的第二部分中进行排序。
我的表中有一个列,其中特定列中的所有值都为空。现在,当我按此列 ASC 和 DESC 排序时,我应该得到与我的假设相同的结果。但我得到了不同的结果。我无法理解这种奇怪行为背后的原因。如果我删除我在这个表上创建的聚集索引,它会给出预期的结果,但通过保留该索引它不会。索引与此列无关。
该列将来会有值,同时这种行为在排序时会令人困惑。
谁能告诉为什么会发生?以及如何摆脱这个?
sorting ×6
sql-server ×3
index ×2
mysql ×2
mysql-8.0 ×1
php ×1
postgresql ×1
primary-key ×1
update ×1