大家知道数据表中的数据都是无序的存在库中,当我们在对数据进行检索的时候,查找起来很是耗费资源,于是我们就需要为表创建索引,索引的作用就是把表中的数据按照一定的顺序排列保存起来,于是就出现了一个问题,有的表中的数据和索引想要排列的顺序很是相近,而另一些表中的数据和索引想要排列的顺序相距甚远,聚簇因子的作用就是用来标示这个的,聚簇因子越小,相似度越高,聚簇因子越大,相似度越低。
1、列顺序
当计算有效索引选择率时,在基于区间的谓词之后的所有基于列的谓词都将被忽略——但是计算有效表选择率的时候还会使用他们——这样就导致oracle计算得出该索引的成本高得离谱。这就建议我们重新调整某些索引的结构,将对应于区间谓词的列调整到索引定义的末尾。这种调整可能会改变clustering_factor的值。
SQL> create table t1 2 pctfree 90 3 pctused 10 4 as 5 select 6 trunc((rownum-1)/ 100) clustered, 7 mod(rownum - 1, 100) scattered, 8 lpad(rownum,10) small_vc 9 from 10 all_objects 11 where 12 rownum <= 10000 13 ; 表已创建。 SQL> create index t1_i1_good on t1(clustered, scattered); 索引已创建。 SQL> create index t1_i2_bad on t1(scattered, clustered); 索引已创建。 SQL> begin 2 dbms_stats.gather_table_stats( 3 user, 4 't1', 5 cascade => true, 6 estimate_percent => null, 7 method_opt => 'for all columns size 1' 8 ); 9 end; 10 / PL/SQL 过程已成功完成。 SQL> select i.index_name,i.blevel,i.leaf_blocks,i.clustering_factor from user_indexes i; INDEX_NAME BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR ------------------------------ ---------- ----------- ----------------- T1_I1_GOOD 1 24 278 T1_I2_BAD 1 24 10000 SQL> set autotrace trace exp; SQL> select count(small_vc) 2 from t1 3 where scattered = 50 4 and clustered between 1 and 5; 执行计划 ---------------------------------------------------------- Plan hash value: 2833503776 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 17 | 4 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 17 | | | | 2 | TABLE ACCESS BY INDEX ROWID| T1 | 6 | 102 | 4 (0)| 00:00:01 | |* 3 | INDEX RANGE SCAN | T1_I1_GOOD | 6 | | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("CLUSTERED">=1 AND "SCATTERED"=50 AND "CLUSTERED"<=5) filter("SCATTERED"=50) SQL> select 2 /*+ index(t1 t1_i2_bad) */ 3 count(small_vc) 4 from t1 5 where scattered = 50 6 and clustered between 1 and 5; 执行计划 ---------------------------------------------------------- Plan hash value: 2223336776 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 17 | 9 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 17 | | | | 2 | TABLE ACCESS BY INDEX ROWID| T1 | 6 | 102 | 9 (0)| 00:00:01 | |* 3 | INDEX RANGE SCAN | T1_I2_BAD | 6 | | 2 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("SCATTERED"=50 AND "CLUSTERED">=1 AND "CLUSTERED"<=5)
在第一个执行计划中,尽管存在一个索引(T1_I2_BAD)能很好的满足以上查询的要求,其第一列是scattered(使用相等谓词),第二列是clustered(使用基于区间的谓词),优化器还是选择了t1_i1_good索引。
在第二个执行计划中,添加了一个提示来强制oracle使用我们认为更能满足查询要求的那个索引(t1_i2_bad),但是由此带来的成本将是优化器的默认选择的成本的两倍还要多(由4变为9)。
这就突出了优化器利用clustering_factor来计算索引访问路劲成本的缺陷。不管这个示例中用的是哪一个索引,访问表的数目是完全相同的——但是访问顺序会存在差异,这也足以导致优化器成本的计算结果产生巨大的差异。
SQL> select s.table_name, 2 s.column_name, 3 s.num_distinct, 4 s.density, 5 s.num_nulls, 6 s.avg_col_len 7 from user_tab_col_statistics s 8 where table_name = 'T1'; TABLE_NAME COLUMN_NAME NUM_DISTINCT DENSITY NUM_NULLS AVG_COL_LEN ------------------------------ ------------------------------ ------------ ---------- ---------- ----------- T1 CLUSTERED 100 .01 0 3 T1 SCATTERED 100 .01 0 3 T1 SMALL_VC 10000 .0001 0 11
scattered = 50 的选择率: 1/100
clustered between 1 and 5 的选择率:(5-1)/(99-0)+2/100
联合选择率:1/100 * (5-1)/(99-0)+2/100
SQL> --cost(t1_il_good) SQL> select 2 1 + 3 ceil(24 * ((5-1)/(99-0)+2/100)) + 4 ceil(278 * (1/100 * ((5-1)/(99-0)+2/100))) 5 from dual; 1+CEIL(24*((5-1)/(99-0)+2/100))+CEIL(278*(1/100*((5-1)/(99-0)+2/100))) ----------------------------------------------------------------------- 4 SQL> --cost(t1_il_bad) SQL> select 2 1 + 3 ceil(24 * (1/100 * ((5-1)/(99-0)+2/100))) + 4 ceil(10000 * (1/100 * ((5-1)/(99-0)+2/100))) 5 from dual; 1+CEIL(24*(1/100*((5-1)/(99-0)+2/100)))+CEIL(10000*(1/100*((5-1)/(99-0)+2/100))) --------------------------------------------------------------------------------- 9
2、额外的列
为索引添加一个或者两个列。也会导致clustering_factor出现剧烈的变化。
SQL> create table t1 2 as 3 select 4 sysdate + trunc((rownum-1) / 500)movement_date, 5 trunc(dbms_random.value(1,60.999))product_id, 6 trunc(dbms_random.value(1,10.000))qty, 7 lpad(rownum,10)small_vc, 8 rpad('x',100)padding 9 from 10 all_objects 11 where 12 rownum <= 10000 13 ; 表已创建。 SQL> create index t1_i1 on t1(movement_date); begin dbms_stats.gather_table_stats( user, 't1', cascade => true, estimate_percent => null, 索引已创建。 method_opt => 'for all columns size 1' 8 ); 9 end; 10 / PL/SQL 过程已成功完成。 SQL> create index t1_i2 on t1(movement_date, product_id); begin dbms_stats.gather_table_stats( user, 't1', cascade => true, 索引已创建。 SQL> 2 3 4 5 6 estimate_percent => null, 7 method_opt => 'for all columns size 1' 8 ); 9 end; 10 / PL/SQL 过程已成功完成。 SQL> select i.index_name,i.blevel,i.leaf_blocks,i.clustering_factor from user_indexes i; INDEX_NAME BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR ------------------------------ ---------- ----------- ----------------- T1_I1 1 27 184 T1_I2 1 31 6664
虽然索引的大小只有一点点增加(这也可以通过叶块的数目提现出来),但是,clustering_factor的值再次出现了严重的变化。
SQL> select /*+ index(t1 t1_i1) */ 2 sum(qty) 3 from t1 4 where movement_date = trunc(sysdate) + 7 5 and product_id = 44; 执行计划 ---------------------------------------------------------- Plan hash value: 269862921 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 14 | 12 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 14 | | | |* 2 | TABLE ACCESS BY INDEX ROWID| T1 | 8 | 112 | 12 (0)| 00:00:01 | |* 3 | INDEX RANGE SCAN | T1_I1 | 500 | | 2 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): -----
MongoDB 是一个高性能,开源,无模式的文档型数据库,采用C++开发,是当前NoSql数据库中比较热门的一种,在许多场景下可用于替代传统的关系型数据库或键/值存储方式。
1,特点和功能
1) 特点
- 高性能、易部署、易使用,存储数据非常方便。
- 面向集合存储,易存储对象类型的数据,模式自由。
- 支持动态查询,支持完全索引,包含内部对象。
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性
- 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
- 文件存储格式为BSON(一种JSON的扩展),可通过网络访问。
2) 功能
- 面向集合的存储:适合存储对象及JSON形式的数据。
- 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
- 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
- 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
- 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
- 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。
2, 适用场合
3, 下载安装
mongoDB 下载, 最新版本 mongodb-linux-x86_64-2.2.3.tgz
mongoDB 安装:
tar zxvf mongodb-linux-x86_64-2.2.3.tgz
cd mongodb-linux-x86_64-2.2.3
sudo mkdir /opt/mongodb-2.2.3
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/
安装完毕后,在浏览器URL栏输入: http://localhost:27017/,出现下面内容则表示安装成功!
4, 启动关闭
1) 默认启动
sudo ./bin/mongod (默认保存文件目录为/data/db/, 没有则新建 sudo mkdir -p /data/db/, 默认端口为27017)
2)指定目录启动
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/ (保存文件目录为/opt/mongodb-2.2.3/ , 没有则新建)
3) 指定端口启动
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/ -p 27000 (端口修改为指定27000),启动输出如下:
MongoDB starting : pid=4222 port=27000 dbpath=/opt/mongodb-2.2.3/ 32-bit host=ubuntu
5, 命令示例
6, 应用示例
参考推荐:
MongoDB学习笔记
mongod参数说明
# 修改防火墙设置,打开5432端口
vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
# 重启防火墙使新设置生效
service iptables restart
# 新增用户组
groupadd postgres
# 新增用户
useradd postgres -M -g postgres
# 新建数据库执行文件目录
mkdir -p /usr/local/pgsql
# 新建数据库数据文件目录
mkdir -p /data/pgsql/data
# 修改目录拥有者
chown -R postgres /usr/local/pgsql/.
chown -R postgres /data/pgsql/data
chown -R postgres /data/pgsql/data/.
# 编辑PATH搜索路径
vi /etc/profile
Append these 2 lines to the end of the file:
PATH=/usr/local/pgsql/bin:$PATH
export PATH
# 生效PATH搜索路径
source /etc/profile
# 安装编译源码所需的工具和库
yum -y install wget gcc readline-devel zlib-devel make
# 进入源码压缩包下载目录
cd /usr/src
# 下载源码压缩包
wget http://ftp.postgresql.org/pub/source/v9.2.2/postgresql-9.2.2.tar.bz2
# 解压缩源码包
tar jxvf ./postgresql-9.2.2.tar.bz2
# 进入解压缩源码目录
cd ./postgresql-9.2.2
# 执行源码编译配置脚本
./configure
# 编译源码
make
# 安装
make install
# 变更登录用户
su - postgres
# 执行数据库初始化脚本
/usr/local/pgsql/bin/initdb --encoding=utf8 -D /data/pgsql/data
# 退出变更登录
exit
# 复制PostgreSQL执行脚本
cp /usr/src/postgresql-9.2.2/contrib/start-scripts/linux /etc/init.d/postgresql
# 增加执行权限
chmod +x /etc/init.d/postgresql
# 编辑PostgreSQL执行脚本,指定数据库文件目录
vi /etc/init.d/postgresql
PGDATA="/data/pgsql/data"
# 编辑配置文件,配置可访问数据库的网络地址
vi /data/pgsql/data/postgresql.conf
listen_addresses = '*'
# 启动PostgreSQL服务
service postgresql start
# 以postgres用户登录数据库,修改postgres用户的数据库密码
psql -U postgres
postgres=# ALTER USER postgres PASSWORD '123456';
postgres=# \q
# 编辑配置文件,设置密码md5验证
vi /data/pgsql/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
#host all all 127.0.0.1/32 trust
host all all all md5
# 重启数据库服务
service postgresql restart
>>>>>>>>>>>>>>>完成
本文链接