我想在PostgreSQL中随机选择一行,我试过这个:
select * from table where random() < 0.01;
Run Code Online (Sandbox Code Playgroud)
但其他一些人推荐这个:
select * from table order by random() limit 1000;
Run Code Online (Sandbox Code Playgroud)
我有一个非常大的表,有5亿行,我希望它快.
哪种方法更好?有什么区别?选择随机行的最佳方法是什么?
Postgres 8.4及更高版本的数据库包含public
模式中的模式和公司特定表中的公用表company
.
company
模式名称始终'company'
以公司编号开头并以公司编号结束.
所以可能有以下模式:
public
company1
company2
company3
...
companynn
Run Code Online (Sandbox Code Playgroud)
应用程序始终适用于单个公司.
的search_path
相应指定在ODBC或连接Npgsql的字符串,如:
search_path='company3,public'
Run Code Online (Sandbox Code Playgroud)
如何检查给定表是否存在于指定的companyn
模式中?
例如:
select isSpecific('company3','tablenotincompany3schema')
Run Code Online (Sandbox Code Playgroud)
应该返回false
,并
select isSpecific('company3','tableincompany3schema')
Run Code Online (Sandbox Code Playgroud)
应该回来true
.
在任何情况下,该函数应仅检查companyn
传递的模式,而不检查其他模式.
如果两者public
和传递的模式中都存在给定的表,则该函数应该返回true
.
它适用于Postgres 8.4或更高版本.
出于分页目的,我需要使用LIMIT
和OFFSET
子句运行查询.但是我还需要计算没有LIMIT
和OFFSET
子句的查询返回的行数.
我想跑:
SELECT * FROM table WHERE /* whatever */ ORDER BY col1 LIMIT ? OFFSET ?
Run Code Online (Sandbox Code Playgroud)
和:
SELECT COUNT(*) FROM table WHERE /* whatever */
Run Code Online (Sandbox Code Playgroud)
同时.有没有办法做到这一点,特别是让Postgres优化它的方式,这样它比单独运行更快?
我们需要计算PostgreSQL表中的行数.在我们的例子中,不需要满足任何条件,如果显着提高查询速度,那么获得行估计是完全可以接受的.
基本上,我们希望select count(id) from <table>
尽可能快地运行,即使这意味着没有得到确切的结果.
谢谢!任何建议将不胜感激!
这个问题是关于first_value()
使用其他功能或解决方法的功能.
它也是关于大表中"性能上的微不足道".使用例如.max()
在下面解释的上下文中,要求虚假比较.即使速度很快,也会产生一些额外的成本.
这种典型的查询
SELECT x, y, count(*) as n
FROM t
GROUP BY x, y;
Run Code Online (Sandbox Code Playgroud)
需要重复所有列GROUP BY
以返回多个列.执行此操作的语法糖是使用位置引用:
SELECT x, y, count(*) as n
FROM t
GROUP BY x, 2 -- imagine that 2, 3, etc. are repeated with x
Run Code Online (Sandbox Code Playgroud)
有时不仅需要糖,还需要一些语义来理解复杂的上下文:
SELECT x, COALESCE(y,z), count(*) as n
FROM t
GROUP BY x, y, z -- y and z are not "real need" grouping clauses?
Run Code Online (Sandbox Code Playgroud)
我可以想象许多其他复杂的背景.让我们看看通常的解决方案:
SELECT x, max(y) as y, count(*) as n
FROM t …
Run Code Online (Sandbox Code Playgroud) 我目前正在使用Postgres 9.3.3.
如果refresh
是物化视图,那个物化视图上的索引是否也重新编制索引?或者索引是否需要手动重新编制索引?
在查看以下问题时,它看起来像它但没有答案,我似乎无法找到任何支持文档.
我阅读了Postgres Wiki中的慢速计数条目。
对于我的表格来说,估计值相当准确。不过,对于观点
SELECT reltuples FROM pg_class WHERE relname = 'tbl';
Run Code Online (Sandbox Code Playgroud)
不起作用并且总是返回 0 条记录。除此之外,还有其他方法可以计算或估计 Postgres 中视图的行数吗?
SELECT COUNT(*) FROM someview;
Run Code Online (Sandbox Code Playgroud)
ANALYZE
对于视图也不起作用(对于表没有问题),我只是得到:
ANALYZE v_myview;
WARNING: skipping "v_myview" --- cannot analyze non-tables or special system tables
ANALYZE
Run Code Online (Sandbox Code Playgroud) postgresql ×8
sql ×7
count ×3
database ×1
indexing ×1
limit ×1
pagination ×1
performance ×1
random ×1
search-path ×1
view ×1