Oracle中表建立联合索引后,其中的一个字段是否可以用来进行索引。
在Oracle中我给一个表的两个字段建立了联合索引,用来增加查询速度,如:whereid=?anduser_id=?[createindextable_id_userid...
在Oracle中我给一个表的两个字段建立了联合索引,用来增加查询速度,如:where id=? and user_id=? [create index table_id_userid on test_table(id,user_id)];然后又有一个查询语句是where id=? 那我创建的索引table_id_userid能否对where id=?这个查询语句管用???
在这种情况下(又两种查询方式)是应该只创建id的索引还是创建id,user_id的联合索引! 展开
在这种情况下(又两种查询方式)是应该只创建id的索引还是创建id,user_id的联合索引! 展开
7个回答
TableDI
2024-07-18 广告
2024-07-18 广告
`VLOOKUP` 匹配出错误的数据通常是由于以下几个原因:1. **查找值错误**:输入的查找值与数据源中的值不匹配,可能是因为拼写错误、大小写不一致或存在不可见的字符。2. **查找区域设置错误**:查找区域的首列必须包含要查找的值,且...
点击进入详情页
本回答由TableDI提供
展开全部
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
看看这个你就明白了
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
看看这个你就明白了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个where id=? 另外一个 where id=? and user_id=? 那么这种情况下创建复合索引test_table(id,user_id)效率比较高(复合索引只访问一次,而单独建两个索引需要访问索引两次)还节省了存储资源,一般来说 复合索引使用的条件是where后面的列名顺序和索引创建时的顺序要一致,如果where后面有id的话 也可以用到这个复合索引,如果只是user_id而没有id的话是用不上这个复合索引的。 你可以查询执行计划或者做一个sql trace来查看复合索引和单独索引的效率情况,比如PL/SQ/ dev F5或者sqlplus 下set autot on 然后执行语句 或者
SQL>explain plan select * from test_table where id=? and user_id=?
SQL>select * from table(dbms_xplan.display);
SQL>explain plan select * from test_table where id=? and user_id=?
SQL>select * from table(dbms_xplan.display);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是可以的,只要oracle认为走索引是最好的成本,测试如下:
[oracle@gabriel ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Jul 11 10:49:22 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> drop table scott.test_index;
Table dropped.
SQL> create table scott.test_index as select object_id,object_name from dba_objects;
Table created.
SQL> conn scott/scott
Connected.
SQL> create index index_test on test_index(object_id,object_name);
Index created.
SQL> set autotrace traceonly;
SQL> analyze table test_index compute statistics;
Table analyzed.
SQL> select * from test_index where object_id=1;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 3704158663
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| INDEX_TEST | 1 | 28 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("OBJECT_ID"=1)
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
339 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
你看,where字句我只给了一个object id字段,但是执行计划显示index range scan
[oracle@gabriel ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Jul 11 10:49:22 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> drop table scott.test_index;
Table dropped.
SQL> create table scott.test_index as select object_id,object_name from dba_objects;
Table created.
SQL> conn scott/scott
Connected.
SQL> create index index_test on test_index(object_id,object_name);
Index created.
SQL> set autotrace traceonly;
SQL> analyze table test_index compute statistics;
Table analyzed.
SQL> select * from test_index where object_id=1;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 3704158663
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| INDEX_TEST | 1 | 28 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("OBJECT_ID"=1)
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
339 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
你看,where字句我只给了一个object id字段,但是执行计划显示index range scan
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我晕,忘记登录了,楼主给分吧
是可以的,只要oracle认为走索引是最好的成本,测试如下:
[oracle@gabriel ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Jul 11 10:49:22 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> drop table scott.test_index;
Table dropped.
SQL> create table scott.test_index as select object_id,object_name from dba_objects;
Table created.
SQL> conn scott/scott
Connected.
SQL> create index index_test on test_index(object_id,object_name);
Index created.
SQL> set autotrace traceonly;
SQL> analyze table test_index compute statistics;
Table analyzed.
SQL> select * from test_index where object_id=1;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 3704158663
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| INDEX_TEST | 1 | 28 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("OBJECT_ID"=1)
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
339 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
你看,where字句我只给了一个object id字段,但是执行计划显示index range scan ,前提是object id字段是联合索引的前导列,如果用object name来查询那么就不走了
是可以的,只要oracle认为走索引是最好的成本,测试如下:
[oracle@gabriel ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Jul 11 10:49:22 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> drop table scott.test_index;
Table dropped.
SQL> create table scott.test_index as select object_id,object_name from dba_objects;
Table created.
SQL> conn scott/scott
Connected.
SQL> create index index_test on test_index(object_id,object_name);
Index created.
SQL> set autotrace traceonly;
SQL> analyze table test_index compute statistics;
Table analyzed.
SQL> select * from test_index where object_id=1;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 3704158663
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| INDEX_TEST | 1 | 28 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("OBJECT_ID"=1)
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
339 bytes sent via SQL*Net to client
374 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
你看,where字句我只给了一个object id字段,但是执行计划显示index range scan ,前提是object id字段是联合索引的前导列,如果用object name来查询那么就不走了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询