在 PostgreSQL 数据库中,我们如果要获取包含某些字符的数据,可以使用 LIKE 子句。 在 LIKE 子句中,通常与通配符结合使用,通配符表示任意字符,在 PostgreSQL 中,主要有以下两种通配符: 百分号 % 下划线 _ 如果没有使用以上两种通配符,LIKE 子句和等号 = 得到的结果是一样的。 语法 以下是使用 LIKE 子句搭配百分号 % 和下划线 _ 从数据库中获取数据的通用语法:
1 2 3 4 5 6 7 8 9 |
SELECT FROM table_name WHERE column LIKE 'XXXX%'; 或者 SELECT FROM table_name WHERE column LIKE '%XXXX%'; 或者 SELECT FROM table_name WHERE column LIKE 'XXXX_'; 或者 SELECT FROM table_name WHERE column LIKE '_XXXX'; 或者 SELECT FROM table_name WHERE column LIKE '_XXXX_'; |
你可以在 WHERE 子句中指定任何条件。 你可以使用 AND 或者 OR 指定一个或多个条件。 XXXX 可以是任何数字或者字符。 实例 下面是 LIKE 语句中演示了 % 和 _ 的一些差别: 实例 描述 WHERE SALARY::text LIKE '200%' 找出 SALARY 字段中以 200 开头的数据。 WHERE SALARY::text LIKE '%200%' 找出 SALARY 字段中含有 200 字符的数据。 WHERE SALARY::text LIKE '_00%' 找出 SALARY 字段中在第二和第三个位置上有 00 的数据。 WHERE SALARY::text LIKE '2_%_%' 找出 SALARY 字段中以 2 开头的字符长度大于 3 的数据。 WHERE SALARY::text LIKE '%2' 找出 SALARY 字段中以 2 结尾的数据 WHERE SALARY::text LIKE '_2%3' 找出 SALARY 字段中 2 […]
View Detailsdocker run -d --name=postgres -p 5432:5432 -v postgres-volume:/var/lib/postgresql/data -e POSTGRES_PASSWORD=Aa615243 postgres docker run -d --name=pgadmin4 -e SERVER_MODE=true -e PGADMIN_DEFAULT_EMAIL=your_email -e PGADMIN_DEFAULT_PASSWORD=Aa615243 -d -p 15432:80 -v postgres-volume:/var/lib/postgresql/data dpage/pgadmin4:latest
View Details
1 2 3 |
pgAdmin 是一个强大的 postgresql 的图形化管理工具,既可以本地运行也可以以 web 应用的方式运行。 因为 postgresql 是安装在虚拟机上的,所以我需要让 pgAdmin 以 web 应用的方式运行。 但是文档里只有 Apache 相关的配置, 看起来很复杂,所以在网上搜了简化的安装方法并稍微改了下。 |
安装 docker 和 nginx 这个看文档即可。 引入现成的 pgadmin 的 docker镜像
1 |
docker pull chorss/docker-pgadmin4 |
运行该镜像: docker run -e SERVER_MODE=true -e PGADMIN_SETUP_EMAIL=berrydigital@gmail.com \ -e PGADMIN_SETUP_PASSWORD=password -d -p 5050:5050 \ -v /home/robert/data:/data chorss/docker-pgadmin4 -e 表示传入容器的环境变量,PGADMIN_SETUP_EMAIL 和 PGADMIN_SETUP_PASSWORD 分别为 pgAdmin 登陆的账号密码。 -V /home/robert/data:/data 表示宿主机目录和容器目录对应的映射关系,宿主机目录可以自己设置。运行时可能会因为目录权限报错,需要修改目录权限(本地开发直接改成 777 )。 nginx 配置
1 2 3 4 5 |
server { listen 80; server_name YOUR_SERVER_NAME; return 301 https://localhost:5050; } |
主要是将请求反向代理到 docker 容器内。 postgresql 配置 默认是 5432 端口,只有本机可以访问,需要修改访问权限:把 postgresql.conf 中的 listen_addresses 的值 设置为 *,表示所有 ip 会被响应。 还需要修改 pg_hba.conf,用于设置连接的许可,添加: host all all 0.0.0.0/0 md5 表示所有用户及 ip 都可以建立连接,密码加密方式为 md5. 重启 postgresql:sudo service postgresql restart 此时可以通过 YOUR_SERVER_NAME 登陆 pgAdmin 了。 虚拟机ip 进入 pgAdmin 后需要设置 postgresql […]
View Details本教程将指导您完成如何在 Docker 容器内运行具有持久存储的 PostgreSQL 并连接到它的过程。 PostgreSQL是一个开源的对象关系数据库管理系统。它已经存在了 30 多年,并标榜自己是“世界上最先进的开源关系数据库”。 在轻松打包、部署和运行分布式应用程序方面,Docker已成为 IT 行业的标准。Docker 容器让您可以快速启动新应用程序,而不会因依赖项而使您的系统变得混乱。 您可以使用 Docker 在容器中运行 PostgreSQL 数据库,就像它是远程服务器一样。Docker 容器基于开放标准,使容器能够在所有主要Linux 发行版、MacOS 和 Microsoft Windows 上运行。 在 Docker 中运行 PostgreSQL 我们在这里要做的是下载PostgreSQL镜像,检查镜像是否准备好,使用特定参数运行镜像,最后连接到正在运行的PostgreSQL实例。 1. 拉取一个 PostgreSQL 服务器 Docker 镜像 首先,我们需要从Docker Hub获取现有的 PostgreSQL 官方镜像。镜像适用于 PostgreSQL 版本 9、10、11、12 和 13。如果您需要特定版本,latest 请将标签更改 为所需版本。 现在让我们拉取图像:
1 |
sudo docker pull postgres:latest |
使用上述命令将从 Docker Hub 存储库中提取最新可用版本的 PostgreSQL。 2. 从 PostgreSQL 服务器 Docker 镜像运行容器 在部署之前,您需要设置一个 Docker 卷或绑定安装来持久化您的数据库。否则,当容器重新启动时,您的数据将丢失。安装应该 /var/lib/postgresql/data 在容器内的目录中。 出于本指南的目的,我们将创建一个 docker 卷并将其附加到您的 PostgreSQL 容器。 以下命令将在您的本地计算机中创建卷,您可以稍后与 PostgreSQL 容器连接:
1 |
sudo docker volume create postgres-volume |
现在你的机器上有 PostgreSQL 镜像和一个用于保存数据的卷,你可以部署一个容器:
1 |
sudo docker run -d --name=postgres13 -p 5432:5432 -v postgres-volume:/var/lib/postgresql/data -e POSTGRES_PASSWORD=your_password postgres |
该 docker run 命令将在 Docker 容器中创建一个正在运行的 PostgreSQL 数据库。 让我们分解一下这个语法。以下是该命令中每个参数的含义: -d 将以分离模式运行此容器,以便它在后台运行。 --name 将名称“postgres13”分配给您的容器实例。 -p会将 PostgreSQL 容器端口 […]
View DetailsPostgreSQL提 供了丰富的数据类型。用户可以使用 CREATE TYPE 命令在数据库中创建新的数据类型。PostgreSQL 的数据类型有很多种,下面我们具体来说明。
View Details一般我们建站使用较多的还是固定开源CMS程序,且基本上也使用的是PHP+MYSQL程序,所以数据库上较多的还是使用的MYSQL数据库。但是前几天老左有遇到一个网友他使用的是PostgreSQL数据库,实际上这个数据库我们在使用虚拟主机的时候也是有见过的,但是确实用的不多。 如果我们需要备份PostgreSQL数据库的话,一般如果我们服务器WEB环境自带的管理小工具是可以直接导出备份的,但是如果是运维工程师自己编译的WEB系统,那我们就需要用到其他的单独命令备份,这里我们记录下如何通过PostgreSQL命令备份数据库。 第一、一键快速备份单数据库 su – postgres 这里我们登陆数据库。 pg_dump laozuo.org > laozuo.org.bak 通过命令一键将我们的数据库名换成我们需要备份的,然后备份。这里我们可以将备份的数据下载到本地。 psql laozuo < dbname.bak 如果我们需要恢复数据库可以用psql命令来恢复,是不是有点像我们MYSQL恢复数据一样。 第二、远程备份数据库 一般远程备份数据库我们个人使用的不多的,我们还是老老实实在当前服务器操作比较多见,但是这里的方法老左也记录一下。 pg_dump -h 1.1.1.1 -p 1234 dbname > dbname.bak 根据命令及端口进行备份,注意数据库名修改成我们自己的。 第三、设置定时自动备份 这个我们很多朋友都有用的,一般项目文件动的不多,一般都是数据库在增减。所以我们定期备份数据库即可,但是我们需要做到的是定时备份。 1、登录数据库 su – postgres 和上面一样,我们要登录数据库,然后设置定时任务。 2、创建备份目录 mkdir -p ~/dbbackups 我们需要创建一个备份目录。 3、创建定时任务 crontab -e 然后需要编辑文件。 0 0 * * 0 pg_dump -U postgres laozuo> ~/dbbackups/laozuo.org.bak 编辑完毕保存后,我们运营一次看看,是否备份进入文件夹。 这里我们在备份完毕PostgreSQL数据库之后,我们还是需要定期下载或者SCP推送到其他服务器。之前有个朋友确实会定时备份,但是他备份到的还是自己当前服务器。于是前几天发现服务器故障数据丢失,他悲剧了。所以我们还是需要备份到本地。 from:https://www.laozuo.org/16772.html
View Detailssysbench是一个压力测试工具、可以用它来测试cpu、mem、disk、thread、mysql、postgr、oracle;然而作为一个mysql dba 我当然是用它来压测mysql啦! 一、从哪里可以下载到sysbench: sysbench的源码可以在github上面下载的到,sysbench的主页
1 |
https://github.com/akopytov/sysbench |
二、sysbench的一些安装依赖:
1 |
yum -y install make automake libtool pkgconfig libaio-devel vim-common |
在我的机器上已经安装上了mysql相关的所有包,如果你机器上还没有安装过这些,那你还要安装上mysql的开发包,由于系统自带mariadb 这个mysql分支,所以在安装mysql-devel时应该是安装mariadb-devel 三、安装sysbench: 1 进入到sysbench源码目录
1 |
/home/jianglexing/Desktop/sysbench-master |
2 执行autogen.sh用它来生成configure这个文件
1 |
./autogen.sh |
3 执行configure && make && make install 来完成sysbench的安装
1 2 3 |
./configure --prefix=/usr/local/sysbench/ --with-mysql --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib make make install |
我这里之所以要这样写是因为我的mysql安装在/usr/local/;而不是默认的rpm的安装位置 四、测试是否安装成功:
1 2 |
[root@workstudio bin]# /usr/local/sysbench/bin/sysbench --version sysbench 1.1.0 |
到目前为止sysbench的安装就算是完成了! 五、sysbench的帮助内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
1 Usage: 2 sysbench [options]... [testname] [command] 3 4 Commands implemented by most tests: prepare run cleanup help 5 6 General options: 7 --threads=N number of threads to use [1] 8 --events=N limit for total number of events [0] 9 --time=N limit for total execution time in seconds [10] 10 --warmup-time=N execute events for this many seconds with statistics disabled before the actual benchmark run with statistics enabled [0] 11 --forced-shutdown=STRING number of seconds to wait after the --time limit before forcing shutdown, or 'off' to disable [off] 12 --thread-stack-size=SIZE size of stack per thread [64K] 13 --thread-init-timeout=N wait time in seconds for worker threads to initialize [30] 14 --rate=N average transactions rate. 0 for unlimited rate [0] 15 --report-interval=N periodically report intermediate statistics with a specified interval in seconds. 0 disables intermediate reports [0] 16 --report-checkpoints=[LIST,...] dump full statistics and reset all counters at specified points in time. The argument is a list of comma-separated values representing the amount of time in seconds elapsed from start of test when report checkpoint(s) must be performed. Report checkpoints are off by default. [] 17 --debug[=on|off] print more debugging info [off] 18 --validate[=on|off] perform validation checks where possible [off] 19 --help[=on|off] print help and exit [off] 20 --version[=on|off] print version and exit [off] 21 --config-file=FILENAME File containing command line options 22 --luajit-cmd=STRING perform LuaJIT control command. This option is equivalent to 'luajit -j'. See LuaJIT documentation for more information 23 --tx-rate=N deprecated alias for --rate [0] 24 --max-requests=N deprecated alias for --events [0] 25 --max-time=N deprecated alias for --time [0] 26 --num-threads=N deprecated alias for --threads [1] 27 28 Pseudo-Random Numbers Generator options: 29 --rand-type=STRING random numbers distribution {uniform,gaussian,special,pareto} [special] 30 --rand-spec-iter=N number of iterations used for numbers generation [12] 31 --rand-spec-pct=N percentage of values to be treated as 'special' (for special distribution) [1] 32 --rand-spec-res=N percentage of 'special' values to use (for special distribution) [75] 33 --rand-seed=N seed for random number generator. When 0, the current time is used as a RNG seed. [0] 34 --rand-pareto-h=N parameter h for pareto distribution [0.2] 35 36 Log options: 37 --verbosity=N verbosity level {5 - debug, 0 - only critical messages} [3] 38 39 --percentile=N percentile to calculate in latency statistics (1-100). Use the special value of 0 to disable percentile calculations [95] 40 --histogram[=on|off] print latency histogram in report [off] 41 42 General database options: 43 44 --db-driver=STRING specifies database driver to use ('help' to get list of available drivers) 45 --db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto] 46 --db-debug[=on|off] print database-specific debug information [off] 47 48 49 Compiled-in database drivers: 50 mysql - MySQL driver 51 52 mysql options: 53 --mysql-host=[LIST,...] MySQL server host [localhost] 54 --mysql-port=[LIST,...] MySQL server port [3306] 55 --mysql-socket=[LIST,...] MySQL socket 56 --mysql-user=STRING MySQL user [sbtest] 57 --mysql-password=STRING MySQL password [] 58 --mysql-db=STRING MySQL database name [sbtest] 59 --mysql-ssl[=on|off] use SSL connections, if available in the client library [off] 60 --mysql-ssl-cipher=STRING use specific cipher for SSL connections [] 61 --mysql-compression[=on|off] use compression, if available in the client library [off] 62 --mysql-debug[=on|off] trace all client library calls [off] 63 --mysql-ignore-errors=[LIST,...] list of errors to ignore, or "all" [1213,1020,1205] 64 --mysql-dry-run[=on|off] Dry run, pretend that all MySQL client API calls are successful without executing them [off] 65 66 Compiled-in tests: 67 fileio - File I/O test 68 cpu - CPU performance test 69 memory - Memory functions speed test 70 threads - Threads subsystem performance test 71 mutex - Mutex performance test 72 73 See 'sysbench <testname> help' for a list of options for each test. |
六、sysbench对数据库进行压力测试的过程: 1 prepare 阶段 这个阶段是用来做准备的、比较说建立好测试用的表、并向表中填充数据。 2 run 阶段 这个阶段是才是去跑压力测试的SQL 3 cleanup 阶段 这个阶段是去清除数据的、也就是prepare阶段初始化好的表要都drop掉 七、sysbench 中的测试类型大致可以分成内置的,lua脚本自定义的测试: 1、内置: fileio 、cpu 、memory 、threads 、 mutex 2、lua脚本自定义型: sysbench 自身内涵了一些测试脚本放在了安装目录下的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[jianglexing@cstudio sysbench]$ ll share/sysbench 总用量 60 -rwxr-xr-x. 1 root root 1452 10月 17 15:18 bulk_insert.lua -rw-r--r--. 1 root root 13918 10月 17 15:18 oltp_common.lua -rwxr-xr-x. 1 root root 1290 10月 17 15:18 oltp_delete.lua -rwxr-xr-x. 1 root root 2415 10月 17 15:18 oltp_insert.lua -rwxr-xr-x. 1 root root 1265 10月 17 15:18 oltp_point_select.lua -rwxr-xr-x. 1 root root 1649 10月 17 15:18 oltp_read_only.lua -rwxr-xr-x. 1 root root 1824 10月 17 15:18 oltp_read_write.lua -rwxr-xr-x. 1 root root 1118 10月 17 15:18 oltp_update_index.lua -rwxr-xr-x. 1 root root 1127 10月 17 15:18 oltp_update_non_index.lua -rwxr-xr-x. 1 root root 1440 10月 17 15:18 oltp_write_only.lua -rwxr-xr-x. 1 root root 1919 10月 17 15:18 select_random_points.lua -rwxr-xr-x. 1 root root 2118 10月 17 15:18 select_random_ranges.lua drwxr-xr-x. 4 root root 46 10月 17 15:18 tests |
八、通过sysbench自带的lua脚本对mysql进行测试: 1、第一步 prepare
1 2 |
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=sbtest \ --mysql-password=123456 --mysql-db=tempdb oltp_insert prepare |
2、第二步 run
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=sbtest --mysql-password=123456 --mysql-db=tempdb oltp_insert run sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3) Running the test with following options: Number of threads: 1 Initializing random number generator from current time Initializing worker threads... Threads started! SQL statistics: queries performed: read: 0 write: 22545 other: 0 total: 22545 transactions: 22545 (2254.37 per sec.) queries: 22545 (2254.37 per sec.) ignored errors: 0 (0.00 per sec.) reconnects: 0 (0.00 per sec.) Throughput: events/s (eps): 2254.3691 time elapsed: 10.0006s total number of events: 22545 Latency (ms): min: 0.31 avg: 0.44 max: 10.47 95th percentile: 0.67 sum: 9918.59 Threads fairness: events (avg/stddev): 22545.0000/0.00 execution time (avg/stddev): 9.9186/0.00 |
3、第三步 cleanup
1 2 3 4 |
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=sbtest --mysql-password=123456 --mysql-db=tempdb oltp_insert cleanup sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3) Dropping table 'sbtest1'... |
from:https://www.cnblogs.com/JiangLe/p/7059136.html
View Details一、操作符优化 1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。 2、NOT IN操作符 此操作是强列不推荐使用的,因为它不能应用表的索引。 推荐方案:用NOT EXISTS 方案代替 3、IS NULL 或IS NOT NULL操作(判断字段是否为空) 判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。 推荐方案:用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>’’等。不允许字段为空,而用一个缺省值代替空值,如申请中状态字段不允许为空,缺省为申请。 4、> 及 < 操作符(大于或小于操作符) 大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。 5、LIKE操作符 LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。 一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。 6、UNION操作符 UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。 select * from gc_dfys union all select * from ls_jg_dfys 二、SQL书写的影响 1、同一功能同一性能不同写法SQL的影响。 如一个SQL在A程序员写的为 Select * from zl_yhjbqk B程序员写的为 Select * from dlyx.zl_yhjbqk(带表所有者的前缀) C程序员写的为 Select * from DLYX.ZLYHJBQK(大写表名) D程序员写的为 Select * […]
View DetailsPostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL,不管是私用、商用、还是学术研究使用。 PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。 PostgreSQL 不寻常的名字导致一些读者停下来尝试拼读它,特别是那些把SQL拼读为"sequel"的人。PostgreSQL 开发者把它拼读为 "post-gress-Q-L"。它也经常被简略念为 "postgres"。[1] 事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。 从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。 PostgreSQL强壮的一个原因源于它的架构。和商业数据库一样,PostgreSQL可以用于C/S(客户/服务器)环境。这对于用户和开发人员有很多好处。 PostgreSQL安装核心是数据库服务端进程。它允许在一个独立服务器上。需要访问存储在数据库中的数据的应用程序必须通过数据库进程。这些客户端程序无法直接访问数据,即使它们和服务程序在同一台机器上。
View Details