标签: sorting

为什么 MySQL 8 在使用具有降序主键、2 个索引以及与现有行的有效联接条件的表时不返回任何行

使用 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”优化,第一个查询将按预期返回所有结果。

为什么?

mysql index primary-key sorting mysql-8.0

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

PostgreSQL 外部排序性能

我试图找出外部排序性能,它依赖于 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)

postgresql sorting

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

估计执行计划 SQL Server 排序?

我正在运行一个查询并且执行它需要很长时间,查看执行计划我可以看到 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-server sorting sort-operator

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

更改行时如何更新其他行的“sorting_order”列?

添加新类别和更改现有类别时,我需要为类别设置自定义顺序。我相信代码和 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)

mysql php sorting update

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

如果结束日期为空,则按开始日期 Desc 排序,否则按结束日期排序

我有一个包含活动列表的 SQL Server (RDBMS) 表。每个活动都有一个开始和结束日期。

要求是对它们进行排序,以便首先显示具有 NULL 结束日期的那些(建议“当前” - 开始日期降序),但具有开始和结束值的那些要在“的末尾排序当前”行并按 end_date 降序排序。

最后,开始和结束日期的所有值为 null 的值必须位于结果集的末尾。

具有结束日期但开始日期为空的值应在 END 日期 desc 片段中排序的第二部分中进行排序。

sql-server sorting

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

对所有空值的列进行排序有奇怪的行为

我的表中有一个列,其中特定列中的所有值都为空。现在,当我按此列 ASC 和 DESC 排序时,我应该得到与我的假设相同的结果。但我得到了不同的结果。我无法理解这种奇怪行为背后的原因。如果我删除我在这个表上创建的聚集索引,它会给出预期的结果,但通过保留该索引它不会。索引与此列无关。

该列将来会有值,同时这种行为在排序时会令人困惑。

谁能告诉为什么会发生?以及如何摆脱这个?

index sql-server sorting

-2
推荐指数
2
解决办法
162
查看次数