根据PostgreSQL 的文档,VARCHAR,VARCHAR(n)和之间没有性能差异TEXT。
我应该为名称或地址列添加任意长度限制吗?
编辑:不是欺骗:
我知道这种CHAR类型是过去的遗物,我不仅对性能感兴趣,而且对其他优缺点感兴趣,例如 Erwin 在他惊人的回答中所述。
这两个查询有什么区别:
START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
并且没有交易:
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
Run Code Online (Sandbox Code Playgroud)
SELECT内部交易有什么影响?
如果在这两种情况下都在DELETE FROM orders WHERE id=1另一个会话之后立即调用SELECT,它将在什么时候被处理?
我有一个在 CentOS 5.8 32 位操作系统上运行的 PostgreSQL 9.1 服务器,并且我启用了 WAL 归档。在这台服务器上,有三个数据库:databaseA、databaseB和databaseC。有人在下午 12 点在 databaseB 上删除了一个表,我想将 databaseB 恢复到该表被删除的时间之前。现在时间是下午 3 点。
如何在不丢失其他两个数据库中三个小时的数据的情况下将 databaseB 恢复到下午 12 点?
配置文件
wal_level = archive
archive_mode = on
archive_command = 'test ! -f /opt/pgsql/logs/%f && cp %p /opt/pgsql/logs/%f'
max_wal_senders = 100
Run Code Online (Sandbox Code Playgroud)
恢复配置文件
restore_command = 'cp /opt/pgsql/logs/%f %p'
recovery_target_time = '2012-06-29 11:59:59 CEST'
Run Code Online (Sandbox Code Playgroud)
我在上午 9 点运行了我的基本备份
pg_basebackup -h 127.0.0.1 -D /opt/pgsql/backup
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 服务在下午 3 点关闭。
我有一个utf8包含 > 80M 记录的表,其中一列 ( char(6) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL) 可以只包含拉丁符号 ( [a-zA-Z0-9])。将此列转换为latin1是否有意义?
MySQL文档说:
要使用 UTF-8 节省空间,请使用 VARCHAR 而不是 CHAR。否则,MySQL 必须为 CHAR CHARACTER SET utf8 列中的每个字符保留三个字节,因为这是最大可能的字符长度。例如,MySQL 必须为 CHAR(10) CHARACTER SET utf8 列保留 30 个字节。
我做了一个测试 - 创建了 2 个具有相同 50M 记录的表:
CREATE TABLE `t_utf8` (
`c_1` char(6) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
UNIQUE KEY `index_t_utf8_on_c_1` (`c_1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
CREATE TABLE `t_lat` (
`c_1` char(6) CHARACTER SET …Run Code Online (Sandbox Code Playgroud) 我无法理解 PostgreSQL 中模式的概念和用法。我不知道它如何影响我的数据库设计。我为什么要使用它?
如果我决定现在不考虑它们,以后再担心它们,这会影响我将来吗?
用一个例子解释会很好。
如何连接两个 psql(PostgreSQL 客户端)变量?我想通过连接目录路径变量和文件名变量来生成绝对路径。
我试过这个:
\set path '/tmp/'
\set file 'foo'
\echo :path:file
Run Code Online (Sandbox Code Playgroud)
但是 psql 在路径和文件之间放置了一个空格,并输出:
/tmp/ foo
Run Code Online (Sandbox Code Playgroud) 我正在阅读 Oreilly 的PostgreSQL: Up and Running,并且在使用模式组织数据库部分中,它说search_path可以在数据库级别设置:
例如,如果我们希望 contrib 中的所有对象都可以在没有模式限定的情况下访问,我们将更改我们的数据库,如下所示:
ALTER DATABASE mydb SET search_path="$user",public,contrib;
但是,在键入上面的命令后,我仍然无法在public不限定它们的情况下引用其他模式中的表:
ALTER DATABASE auth SET search_path="$user",public,staging;`
\d users
Run Code Online (Sandbox Code Playgroud)
给出:
Did not find any relation named "users".
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用\d staging.users,它会起作用。
SHOW search_path;
Run Code Online (Sandbox Code Playgroud)
给出:
search_path
----------------
"$user",public
Run Code Online (Sandbox Code Playgroud)
是否默认search_path从postgresql.conf覆盖每个数据库的设置值与ALTER DATABASE ... SET search_path?如果是这样,每个数据库的值有什么用?
根据 ,我有一个包含 7,590,051 行的 CSV(实际上是制表符分隔的)文件wc -l,我想使用COPY FROM. 我删除了表的主键,所以它没有约束。
我跑了COPY customer FROM '.../customer.dsv' WITH DELIMITER E'\t' CSV HEADER;,它报告导入了 7,588,671 行并且没有错误,所以它缺少 1,379 行(已经打折标题行)。
由于 PostgreSQL 没有报告任何错误,您如何建议我解决哪些行丢失(以及它们丢失的原因)?
postgresql ×6
mysql ×2
schema ×2
backup ×1
concurrency ×1
csv ×1
datatypes ×1
import ×1
innodb ×1
mysql-5.7 ×1
performance ×1
psql ×1
recovery ×1
transaction ×1
varchar ×1