??xml version="1.0" encoding="utf-8" standalone="yes"?>久久一区二区三区99,www性久久久com,国内精品九九久久久精品http://www.shnenglu.com/lambdacpp/archive/2007/10/18/34555.html五点?/dc:creator>五点?/author>Thu, 18 Oct 2007 08:29:00 GMThttp://www.shnenglu.com/lambdacpp/archive/2007/10/18/34555.htmlhttp://www.shnenglu.com/lambdacpp/comments/34555.htmlhttp://www.shnenglu.com/lambdacpp/archive/2007/10/18/34555.html#Feedback3http://www.shnenglu.com/lambdacpp/comments/commentRss/34555.htmlhttp://www.shnenglu.com/lambdacpp/services/trackbacks/34555.html    MySQL Proxy 可以作负载均衡,可以艰苦Q分析,客户端和服务器之间的通讯。最Cool的是可以使用嵌入到系l中的Lua。呵呵,现在不来点脚本语a好像׃入流呢。最qInfoQ上一文章《用MySQL Proxy实现d分离》可能是时下现实的一U应用。原理很单看看图׃目了Ӟ



]]>
[转]postgres FAQhttp://www.shnenglu.com/lambdacpp/archive/2006/05/31/7910.html五点?/dc:creator>五点?/author>Tue, 30 May 2006 16:28:00 GMThttp://www.shnenglu.com/lambdacpp/archive/2006/05/31/7910.htmlhttp://www.shnenglu.com/lambdacpp/comments/7910.htmlhttp://www.shnenglu.com/lambdacpp/archive/2006/05/31/7910.html#Feedback1http://www.shnenglu.com/lambdacpp/comments/commentRss/7910.htmlhttp://www.shnenglu.com/lambdacpp/services/trackbacks/7910.html

操作问题

4.1)如何只选择一个查询结果的头几行?或是随机的一行?

如果你只是要提取几行数据Qƈ且你在执行查询中知道切的行敎ͼ你可以用LIMIT功能?如果有一个烦引与 ORDER BY中的条g匚wQPostgreSQL 可能只处理要求的头几条记录Q?Q否则将Ҏ个查询进行处理直到生成需要的行)。如果在执行查询功能时不知道切的记录数Q?可用游?cursor)和FETCH功能?

可用以下方法提取一行随录的Q?

		SELECT  cols
FROM tab
ORDER BY random()
LIMIT 1 ;

4.2)如何查看表、烦引、数据库以及用户的定义?如何查看psql里用到的查询指oq显C它们?

?i>psql中?\dt 命o来显C数据表的定义,要了?i>psql中的完整命o列表可用\? Q另外,你也可以阅读 psql 的源代码 文gpgsql/src/bin/psql/describe.cQ它包括为生?i>psql反斜杠命令的输出的所?SQL 命o。你q可以带 -E 选项启动 psqlQ?q样它将打印出执行你?i>psql中所l出的命令的内部实际使用的SQL查询。PostgreSQL也提供了一个兼容SQL的INFORMATION SCHEMA接口Q?你可以从q里获取关于数据库的信息?

在系l中有一些以pg_ 打头的系l表也描qC表的定义?

使用 psql -l 指o可以列出所有的数据库?

也可以浏览一?pgsql/src/tutorial/syscat.source文gQ它列D了很多可从数据库pȝ表中获取信息的SELECT语法?

4.3)如何更改一个字D늚数据cdQ?/h4>

?.0版本里更改一个字D늚数据cd很容易,可?ALTER TABLE ALTER COLUMN TYPE ?

在以前的版本中,可以q样做:

	BEGIN;
ALTER TABLE tab ADD COLUMN new_col new_data_type;
UPDATE tab SET new_col = CAST(old_col AS new_data_type);
ALTER TABLE tab DROP COLUMN old_col;
COMMIT;

你然后可以?i>VACUUM FULL tab 指o来ɾpȝ收回无效数据所占用的空间?

4.4)一行记录,一个表Q一个库的最大尺寸是多少Q?/h4>

下面是一些限Ӟ

一个数据库最大尺寸?无限Ӟ已存在有 32TB 的数据库Q?/td>
一个表的最大尺寸?32 TB
一行记录的最大尺寸?1.6 TB
一个字D늚最大尺?1 GB
一个表里最大行敎ͼ无限?/td>
一个表里最大列敎ͼ250-1600 Q与列类型有养I
一个表里的最大烦引数量?无限?/td>

当然Q实际上没有真正的无限制Q还是要受可用磁盘空间、可用内?交换区的制约?事实上,当这些数值变得异常地大时Q系l性能也会受很大媄响?

表的最大尺?32 TB 不需要操作系l对大文件的支持。大表用多个 1 GB 的文件存储,因此文gpȝ寸的限制是不重要的?

如果~省的块大小增长?32K Q最大的表尺寸和最大列数还可以增加到四倍?

4.5)存储一个典型的文本文g里的数据需要多磁盘空_

一?Postgres 数据库(存储一个文本文Ӟ所占用的空间最多可能需要相当于q个文本文g自n大小5倍的盘I间?

例如Q假设有一?100,000 行的文gQ每行有一个整数和一个文本描q?假设文本串的q_长度?0字节。文本文件占?2.8 MB。存放这些数据的 PostgreSQL 数据库文件大U是 6.4 MB:

     32 字节: 每行的头Q估计|
24 字节: 一个整数型字段和一个文本型字段
+ 4 字节: 面内指向元l的指针
----------------------------------------
60 字节每行

PostgreSQL 数据늚大小?8192 字节 (8 KB)Q则Q?br />
8192 字节每页
------------------- = 136 ?数据(向下取整Q?br /> 60 字节每行

100000 数据?br /> -------------------- = 735 数据(向上取整Q?br /> 128 行每?br />
735 数据?* 8192 字节/? = 6,021,120 字节Q? MBQ?br />

索引不需要这么多的额外消耗,但也实包括被烦引的数据Q因此它们也可能很大?

I?i>NULL存放在位图中Q因此占用很的I间?

4.6)Z么我的查询很慢?Z么这些查询没有利用烦引?

q每个查询都会自动使用索引。只有在表的大小过一个最|q且查询只会选中表中较小比例的记录时才会采用索引?q是因ؓ索引扫描引v的随即磁盘存取可能比直接地读取表Q顺序扫描)更慢?

Z判断是否使用索引QPostgreSQL必须获得有关表的l计倹{这些统计值可以?VACUUM ANALYZEQ或 ANALYZE 获得?使用l计|优化器知道表中有多少行,p够更好地判断是否利用索引? l计值对定优化的连接顺序和q接Ҏ也很有用。在表的内容发生变化Ӟ应定期进行统计值的更新攉?

索引通常不用?ORDER BY 或执行连接。对一个大表的一ơ顺序扫描,再做一个显式的排序通常比烦引扫描要快?

但是Q在 LIMIT ?ORDER BY l合使用时经怼使用索引Q因只会q回表的一部分?实际上,虽然 MAX() ?MIN() q不使用索引Q通过?ORDER BY ?LLIMIT 使用索引取得最大值和最g是可以的Q?

	SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;

如果你确信PostgreSQL的优化器使用序扫描是不正确的,你可以?code>text_pattern_ops索引来用?small>LIKE的烦引?

?.0之前的版本中Q除非要查询的数据类型和索引的数据类型相匚wQ否则烦引经常是未被用到Q特别是对int2,int8和数值型的烦引?

4.7)我如何才能看到查询优化器是怎样评估处理我的查询Q?/h4>

参?EXPLAIN 手册c?

4.8)我怎样做正则表辑ּ搜烦和大写无关的正则表辑ּ查找Q怎样利用索引q行大小写无x找?

操作W?~ 处理正则表达式匹配,?~* 处理大小写无关的正则表达式匹配。大写些无关?LIKE 变种成ؓ ILIKE?

大小写无关的{式比较通常写做Q?

    SELECT *
FROM tab
WHERE lower(col) = 'abc';

q样不会用标准的索引。但是可以创Z个可被利用的函数索引:

    CREATE INDEX tabindex ON tab (lower(col));

4.9)在一个查询里Q我怎样一个字D|否ؓ NULL Q我如何才能准确排序而不论某字段是否?NULL |

?IS NULL ?IS NOT NULL 试q个字段Q具体方法如下:

   SELECT *
FROM tab
WHERE col IS NULL;

Z能对?NULL字段排序Q可?ORDER BY 条g中?IS NULL?IS NOT NULL 修饰W,条g为真 true 比条g为假false 排在前面Q下面的例子׃含 NULL 的记录排在结果的上面部分Q?

   SELECT *
FROM tab
ORDER BY (col IS NOT NULL)

4.10)各种字符cd之间有什么不同?

cd内部名称说明
VARCHAR(n)varchar指定了最大长度,变长字符Ԍ不定义长度的部分不补齐
CHAR(n)bpchar定长字符Ԍ实际数据不定义长度Ӟ以空D?/td>
TEXTtext没有特别的上限限Ӟ仅受行的最大长度限Ӟ
BYTEAbytea变长字节序列Q用NULL也是允许的)
"char"char一个字W?/td>

在系l表和在一些错误信息里你将看到内部名称?

上面所列的前四U类型是"varlena"Q变长)cdQ也是_开头的四个字节是长度,后面才是数据Q?于是实际占用的空间比声明的大要多一些?然而这些类型都可以被压~存储,也可以用 TOAST 脱机存储Q因此磁盘空间也可能比预想的要少?

VARCHAR(n) 在存储限制了最大长度的变长字符串是最好的?TEXT 适用于存储最大可?1G左右但未定义限制长度的字W串?

CHAR(n) 最适合于存储长度相同的字符丌Ӏ?CHAR(n)会根据所l定的字D长度以I格补Q不的字段内容Q, ?VARCHAR(n) 只存储所l定的数据内宏V?BYTEA 用于存储二进制数据,其是包?NULL 字节的倹{这些类型具有相似的性能Ҏ?

4.11.1)我怎样创徏一个序列号/自动递增的字D?

PostgreSQL 支持 SERIAL 数据cd。它在字D上自动创徏一个序列和索引。例如:

	CREATE TABLE person ( 
id SERIAL,
name TEXT
);

会自动{换ؓQ?

	CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);

参?create_sequence 手册获取关于序列的更多信息?

4.11.2)我如何获得一个插入的序列L|

一U方法是在插入之前先用函?nextval() 从序列对象里索出下一?SERIAL |然后再显式插入。?4.11.1 里的例表Q可用伪码这hqͼ

	new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");

q样q能在其他查询中使用存放?new_id 里的新|例如Q作?person 表的外键Q?注意自动创徏?SEQUENCE 对象的名U将会是 <table>_<serialcolumn>_seqQ?q里 table ?serialcolumn 分别是你的表的名U和你的 SERIAL 字段的名U?

cM的,?SERIAL 对象~省插入后你可以用函?currval() 索刚赋值的 SERIAL |例如Q?

	execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");

4.11.3)使用 currval() 会导致和其他用户的冲H情况(race conditionQ吗Q?/h4>

不会?i>currval() q回的是你本ơ会话进E所赋的D不是所有用L当前倹{?br />

4.11.4)Z么不在事务异怸止后重用序列号呢Qؓ什么在序列号字D늚取g存在间断呢?

Z提高q发性,序列号在需要的时候赋予正在运行的事务Qƈ且在事务l束之前不进行锁定, q就会导致异怸止的事务后,序列号会出现间隔?


4.12)什么是 OID Q什么是 CTID Q?/h4>

PostgreSQL 里创建的每一行记录都会获得一个唯一?small>OIDQ除非在创徏表时使用WITHOUT OIDS选项?OID创徏时会自动生成一?字节的整敎ͼ所?OID 在整?PostgreSQL 中均是唯一的?然而,它在过40亿时溢出, OID此后会出现重复。PostgreSQL 在它的内部系l表里?OID 在表之间建立联系?

在用L数据表中Q最好是使用SERIAl来代?small>OID 因ؓSERIAL只是保证在单个表中数据是唯一的,q样它溢出的可能性就非常了Q?SERIAL8可用来保?字节的序列号字段?

CTID 用于标识带着数据块(地址Q和Q块内)偏移的特定的物理行?CTID 在记录被更改或重载后发生改变。烦引入口用它们指向物理行?

4.13)Z么我收到错误信息?i>ERROR: Memory exhausted in AllocSetAlloc()”?

q很可能是系l的虚拟内存用光了,或者内核对某些资源有较低的限制倹{在启动 postmaster 之前试试下面的命令:

	ulimit -d 262144
limit datasize 256m

取决于你用的 shellQ上面命令只有一条能成功Q但是它把你的q程数据D限制设得比较高Q? 因而也许能让查询完成。这条命令应用于当前q程Q以及所有在q条命oq行后创建的子进E? 如果你是在运行SQL客户端时因ؓ后台q回了太多的数据而出现问题,请在q行客户端之前执行上q命令?

4.14)我如何才能知道所q行?PostgreSQL 的版本?

?psql 里,输入 4.15)我如何创Z个缺省值是当前旉的字D?

使用 CURRENT_TIMESTAMPQ?

	CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

4.16)我怎样q行 outer join Q外q接Q?

PostgreSQL 采用标准?SQL 语法支持外连接。这里是两个例子Q?

	SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

或是

	SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);

q两个等L查询?t1.col ?t2.col 上做q接Qƈ且返?t1 中所有未q接的行Q那些在 t2 中没有匹配的行)? 右[外]q接(RIGHT OUTER JOIN)返?t2 中未q接的行?完全外连接(FULL OUTER JOINQ将q回 t1 ? t2 中未q接的行?关键?OUTER 在左[外]q接、右[外]q接和完全[外]q接中是可选的Q普通连接被UCؓ内连接(INNER JOINQ?

4.17)如何使用涉及多个数据库的查询Q?/h4>

没有办法查询当前数据库之外的数据库?因ؓ PostgreSQL 要加载与数据库相关的pȝ目录Q系l表Q,因此跨数据库的查询如何执行是不定的?

附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时q接C同的数据库执行查询然后在客户端合q结果?

4.18)如何让函数返回多行或多列Q?/h4>

在函Cq回数据记录集的功能是很Ҏ使用的,详情参见Q?http://techdocs.postgresql.org/guides/SetReturningFunctions

4.19)Z么我在用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”?

PL/PgSQL会缓存函数的内容Q由此带来的一个不好的副作用是若一?PL/PgSQL 函数讉K了一个时表Q然后该表被删除qZQ则再次调用该函数将p|Q?因ؓ~存的函数内容仍然指向旧的时表。解决的Ҏ是在 PL/PgSQL 中用EXECUTE 对时表q行讉K。这样会保证查询在执行前M被重新解析?

4.27)目前有哪些数据复制方案可用?

“复制”只是一个术语,有好几种复制技术可使用Q每U都有优点和~点Q?

?从复制方式是允许一个主服务器接受读/写的甌Q而多个从服务器只能接受读/SELECT查询的申P 目前最行且是免费的主/?PostgreSQL复制Ҏ?Slony-I ?

多个L务器的复制方式允许将?写的甌发送给多台的计机Q这U方式由于需要在多台服务器之间同步数据变?可能会带来较严重的性能损失Q?a >Pgcluster是目前这U方?中最好的Q而且q可以免费下载?

也有一些商业需付费和基于硬件的数据复制ҎQ支持上q各U复制模型?/p>


]]> þӰۺ| ƷþþþþþþþӰԺ | 99ƷþþƷ| ˮϵþþƷ| þþþۺþ| Ʒþþþþþþþ| þ˾Ʒһ| þþù׾Ʒ| ƷþĻ| ŷ޾þav| þþƷһ| ɫɫۺϾþҹҹ| þþƷ99Ӱ| ާѡþþþƷ9966| Ʒþþþþ| þþþŮʦһ| þþþ޾Ʒ | ޾ƷþëƬ | þӰۺ| þþþ99ƷƬŷ | þþۺϾɫۺϾ| þ99ۺϾƷ| ձƷþþþӰԺձ| ھƷþþþþҰ| 99þ99þþƷƬ| þþƷѴƬƬ| Ʒþþþþҹ| ŷѹۿþ| þþƷ99þ㽶| Ʒ99þþƷ| þþþƷ2019ѹۿ| AVպƷþþþ| ޾Ʒþþwww| þþƷۺһ| Ʒþۺ| Ʒtvþþþþþ| AVþþþò| Ʒþþþþþ| 97Ʒ91þþþþ| þۺŷ| Ʒþþþû|