我的问题由以下查询表示:
SELECT
b.row_id, b.x, b.y, b.something,
(SELECT a.x FROM my_table a WHERE a.row_id = (b.row_id - 1), a.something != 42 ) AS source_x,
(SELECT a.y FROM my_table a WHERE a.row_id = (b.row_id - 1), a.something != 42 ) AS source_y
FROM
my_table b
Run Code Online (Sandbox Code Playgroud)
我使用相同的子查询语句两次,以获得两者source_x和source_y.这就是为什么我想知道是否可以只使用一个子查询来做到这一点?
因为一旦我对我的真实数据(数百万行)运行此查询,它似乎永远不会完成并花费数小时,如果不是几天(我的连接在结束前挂起).
我正在使用PostgreSQL 8.4
是否有标准方法在数据库中存储年份和月份?我需要根据几个月和几年做一些报告.
我不能使用日期和函数来实时提取几个月,因为表格很大,所以我需要预处理.
我有一个带有2个索引的PostgreSQL表.其中一个索引是覆盖website_id和tweet_id列,是一个独特的B树索引.第二个索引仅覆盖website_id列,并且是非唯一索引.
如果第一个索引存在,第二个索引是多余的吗?换句话说,拥有第二个指数是否没有优势?
我有一个定义相互递归表的模型:
Answer
questionId QuestionId
text
Question
text
correct AnswerId
Run Code Online (Sandbox Code Playgroud)
实际插入问题需要做什么?我需要先知道正确答案是什么.但要插入答案,我需要知道它回答了什么问题.
如果重要的话,我正在运行Postgres.
DDL是:
CREATE TABLE answer (
id integer NOT NULL, -- answer id
text character varying NOT NULL, -- answer text
question_id bigint NOT NULL -- question id
);
CREATE TABLE question (
id integer NOT NULL, -- question id
question character varying NOT NULL, -- question text
correct bigint NOT NULL, -- correct answer
solution character varying NOT NULL -- solution text
);
ALTER TABLE ONLY answer ALTER COLUMN …Run Code Online (Sandbox Code Playgroud) sql postgresql database-design referential-integrity foreign-keys
给定一个大表(1000万到1亿行),添加一些额外(未编入索引)的列的最佳方法是什么?
答案的变化取决于额外的列是密集的(大多数不是空的)还是稀疏的(大多数是空的)?
我有一个查询需要9分钟才能在x86_64-unknown-linux-gnu上运行PostgreSQL 9.0.0,由GCC gcc(GCC)4.1.2 20080704(Red Hat 4.1.2-46)编译,64位
这个查询由hibernate为我的应用程序自动生成.它试图找到一所学校的所有"教师成员".成员资格是在组中具有角色的用户.有几种类型的团体,但重要的是学校和服务.如果有人是服务中的教师和该学校的成员(15499),那么他们就是我们正在寻找的.
这个查询过去在生产中运行良好,但在开发中运行良好,但在生产中,它现在需要几分钟才能运行.你能帮我理解为什么吗?
这是查询:
select distinct user1_.ID as ID14_, user1_.FIRST_NAME as FIRST2_14_, user1_.LAST_NAME as LAST3_14_, user1_.STREET_1 as STREET4_14_, user1_.STREET_2 as STREET5_14_, user1_.CITY as CITY14_, user1_.us_state_id as us7_14_, user1_.REGION as REGION14_, user1_.country_id as country9_14_, user1_.postal_code as postal10_14_, user1_.USER_NAME as USER11_14_, user1_.PASSWORD as PASSWORD14_, user1_.PROFESSION as PROFESSION14_, user1_.PHONE as PHONE14_, user1_.URL as URL14_, user1_.bio as bio14_, user1_.LAST_LOGIN as LAST17_14_, user1_.STATUS as STATUS14_, user1_.birthdate as birthdate14_, user1_.ageInYears as ageInYears14_, user1_.deleted as deleted14_, user1_.CREATEDATE as CREATEDATE14_, user1_.audit …Run Code Online (Sandbox Code Playgroud) 我试图更好地了解创建 Postgres 索引所涉及的权衡。作为其中的一部分,我很想了解通常使用多少空间索引。我已经通读了文档,但找不到任何关于此的信息。我一直在做我自己的小实验来创建表和索引,但是如果有人能解释为什么大小是这样的,那就太棒了。假设一个像这样有 1M 行的公共表,其中每一行都有一个唯一的id和唯一的outstanding.
CREATE TABLE account (
id integer,
active boolean NOT NULL,
outstanding double precision NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)
以及由创建的索引
CREATE INDEX id_idx ON account(id)CREATE INDEX outstanding_idx ON account(outstanding)CREATE INDEX id_outstanding_idx ON account(id, outstanding)CREATE INDEX active_idx ON account(active)CREATE INDEX partial_id_idx ON account(id) WHERE active你估计索引大小是多少字节,更重要的是,为什么?
我们有一个存储用户活动的关系表。像下面这样的查询需要77 秒!
FROM "site_activity"
WHERE
(
NOT "site_activity"."is_deleted"
AND "site_activity"."user_id" = 68812389
AND NOT (
"site_activity"."kind" IN (
'updated',
'duplicated',
'reapplied'
)
)
AND NOT (
"site_activity"."content_type_id" = 14
AND "site_activity"."kind" = 'created'
)
)
ORDER BY
"site_activity"."created_at" DESC,
"site_activity"."id" DESC
LIMIT 9;
Run Code Online (Sandbox Code Playgroud)
查询计划如下所示
QUERY PLAN
--------------------------------------------------------------------------------------------
Limit
(cost=17750.72..27225.75 rows=9 width=16)
(actual time=199501.336..199501.338 rows=9 loops=1)
Output: id, created_at
Buffers: shared hit=4502362 read=693523 written=37273
I/O Timings: read=190288.205 write=446.870
-> Incremental Sort
(cost=17750.72..2003433582.97 rows=1902974 width=16)
(actual time=199501.335..199501.336 rows=9 loops=1)
Output: …Run Code Online (Sandbox Code Playgroud) 我varchar[]在Postgres 9.2中使用了一个列(varchar数组)来存储一些标签.在按标记检索行时,我希望查询不区分大小写.但是,我想保留在UI中显示的大小写(因此我不能只将小部件存储为小写).
所以,我的问题是如何在varchar数组中在Postgres中创建一个不区分大小写的索引?一种可能的方法是在列上创建功能性GIN索引.怎么做到这一点?还有其他方法吗?
例如,我有表用户(id,用户名,电子邮件).
以下查询之间有什么区别吗?(也许是表演,或其他任何事情)
SELECT id, username, email FROM users
Run Code Online (Sandbox Code Playgroud)
和
SELECT id, email, username FROM users
Run Code Online (Sandbox Code Playgroud)
通常,列顺序是否影响创建PostgreSQL表?
postgresql ×10
sql ×6
database ×4
indexing ×4
performance ×2
amazon-rds ×1
foreign-keys ×1
hibernate ×1
storage ×1