【发布时间】:2014-07-25 22:38:26
【问题描述】:
我有一个名为profile 的表,其中包含用户信息。我需要对此表进行过滤查询并获得:
- 与此查询匹配的行数。
- 仅前 5000 个匹配行的数据。
我正在寻找一种最佳方式来做到这一点。显然,至少需要进行一次扫描才能进行计数,但理想情况下,数据库可以在进行计数时获取顶部匹配项。
以下查询给了我正确的结果,但它看起来有点 hacky。我想知道它是否可以做得更好?
WITH total AS (
SELECT COUNT(*) AS total FROM profile
WHERE project_id = 1 and some_prop = 100)
SELECT total.total, full_name, other_prop
FROM profile
INNER JOIN total ON 1 = 1
WHERE project_id = 1 and some_prop = 100
ORDER BY full_name ASC
LIMIT 5000
有没有更有效的方法来做到这一点?
【问题讨论】:
-
鉴于您正在做的事情,我认为它没有什么特别的问题,但是您可以将“inner join total on 1 = 1”更改为“cross join total”,这更有意义,虽然我怀疑它会表现得更好。
-
基本上与此重复:stackoverflow.com/questions/156114/…。但不确定 Redshift,它是过时和现代功能的奇怪组合。
-
您的窗口方法在 Redshift 上也是最快的(到目前为止)。
标签: sql postgresql amazon-redshift