【php精品源码栏目提醒】:网学会员为需要php精品源码的朋友们搜集整理了PSQL数据库操作 - 其它资料相关资料,希望对各位网友有所帮助!
4.1如何只选择一个查询结果的头几行?或是随机的一行?如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用 LIMIT 功能。
如果有一个索引与ORDER BY 中的条件匹配,PostgreSQL 可能就只处理要求的头几条记录, (否则将对整个查询进行处理直到生成需要的行)。
如果在执行查询功能时不知道确切的记录数, 可使用游标cursor和 FETCH 功能。
可使用以下方法提取一行随机记录的:SELECT colsFROM tabORDER BY randomLIMIT 1 4.2如何查看表、索引、数据库以及用户的定义?如何查看 psql 里用到的查询指令并显示它们? 在 psql 中使用 dt 命令来显示数据表的定义,要了解 psql 中的完整命令列表可使用 ,另外,你也可以阅读 psql 的源代码 文件 pgsql/src/bin/psql/describe.c,它包括为生成 psql反斜杠命令的输出的所有 SQL 命令。
你还可以带 -E 选项启动 psql, 这样它将打印出执行你在 psql 中所给出的命令的内部实际使用的 SQL 查询。
PostgreSQL 也提供了一个兼容SQL 的 INFORMATION SCHEMA 接口, 你可以从这里获取关于数据库的信息。
在系统中有一些以 pg_ 打头的系统表也描述了表的定义。
使用 psql -l 指令可以列出所有的数据库。
也可以浏览一下 pgsql/src/tutorial/syscat.source 文件,它列举了很多可从数据库系统表中获取信息的 SELECT 语法。
4.3如何更改一个字段的数据类型? 在 8.0 版本里更改一个字段的数据类型很容易,可使用 ALTER TABLE ALTER COLUMNTYPE 。
在以前的版本中,可以这样做:BEGINALTER TABLE tab ADD COLUMN new_col new_data_typeUPDATE tab SET new_col CASTold_col AS new_data_typeALTER TABLE tab DROP COLUMN old_colCOMMIT 你然后可以使用 VACUUM FULL tab 指令来使系统收回无效数据所占用的空间。
4.4一行记录,一个表,一个库的最大尺寸是多少? 下面是一些限制:一个数据库最大尺寸? 无限制(已存在有 32TB 的数据库)一个表的最大尺寸? 32 TB一行记录的最大尺寸? 1.6 TB一个字段的最大尺寸 1 GB一个表里最大行数? 无限制一个表里最大列数? 250-1600 (与列类型有关)一个表里的最大索引数量? 无限制 当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的制约。
事实上,当这些数值变得异常地大时,系统性能也会受很大影响。
表的最大尺寸 32 TB 不需要操作系统对大文件的支持。
大表用多个 1 GB 的文件存储,因此文件系统尺寸的限制是不重要的。
如果缺省的块大小增长到 32K ,最大的表尺寸和最大列数还可以增加到四倍。
4.5存储一个典型的文本文件里的数据需要多少磁盘空间? 一个 Postgres 数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自身大小 5 倍的磁盘空间。
例如,假设有一个 100000 行的文件,每行有一个整数和一个文本描述。
假设文本串的平均长度为 20 字节。
文本文件占用 2.8 MB。
存放这些数据的 PostgreSQL 数据库文件大约是 6.4 MB: 32 字节: 每行的头(估计值)24 字节: 一个整数型字段和一个文本型字段 4 字节: 页面内指向元组的指针----------------------------------------60 字节每行PostgreSQL 数据页的大小是 8192 字节 8 KB,则:8192 字节每页------------------- 136 行/数据页(向下取整)60 字节每行100000 数据行-------------------- 735 数据页(向上取整)128 行每页735 数据页 8192 字节/页 6021120 字节(6 MB) 索引不需要这么多的额外消耗,但也确实包括被索引的数据,因此它们也可能很大。
空值 NULL 存放在位图中,因此占用很少的空间。
4.6为什么我的查询很慢?为什么这些查询没有利用索引? 并非每个查询都会自动使用索引。
只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。
这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。
为了判断是否使用索引,PostgreSQL 必须获得有关表的统计值。
这些统计值可以使用VACUUM ANALYZE,或 ANALYZE 获得。
使用统计值,优化器知道表中有多少行,就能够更好地判断是否利用索引。
统计值对确定优化的连接顺序和连接方法也很有用。
在表的内容发生变化时,应定期进行统计值的更新收集。
索引通常不用于 ORDER BY 或执行连接。
对一个大表的一次顺序扫描,再做一个显式的排序通常比索引扫描要快。
但是,在 LIMIT 和 ORDER BY 结合使用时经常会使用索引,因为这只会返回表的一小部分。
实际上,虽然 MAX 和 MIN 并不使用索引,通过对 ORDER BY 和 LLIMIT 使用索引取得最大值和最小值也是可以的:SELECT colFROM tabORDER BY col DESC LIMIT 1 如果你确信 PostgreSQL 的优化器使用顺序扫描是不正确的,你可以使用 SETenable_seqscan TO off指令, 然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。
当使用通配符操作,例如 LIKE 或 时,索引只能在特定的情况下使用: 字符串的开始部分必须是普通字符串,也就是说: LIKE 模式不能以 打头。
(正则表达式)模式必须以 打头。
字符串不能以匹配多个字符的模式类打头,例如 a-e。
大小写无关的查找,如 ILIKE 和 等不使用索引,但可以用 4.8 节描述的函数索引。
在做 initdb 时必须采用缺省的本地设置 C locale,因为系统不可能知道在非 C locale情况时下一个最大字符是什么。
在这种情况下,你可以创建一个特殊的 text_pattern_ops索引来用于 LIKE 的索引。
在 8.0 之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,否则索引经常是未被用到,特别是对 int2int8 和数值型的索引。
4.7我如何才能看到查询优化器是怎样评估处理我的查询? 参考 EXPLAIN 手册页。
4.8我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找? 操作符 处理正则表达式匹配, 处理大小写无关的正则表达式匹配。
而 大写些无关的 LIKE 变种成为 ILIKE。
大小写无关的等式比较通常写做: SELECT FROM tabWHERE lowercol abc 这样将不会使用标准的索引。
但是可以创建一个可被利用的函数索引: CREATE INDEX tabindex ON tab lowercol4.9在一个查询里,我怎样检测一个字段是否为 NULL ?我如何才能准确排序而不论某字段是否含 NULL 值? 用 IS NULL 和 IS NOT NULL 测试这个字段,具体方法如下: SELECT FROM tabWHERE col IS NULL 为了能对含 NULL 字段排序,可在 ORDER BY 条件中使用 IS NULL 和 IS NOT NULL修饰符,条件为真 true 将比条件为假 false 排在前面,下面的例子就会将含 NULL 的记录排在结果的上面部分: SELECT FROM tabORDER BY col IS NOT NULL4.10各种字符类型之间有什么不同?类型 内部名称 说明VARCHARn varchar 指定了最大长度,变长字符串,不足定义长度的部分不补齐CHARn bpchar 定长字符串,实际数据不足定义长度时,以空格补齐TEXT text 没有特别的上限限制(仅受行的最大长度限制)BYTEA bytea 变长字节序列(使用 NULL 也是允许的)char char 一个字符 在系统表和在一些错误信息里你将看到内部名称。
上面所列的前四种类型是varlena(变长)类型(也就是说,开头的四个字节是长度,后面才是数据)。
于是实际占用的空间比声明的
上一篇:
CyrusIMap的安装配置
下一篇:
浅议发展中的房地产网络营销