在PostgreSQL中有一种更快的方法来基本上在几行中执行if吗?
说我有一张桌子
ticket | row | archived
1 | 1 | true
1 | 2 | true
1 | 3 | true
2 | 1 | false
2 | 2 | true
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以在ticket =的列下面做一个if语句?因此,ticket = 1的地方是真的
true && true && true = true
Run Code Online (Sandbox Code Playgroud)
并且ticket = 2将是假的,因为
false && true = false
Run Code Online (Sandbox Code Playgroud)
或者我应该坚持下去
SELECT ( (SELECT COUNT(*) FROM table WHERE ticket = 1)
= (SELECT COUNT(*) FROM table WHERE ticket = 1 AND archived = true) )
Run Code Online (Sandbox Code Playgroud) 我已经开始研究一个项目,那里有一个相当大的表(大约82,000,000行),我觉得它非常臃肿.其中一个字段定义为:
consistency character varying NOT NULL DEFAULT 'Y'::character varying
Run Code Online (Sandbox Code Playgroud)
它用作布尔值,值应始终为('Y'|'N').
注意:没有检查约束等.
我试图找出理由改变这个领域的理由.这是我有的:
这是我的问题.
boolean,它应该是1个字节,而对于'Y'UTF-8中的a 应该是1个字节(至少这是我在Python中检查长度时得到的).这里是否还有其他存储空间可以保存?=TRUE"与" ='Y'"的原因而获得任何性能提升吗?postgresql storage database-design query-optimization postgresql-9.1
请考虑以下表格:
CREATE TABLE user_roles(
pkey SERIAL PRIMARY KEY,
bit_id BIGINT NOT NULL,
name VARCHAR(256) NOT NULL,
);
INSERT INTO user_roles (bit_id,name) VALUES (1,'public');
INSERT INTO user_roles (bit_id,name) VALUES (2,'restricted');
INSERT INTO user_roles (bit_id,name) VALUES (4,'confidential');
INSERT INTO user_roles (bit_id,name) VALUES (8,'secret');
CREATE TABLE news(
pkey SERIAL PRIMARY KEY,
title VARCHAR(256),
company_fk INTEGER REFERENCES compaines(pkey), -- updated since asking the question
body VARCHAR(512),
read_roles BIGINT -- bit flag
);
Run Code Online (Sandbox Code Playgroud)
read_roles是一个位标志,指定可以读取新闻项的某些角色组合.因此,如果我插入一个可以通过限制和机密读取的新闻项目,我会将read_roles设置为值为2 | 46或当我想要返回特定用户可以看到的新闻帖子时,我可以使用类似的查询.
select * from news WHERE company_fk=2 AND …Run Code Online (Sandbox Code Playgroud) 我要将记录存储在一个包含2个字段的表中:
id - > 4个字符
password_hash - > 64个字符
我可以在Heroku上的5mb PostgreSQL中存储多少个像上面那样的记录?
PS:给定一个包含x列且长度为y的表 - 如何计算数据库中的空间?
我想使用某些字符串的MD5消息摘要作为表的主键.我应该为这样的字段使用什么数据类型?我应该为该领域写什么select和insert陈述?
给出Postgres数据库中的以下三列:第一,第二,第三; 如何创建约束以使排列是唯一的?
例如,如果('foo', 'bar', 'shiz')存在于db中,('bar', 'shiz', 'foo')则将其排除为非唯一.
sql postgresql database-design constraints unique-constraint
我想提高我的数据库性能.在项目中,所有表从去int到bigint,我认为这是一个不错的选择,不仅对于存储,因为int需要4 bytes和bigint要求8 bytes;而且还涉及性能.所以我创建了一个包含1000万个条目的小表,其中包含一个脚本Python:
import uuid
rows=10000000
output='insert_description_bigint.sql'
f = open(output, 'w')
set_schema="SET search_path = norma;\n"
f.write(set_schema)
for i in range(1,rows):
random_string=uuid.uuid4()
query="insert into description_bigint (description_id, description) values (%d, '%s'); \n"
f.write(query % (i,random_string))
Run Code Online (Sandbox Code Playgroud)
这就是我创建two表格的方式:
-- BIGINT
DROP TABLE IF EXISTS description_bigint;
CREATE TABLE description_bigint
(
description_id BIGINT PRIMARY KEY NOT NULL,
description VARCHAR(200),
constraint description_id_positive CHECK (description_id >= 0)
);
select count(1) from …Run Code Online (Sandbox Code Playgroud) 我想知道在postgresql表中计算最大列数的正确方法是什么.它在他们的网站上说:
每个表250 - 1600的最大列数取决于列类型
那么,根据列类型,我如何确定最大列?
我试图了解列顺序如何最小化PostgreSQL中的表大小.
例:
CREATE TABLE test (
column_1 int
,column_2 int
,column_3 bigint
,column_4 bigint
,column_5 text
,column_6 text
,column_7 numeric(5,2)
,column_8 numeric(5,2)
,column_9 timestamp
,column_10 boolean
,column_11 boolean
);
INSERT INTO test
VALUES(1,1,1,1,'test','test_1',12,12,current_timestamp,true,false);
SELECT pg_column_size(test.*) FROM test;
pg_column_size
----------------
82
(1 row)
Run Code Online (Sandbox Code Playgroud)
元组大小:
元组头的23字节开销+ NULL位图的1字节,因此:
24 + 4 + 4 + 8 + 8 + 5 + 7 + 5 + 5 + 8 + 1 + 1 = 80但实际元组大小为82.
是否有2字节的额外开销?
我理解下面链接给出的例子:
在PostgreSQL中计算和节省空间
如果我们删除column_8 numeric(5,2)那么那么元组大小保持不变,即:82.
我重新排序表以最小化元组大小并给出80.
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) postgresql ×10
sql ×4
storage ×4
bigint ×1
constraints ×1
database ×1
exists ×1
heroku ×1
int ×1
null ×1
oracle ×1
performance ×1
sql-server ×1
sqldatatypes ×1