当前位置: 首页 > news >正文

惠州网站建设制作宁德市人民医院

惠州网站建设制作,宁德市人民医院,网站的在线客服怎么做的,网站开发费属于什么费用在数据库管理与优化领域,索引是提高查询性能的关键工具之一。然而,在某些情况下,单一类型的索引可能不足以满足所有查询的需求。Oracle 12c引入了一个强大的新特性:允许在同一组列上创建多个索引,但仅一个可见&#xf…

在数据库管理与优化领域,索引是提高查询性能的关键工具之一。然而,在某些情况下,单一类型的索引可能不足以满足所有查询的需求。Oracle 12c引入了一个强大的新特性:允许在同一组列上创建多个索引,但仅一个可见,并且每个索引需具有不同的属性。

本文将详细介绍如何利用这一特性进行更高效的数据库管理和优化。

一、非分区表

首先,我们从创建一个简单的非分区表开始:

DROP TABLE t1 PURGE;CREATE TABLE t1 (
id NUMBER,
description VARCHAR2(50),
created_date DATE
);INSERT INTO t1 VALUES (1, 't1 ONE', TO_DATE('01/07/2025', 'DD/MM/YYYY'));
INSERT INTO t1 VALUES (2, 't1 TWO', TO_DATE('01/07/2025', 'DD/MM/YYYY'));
INSERT INTO t1 VALUES (3, 't1 THREE', TO_DATE('01/07/2026', 'DD/MM/YYYY'));COMMIT;

接着,尝试创建两个索引来展示此功能:

  • 创建一个普通可见索引:
CREATE INDEX t1_idx1 ON t1(created_date) VISIBLE;
  • 尝试在同一列上创建一个不可见索引会导致错误(ORA-01408: such column list already indexed)。
CREATE INDEX t1_idx2 ON t1(created_date) INVISIBLE;*
ERROR at line 1:
ORA-01408: such column list already indexedSQL>
  • 除非索引类型不同,如创建一个位图索引:
CREATE BITMAP INDEX t1_idx3 ON t1(created_date) INVISIBLE;

二、分区表示例

接下来,我们将探讨分区表的应用场景。首先创建一个基于created_date列的范围分区表:

DROP TABLE t1 PURGE;
CREATE TABLE t1 (
id NUMBER,
description VARCHAR2(50),
created_date DATE
)
PARTITION BY RANGE (created_date) (
PARTITION part_2024 VALUES LESS THAN (TO_DATE('01/01/2025', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION part_2025 VALUES LESS THAN (TO_DATE('01/01/2026', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION part_2026 VALUES LESS THAN (TO_DATE('01/01/2027', 'DD/MM/YYYY')) TABLESPACE users
);INSERT INTO t1 VALUES (1, 't1 ONE', TO_DATE('01/07/2024', 'DD/MM/YYYY'));
INSERT INTO t1 VALUES (2, 't1 TWO', TO_DATE('01/07/2025', 'DD/MM/YYYY'));
INSERT INTO t1 VALUES (3, 't1 THREE', TO_DATE('01/07/2026', 'DD/MM/YYYY'));
COMMIT;

然后,可以创建不同类型和配置的索引:

  • 全局可见索引:
CREATE INDEX t1_idx1 ON t1(created_date) GLOBAL VISIBLE;
  • 带有不同分区方案的全局不可见索引:
CREATE INDEX t1_idx2 ON t1(created_date) GLOBAL
PARTITION BY RANGE (created_date) (
PARTITION t1_p1 VALUES LESS THAN (TO_DATE('01/01/2025', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION t1_p2 VALUES LESS THAN (TO_DATE('01/01/2026', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION t1_p3 VALUES LESS THAN (MAXVALUE) TABLESPACE users
)
INVISIBLE;
  • 局部不可见索引:
CREATE INDEX t1_idx3 ON t1(created_date) LOCAL INVISIBLE;

以上方法均可以在created_date列成功创建索引,但类型必须为INVISIBLE。

三、为什么使用多个索引?

即使不可见,索引仍然会被维护。因此,在同一组列上拥有多个索引使您可以快速切换它们,从而更快地测试各种索引的影响。请记住,过多的索引会对表的DML性能产生影响,因此不建议在同一个列上创建多个索引。

下面的例子使用了上述创建的分区表和相关索引来检查索引的可见性:

-- 检查索引的可见性 .
COLUMN index_name FORMAT A10
COLUMN index_type FORMAT A10
COLUMN partitioned FORMAT A12
COLUMN locality FORMAT A8
COLUMN visibility FORMAT A10SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM   user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED  PARTITION LOCALITY   VISIBILITY
---------- ---------- ------------ --------- ---------- ----------
T1_IDX1    NORMAL     NO                                VISIBLE
T1_IDX2    NORMAL     YES          RANGE     GLOBAL     INVISIBLE
T1_IDX3    NORMAL     YES          RANGE     LOCAL      INVISIBLE
T1_IDX4    BITMAP     YES          RANGE     LOCAL      INVISIBLESQL>-- 测试索引的可用性.
SET AUTOTRACE TRACE EXPLAINSELECT *
FROM   t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                  | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                           |         |     1 |    49 |     1   (0)| 00:00:01 |       |       |
|   1 |  TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| T1      |     1 |    49 |     1   (0)| 00:00:01 |     1 |     1 |
|*  2 |   INDEX RANGE SCAN                         | T1_IDX1 |     1 |       |     1   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF

切换索引可见性,然后再次测试。

-- 切换索引.
ALTER INDEX t1_idx1 INVISIBLE;
ALTER INDEX t1_idx2 VISIBLE;-- 检查索引的可见性.
SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM   user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED  PARTITION LOCALITY   VISIBILITY
---------- ---------- ------------ --------- ---------- ----------
T1_IDX1    NORMAL     NO                                INVISIBLE
T1_IDX2    NORMAL     YES          RANGE     GLOBAL     VISIBLE
T1_IDX3    NORMAL     YES          RANGE     LOCAL      INVISIBLE
T1_IDX4    BITMAP     YES          RANGE     LOCAL      INVISIBLESQL>-- 测试索引的可用性.
SET AUTOTRACE TRACE EXPLAINSELECT *
FROM   t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                            |         |     1 |    49 |     1   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE                     |         |     1 |    49 |     1   (0)| 00:00:01 |     1 |     1 |
|   2 |   TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| T1      |     1 |    49 |     1   (0)| 00:00:01 |     1 |     1 |
|*  3 |    INDEX RANGE SCAN                         | T1_IDX2 |     1 |       |     1   (0)| 00:00:01 |     1 |     1 |
-----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF

再次切换索引可见性并测试。

-- 切换索引.
ALTER INDEX t1_idx2 INVISIBLE;
ALTER INDEX t1_idx3 VISIBLE;-- 检查索引的可见性.
SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM   user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED  PARTITION LOCALITY   VISIBILITY
---------- ---------- ------------ --------- ---------- ----------
T1_IDX1    NORMAL     NO                                INVISIBLE
T1_IDX2    NORMAL     YES          RANGE     GLOBAL     INVISIBLE
T1_IDX3    NORMAL     YES          RANGE     LOCAL      VISIBLE
T1_IDX4    BITMAP     YES          RANGE     LOCAL      INVISIBLESQL>-- 测试索引的可用性.
SET AUTOTRACE TRACE EXPLAINSELECT *
FROM   t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                  | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                           |         |     1 |    49 |     1   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE                    |         |     1 |    49 |     1   (0)| 00:00:01 |     1 |     1 |
|   2 |   TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1      |     1 |    49 |     1   (0)| 00:00:01 |     1 |     1 |
|*  3 |    INDEX RANGE SCAN                        | T1_IDX3 |     1 |       |     1   (0)| 00:00:01 |     1 |     1 |
----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF

再次切换索引可见性并测试。

-- 切换索引.
ALTER INDEX t1_idx3 INVISIBLE;
ALTER INDEX t1_idx4 VISIBLE;-- 检查索引的可见性.
SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM   user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED  PARTITION LOCALITY   VISIBILITY
---------- ---------- ------------ --------- ---------- ----------
T1_IDX1    NORMAL     NO                                INVISIBLE
T1_IDX2    NORMAL     YES          RANGE     GLOBAL     INVISIBLE
T1_IDX3    NORMAL     YES          RANGE     LOCAL      INVISIBLE
T1_IDX4    BITMAP     YES          RANGE     LOCAL      VISIBLESQL>-- 测试索引的可用性.
SET AUTOTRACE TRACE EXPLAINSELECT *
FROM   t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                  | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                           |         |     1 |    49 |    15   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE                    |         |     1 |    49 |    15   (0)| 00:00:01 |     1 |     1 |
|   2 |   TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1      |     1 |    49 |    15   (0)| 00:00:01 |     1 |     1 |
|   3 |    BITMAP CONVERSION TO ROWIDS             |         |       |       |            |          |       |       |
|*  4 |     BITMAP INDEX SINGLE VALUE              | T1_IDX4 |       |       |            |          |     1 |     1 |
----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF

通过以上的测试流程,我们可以得到同一个列上不同类型的索引的执行计划以及消耗情况,这样可以筛选出最为适合的索引创建方案。

四、使用不可见索引

通过设置参数OPTIMIZER_USE_INVISIBLE_INDEXES为TRUE,可以启用对不可见索引的支持,从而测试不同索引策略的效果:

ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE;

这使得即使存在可见索引,也可以选择使用不可见索引,为数据库管理员提供了更大的灵活性来优化查询性能。

-- 检查索引的可见性 .
SELECT a.index_name,a.index_type,a.partitioned,b.partitioning_type,b.locality,a.visibility
FROM   user_indexes aLEFT OUTER JOIN user_part_indexes b ON a.index_name = b.index_name
ORDER BY index_name;INDEX_NAME INDEX_TYPE PARTITIONED  PARTITION LOCALITY VISIBILITY
---------- ---------- ------------ --------- -------- ----------
PK_EMP     NORMAL     NO                              VISIBLE
T1_IDX1    NORMAL     NO                              INVISIBLE
T1_IDX2    NORMAL     YES          RANGE     GLOBAL   INVISIBLE
T1_IDX3    NORMAL     YES          RANGE     LOCAL    INVISIBLE
T1_IDX4    BITMAP     YES          RANGE     LOCAL    VISIBLESQL>-- 允许优化器使用不可见索引.
ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE;SET AUTOTRACE TRACE EXPLAINSELECT *
FROM   t1
WHERE created_date = TO_DATE('01/07/2024', 'DD/MM/YYYY');----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                  | Name    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                           |         |     1 |    49 |     1   (0)| 00:00:01 |       |       |
|   1 |  TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED| T1      |     1 |    49 |     1   (0)| 00:00:01 |     1 |     1 |
|*  2 |   INDEX RANGE SCAN                         | T1_IDX1 |     1 |       |     1   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------------SET AUTOTRACE OFF

五、结论

Oracle 12c提供的在同一组列上创建多个索引的功能极大地增强了数据库管理员调整和优化数据库的能力。通过合理配置不同类型的索引,可以有效地提升查询效率,同时保持系统的灵活性和可维护性。

http://www.khdw.cn/news/59962.html

相关文章:

  • 北京企业网站备案需要多久友情链接图片
  • 宝安led行业网站建设事件营销成功案例
  • 一家专门做内部优惠的网站下载优化大师
  • 公众号版影视网站开发软文推广代理
  • 不会代码可以做网站维护吗营销策划公司排名
  • 企业网站优化怎么做重庆百度seo排名
  • 代码生成器原理湖南百度seo排名点击软件
  • 做网站需要提供什么杭州优化关键词
  • 网站建设及推广服务的合同范本千度seo
  • 网站规划设计公众号排名优化软件
  • cloud域名注册网站常用的网络推广手段有哪些
  • 上海中学官网登录百度推广优化排名怎么收费
  • 做网站需要了解的知识义乌最好的电商培训学校
  • 做网站建设多少钱seo国外英文论坛
  • 自己做网站有什么用百度竞价推广费用
  • 北京网站制作推广谷歌下载官网
  • wordpress教程安装教程视频教程合肥seo优化公司
  • 企业网站设计网络公司热搜榜上2023年热搜
  • 网站建设中英文表述北京网站seo招聘
  • 怎么用css做响应式网站seo指的是什么意思
  • 网页内嵌网站爱站seo查询软件
  • 页面即将自动跳转快速排名优化
  • 郑州优化网站收费标准百度网址大全旧版安装
  • 雨岑信息科技有限公司做企业型网站做的怎么样_公司规模如何东莞seo
  • 网站 设计报价杭州做seo的公司
  • 北京做网站的公司排名什么是核心关键词
  • 洛阳市住房与建设委官方网站营销推广活动策划方案大全
  • 政府单位网站建设方案广告网络推广怎么做
  • php网站开发模板seo搜索引擎优化课程
  • 可以做甩货的电商网站营销网络是什么意思