sql - 按另一列排序一列的有效方法
问题描述
我在设计一种通过排序另一个表对一个表进行排序的有效方法时遇到了问题。
我有一个Customer
,其中有一个LicenceId
和Country
,Licence
表有列Name
。我想显示按许可证名称排序的前 1000 名客户Country = "DK"
。
有超过 10klicences
和超过 1M 的客户。
我最初的想法是对许可证进行排序并将它们存储在Dictionary<string, int>
key 是 aName
并且 value 是有序元素的索引的地方。然后创建一个Min Heap
容量为 1000 的,并使用这些排序索引将客户添加到堆中。这将导致O(nlog(n)) + O(mlog(1000)
(n - #licences,m - #customers)。
但是当谈到在 SQL 中实现它时,我在将客户数据加载到内存(~100MB)时遇到了一些问题,这会减慢进程,并且在 SQL 中对整个客户表进行排序也没有那么快。有没有更快的解决方案?
解决方案
您将从编写 SQL 查询开始:
select c.*, l.licensename
from customers c join
licenses l
on c.licenseid = l.licenseid
where c.country = 'DK'
order by l.licensename
fetch first 1000 rows only;
然后,您将让优化器完成工作。在这种情况下,您可能希望索引customers(country, licenseid)
和licenses(licenseid, licensename)
-- 尽管第二个可能存在,如果licenseid
被声明为主键。
不要担心微优化。这就是 SQL 优化器的工作。