array
列有上限吗?
插入数组字段时出现此错误 -
PG::Error: ERROR: index row size 3480 exceeds maximum 2712 for index "ix_data"
Run Code Online (Sandbox Code Playgroud)
这是我的表定义 -
create table test_array(id varchar(50), data text[]);
ALTER TABLE test_array ADD PRIMARY KEY (id);
CREATE INDEX ix_data ON test_array USING GIN (data);
Run Code Online (Sandbox Code Playgroud)
我需要数组字段的索引,因为我正在对它进行一些查找。
我有一张桌子articles
:
Table "articles"
Column | Type | Modifiers | Storage | Stats target | Description
----------------+-----------------------------+----------------------------------------------------+----------+--------------+-------------
id | integer | not null default nextval('articles_id_seq'::regclass) | plain | |
user_id | integer | | plain | |
title | character varying(255) | | extended | |
author | character varying(255) | | extended | |
body | text | default '--- [] +| extended | |
| | '::text | | |
created_at | timestamp without time zone | …
Run Code Online (Sandbox Code Playgroud) postgresql performance datatypes postgresql-9.4 query-performance
name
例如,如果我有一个带有排序规则的文本列tr-TR
,并且我运行一个查询
SELECT * FROM t WHERE name LIKE 'a%'
Run Code Online (Sandbox Code Playgroud)
然后这将进行 seq 扫描。
如果我现在创建一个索引
CREATE INDEX ON t(name text_pattern_ops)
Run Code Online (Sandbox Code Playgroud)
上面的查询将变成位图扫描。但还有另一种技术可以达到相同的结果:
CREATE INDEX ON t(name COLLATE "C")
Run Code Online (Sandbox Code Playgroud)
这些方法完全等同还是存在差异?
Postgres 文档说:
使用索引来强制唯一约束可以被视为不应直接访问的实现细节。但是,应该注意没有必要在唯一的列上手动创建索引;这样做只会复制自动创建的索引。
基于此,如果我想要一个列上的表达式索引并且还希望该列是唯一的,那么case 2
下面会更好,因为它可以使用单个索引完成上述操作。而case 1
由于唯一约束而自动创建一个索引,而另一个因为我需要小写索引而自动创建?
正如@Colin'tHart 指出的那样,这两种情况不一样。我应该在不使用lower()
表达式的情况下发布这个问题。在那种情况下,我的理解是 aCREATE UNIQUE INDEX
比唯一约束和简单索引更好。
基于此,如果我想要text_pattern_ops
在列上使用运算符类(例如)的索引并且还希望该列是唯一的,那么case 2
下面会更好,因为它可以使用单个索引完成上述操作。而case 1
会因为唯一约束而自动创建一个索引,而另一个因为我需要不同的运算符类而自动创建?
情况1:
CREATE TABLE book (
id SERIAL PRIMARY KEY,
name text NOT NULL,
CONSTRAINT book_name_key UNIQUE (name)
);
CREATE INDEX book_name_like ON book (name text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)
案例2:
CREATE TABLE book (
id SERIAL PRIMARY KEY,
name text NOT NULL
);
CREATE UNIQUE INDEX book_name_like ON book (name text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)