LIST Partitioning

shiyihai發表於2007-07-13

This article is intended to introduce the enhancements to the
new partitioning method introduced in 9i, LIST Partitioning.

[@more@]SCOPE & APPLICATION
-------------------

This article assumes the reader has an understanding of partitioning that was
introduced in Oracle8 and Oracle8i.


ORACLE9i LIST PARTITIONING
--------------------------

Oracle9i adds a new partitioning model called LIST partitioning to
the set of partition methods already being supported in the Oracle RDBMS.
List partitioning enables the user to explicitly control how rows map to partitions.
You do this by specifying a list of discrete values for the partitioning key in
the description for each partition. This is different from range partitioning, where
a range of values is associated with a partition and from hash partitioning, where
a hash function controls the row-to-partition mapping. The advantage of list
partitioning is that you can group and organize unordered and unrelated sets
of data in a natural way.

Either Tables or Indexes may be partitioned with LIST method.

To support list partitioning, changes have been made to the various command
syntax. The examples below will illustrate these changes.

Partition pruning, Partition Wise Join and parallelism are also usable with
this method.

The following restrictions concern the LIST partitioning :

- Only one single column can be specified as key partition.
- The IOTs cannot be partitioned with LIST method.
- The same values cannot be specified in different or same partitions.
- The MAXVALUE bound used with RANGE partitioning cannot be used
with LIST method.
- A partition cannot be empty.


New In 9.2.0
--------------

In Oracle version 9.2.0 you can also specify a default partition into which
rows that do not map to any other partition are mapped.

Example:

CREATE TABLE sales_list
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois')
PARTITION sales_other VALUES(DEFAULT)
);

In the above example inserting value with sales_state 'COLORADO' would map to
Sales_other partition.

The DEFAULT partition enables you to avoid specifying all possible values for a
list-partitioned table by using a default partition, so that all rows that do not map to
any other partition do not generate an error.

I. List Partition Maintenance
==============================

On Table:
=========

1. CREATE a List Partitioned Table.
2. MODIFY (ADD/DROP Values).
3. ADD Partition.
4. MERGE.
5. RENAME.
6. SPLIT.
7. TRUNCATE.
8. EXCHANGE.
9. MOVE.
10. MODIFY DEFAULT ATTRIBUTES.
11. MODIFY REAL ATTRIBUTES.

On Index:
=========

The List Partitioning is only usable on local indexes which
are equipartitioned with underlying tables. The set of commands
usable on these indexes is limited because it depends directly
from the table's administration.

The only commands which are executable on it are:

1. MODIFY DEFAULT ATTRIBUTES.
2. MODIFY REAL ATTRIBUTES.
3. REBUILD PARTITION.
4. RENAME PARTITION.


1.0 List Partition Maintenance on Table - Examples
==================================================

Example 1.1 ( CREATE a List Partitioned Table)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> CREATE TABLE employees_reg_p
2 ( employee_id NUMBER(6)
3 , first_name VARCHAR2(20)
4 , last_name VARCHAR2(25) CONSTRAINT emp_last_name_nn_p NOT NULL
5 , email VARCHAR2(25) CONSTRAINT emp_email_nn_p NOT NULL
6 , phone_number VARCHAR2(20)
7 , hire_date DATE CONSTRAINT emp_hire_date_nn_p NOT NULL
8 , job_id VARCHAR2(10) CONSTRAINT emp_job_nn_p NOT NULL
9 , salary NUMBER(8,2) CONSTRAINT emp_salary_nn_p NOT NULL
10 , commission_pct NUMBER(2,2)
11 , manager_id NUMBER(8)
12 , department_id NUMBER(4)
13 , region VARCHAR2(15)
14 , CONSTRAINT emp_salary_min_p CHECK (salary > 0)) PCTFREE 60
15 partition BY LIST (REGION)
16 (partition Zone_1 VALUES('R1','R10','R11','R12') TABLESPACE example,
17 partition Zone_2 VALUES('R13','R14','R15','R16') TABLESPACE example,
18 partition Zone_3 VALUES('R17','R18','R19','R2') TABLESPACE example,
19 partition Zone_4 VALUES('R20','R21','R22','R23') TABLESPACE example,
20 partition Zone_5 VALUES('R24','R25','R26','R27') TABLESPACE example,
21 partition Zone_6 VALUES('R28','R29','R3','R30') TABLESPACE example,
22 partition Zone_7 VALUES ('R31','R32','R4','R5') TABLESPACE example,
23 partition Zone_8 VALUES ('R6','R7','R8','R9') TABLESPACE example);

Table created.

SQL> SELECT table_name, partition_name partition, high_value,
2 partition_position position FROM user_tab_partitions WHERE
3 table_name='EMPLOYEES_REG_P'
4 order by position;

TABLE_NAME PARTITION HIGH_VALUE POSITION
--------------- ---------- --------------------------------- --------
EMPLOYEES_REG_P ZONE_1 'R1', 'R10', 'R11', 'R12' 1
EMPLOYEES_REG_P ZONE_2 'R13', 'R14', 'R15', 'R16' 2
EMPLOYEES_REG_P ZONE_3 'R17', 'R18', 'R19', 'R2' 3
EMPLOYEES_REG_P ZONE_4 'R20', 'R21', 'R22', 'R23' 4
EMPLOYEES_REG_P ZONE_5 'R24', 'R25', 'R26', 'R27' 5
EMPLOYEES_REG_P ZONE_6 'R28', 'R29', 'R3', 'R30' 6
EMPLOYEES_REG_P ZONE_7 'R31', 'R32', 'R4', 'R5' 7
EMPLOYEES_REG_P ZONE_8 'R6', 'R7', 'R8', 'R9' 8

8 rows selected.

SQL> select table_name, PARTITIONING_TYPE, PARTITION_COUNT from user_part_tables
2 where table_name = 'EMPLOYEES_REG_P';

TABLE_NAME PARTITIONING_TYPE PARTITION_COUNT
-------------------- -------------------- ---------------
EMPLOYEES_REG_P LIST 8

Example 1.2 ( MODIFY a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You must previously delete the rows containing the partitioning key before
dropping the corresponding key. If it's not the case, you will receive the
message below:

ORA-14518: partition contains rows corresponding to values being dropped

SQL> Delete employees_reg_p WHERE region in ('R32', 'R22');

68 rows deleted.

SQL> ALTER TABLE employees_reg_p modify partition zone_4
2 DROP values ('R22');

Table altered.

SQL> ALTER TABLE employees_reg_p modify partition zone_7
2 DROP values ('R32');

Table altered.

TABLE_NAME PARTITION HIGH_VALUE POSITION
-------------------- ---------- ------------------------- ----------
EMPLOYEES_REG_P ZONE_1 'R1', 'R10', 'R11', 'R12' 1
EMPLOYEES_REG_P ZONE_2 'R13', 'R14', 'R15', 'R16 2
EMPLOYEES_REG_P ZONE_3 'R17', 'R18', 'R19', 'R2' 3
EMPLOYEES_REG_P ZONE_4 'R20', 'R21', 'R23' 4
EMPLOYEES_REG_P ZONE_5 'R24', 'R25', 'R26', 'R27 5
EMPLOYEES_REG_P ZONE_6 'R28', 'R29', 'R3', 'R30' 6
EMPLOYEES_REG_P ZONE_7 'R31', 'R4', 'R5' 7
EMPLOYEES_REG_P ZONE_8 'R6', 'R7', 'R8', 'R9' 8

8 rows selected.

You cannot DROP all the literal values in a specific partition. I you
try it, you will receive:

ORA-14317: cannot drop the last value of partition

You can also ADD values on a targeted partition.

Example 1.3 ( ADD a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> ALTER TABLE employees_reg_p ADD partition ZONE_ADD
2 values ('R22', 'R32');

SQL> SELECT table_name, partition_name partition, high_value,
2 partition_position position FROM user_tab_partitions WHERE
3 table_name='EMPLOYEES_REG_P';

TABLE_NAME PARTITION HIGH_VALUE POSITION
--------------- ---------- --------------------------------- --------
EMPLOYEES_REG_P ZONE_ADD 'R22', 'R32' 9
EMPLOYEES_REG_P ZONE_1 'R1', 'R10', 'R11', 'R12' 1
EMPLOYEES_REG_P ZONE_2 'R13', 'R14', 'R15', 'R16' 2
EMPLOYEES_REG_P ZONE_3 'R17', 'R18', 'R19', 'R2' 3
EMPLOYEES_REG_P ZONE_4 'R20', 'R21', 'R23' 4
EMPLOYEES_REG_P ZONE_5 'R24', 'R25', 'R26', 'R27' 5
EMPLOYEES_REG_P ZONE_6 'R28', 'R29', 'R3', 'R30' 6
EMPLOYEES_REG_P ZONE_7 'R31', 'R4', 'R5' 7
EMPLOYEES_REG_P ZONE_8 'R6', 'R7', 'R8', 'R9' 8

9 rows selected.

SQL> ALTER TABLE employees_reg_p modify partition ZONE_ADD
2 DROP values ('R22');

Table altered.

SQL> ALTER TABLE employees_reg_p modify partition ZONE_4
2 ADD values ('R22');

Table altered.


New In 9.2.0
--------------

Restriction on adding list partitions:

You cannot add a list partition if you have already defined a DEFAULT partition
for the table. Instead you must use the split_table_partition clause to
split the DEFAULT partition.

Examlpe :

SQL> alter table sales_by_region add partition region_aiman values ('DC');
alter table sales_by_region add partition region_aiman values ('DC')
*
ERROR at line 1:
ORA-14323: cannot add partition when DEFAULT partition exists


Example 1.4 ( MERGE List Partitions )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can merge any two partitions. They don't need to be adjacent as with
the RANGE partitioning method, because there is no order to comply.

SQL> ALTER TABLE employees_reg_p merge partitions zone_add, zone_7 into
2 partition zone_7;

Table altered.

SQL> SELECT table_name, partition_name partition, high_value,
2 partition_position position FROM user_tab_partitions WHERE
3 table_name='EMPLOYEES_REG_P'
4 ;

TABLE_NAME PARTITION HIGH_VALUE POSITION
-------------------- ---------- ------------------------- ----------
EMPLOYEES_REG_P ZONE_1 'R1', 'R10', 'R11', 'R12' 1
EMPLOYEES_REG_P ZONE_2 'R13', 'R14', 'R15', 'R16' 2
EMPLOYEES_REG_P ZONE_3 'R17', 'R18', 'R19', 'R2' 3
EMPLOYEES_REG_P ZONE_4 'R20', 'R21', 'R23', 'R22' 4
EMPLOYEES_REG_P ZONE_5 'R24', 'R25', 'R26', 'R27' 5
EMPLOYEES_REG_P ZONE_6 'R28', 'R29', 'R3', 'R30' 6
EMPLOYEES_REG_P ZONE_7 'R32', 'R31', 'R4', 'R5' 7
EMPLOYEES_REG_P ZONE_8 'R6', 'R7', 'R8', 'R9' 8

8 rows selected.


Example 1.5 ( RENAME a List Partitions )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> ALTER TABLE employees_reg_p rename partition zone_7 to zone_merge;

Table altered.

SQL> SELECT table_name, partition_name partition, high_value,
2 partition_position position FROM user_tab_partitions WHERE
3 table_name='EMPLOYEES_REG_P';

TABLE_NAME PARTITION HIGH_VALUE POSITION
--------------- ---------- --------------------------------- --------
EMPLOYEES_REG_P ZONE_1 'R1', 'R10', 'R11', 'R12' 1
EMPLOYEES_REG_P ZONE_2 'R13', 'R14', 'R15', 'R16' 2
EMPLOYEES_REG_P ZONE_3 'R17', 'R18', 'R19', 'R2' 3
EMPLOYEES_REG_P ZONE_4 'R20', 'R21', 'R23', 'R22' 4
EMPLOYEES_REG_P ZONE_5 'R24', 'R25', 'R26', 'R27' 5
EMPLOYEES_REG_P ZONE_6 'R28', 'R29', 'R3', 'R30' 6
EMPLOYEES_REG_P ZONE_MERGE 'R32', 'R31', 'R4', 'R5' 7
EMPLOYEES_REG_P ZONE_8 'R6', 'R7', 'R8', 'R9' 8

8 rows selected.


Example 1.6 ( SPLIT a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> ALTER TABLE employees_reg_p merge partitions zone_1, zone_3 into
2 partition zone_merge1_3;

Table altered.

SQL> SELECT table_name, partition_name partition, high_value,
2 partition_position position FROM user_tab_partitions WHERE
3 table_name='EMPLOYEES_REG_P';


TABLE_NAME PARTITION HIGH_VALUE POSITION
--------------- --------------- --------------------------- ----------
EMPLOYEES_REG_P ZONE_2 'R13', 'R14', 'R15', 'R16' 1
EMPLOYEES_REG_P ZONE_4 'R20', 'R21', 'R23', 'R22' 3
EMPLOYEES_REG_P ZONE_5 'R24', 'R25', 'R26', 'R27' 4
EMPLOYEES_REG_P ZONE_6 'R28', 'R29', 'R3', 'R30' 5
EMPLOYEES_REG_P ZONE_MERGE 'R32', 'R31', 'R4', 'R5' 6
EMPLOYEES_REG_P ZONE_8 'R6', 'R7', 'R8', 'R9' 7
EMPLOYEES_REG_P ZONE_MERGE1_3 'R1', 'R10', 'R11', 'R12', 2
'R17', 'R18', 'R19', 'R2'

7 rows selected.

SQL> ALTER TABLE employees_reg_p split partition ZONE_MERGE1_3
2 values ('R17', 'R18', 'R19', 'R2')
3 into ( partition ZONE_3, partition ZONE_1);

Table altered.

SQL> SELECT table_name, partition_name partition, high_value,
2 partition_position position FROM user_tab_partitions WHERE
3 table_name='EMPLOYEES_REG_P';

TABLE_NAME PARTITION HIGH_VALUE POSITION
--------------- ---------- --------------------------------- --------
EMPLOYEES_REG_P ZONE_3 'R17', 'R18', 'R19', 'R2' 2
EMPLOYEES_REG_P ZONE_1 'R1', 'R10', 'R11', 'R12' 3
EMPLOYEES_REG_P ZONE_2 'R13', 'R14', 'R15', 'R16' 1
EMPLOYEES_REG_P ZONE_4 'R20', 'R21', 'R23', 'R22' 4
EMPLOYEES_REG_P ZONE_5 'R24', 'R25', 'R26', 'R27' 5
EMPLOYEES_REG_P ZONE_6 'R28', 'R29', 'R3', 'R30' 6
EMPLOYEES_REG_P ZONE_MERGE 'R32', 'R31', 'R4', 'R5' 7
EMPLOYEES_REG_P ZONE_8 'R6', 'R7', 'R8', 'R9' 8

8 rows selected.

The partitioning key values load on the second partition is the result of
the subtraction of the first new values list from the original values list.

Example 1.7 ( TRUNCATE a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> CREATE TABLE exchange_zone_3 as select * from employees_reg_p
where 1 = 2;

SQL> INSERT INTO exchange_zone_3 SELECT * FROM employees_reg_p PARTITION
2 (ZONE_3);

48 rows created.

SQL> ALTER TABLE employees_reg_p TRUNCATE PARTITION ZONE_3 DROP STORAGE;

Table truncated.


Example 1.8 ( EXCHANGE a List Partition )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> ALTER TABLE employees_reg_p EXCHANGE PARTITION ZONE_3
2 WITH TABLE exchange_zone_3
3 WITHOUT VALIDATION;

Table altered.

Example 1.9 (MOVE a List Partition)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> ALTER TABLE employees_reg_p MOVE PARTITION ZONE_3
TABLESPACE users;

TABLE_NAME PARTITION_NAME TABLESPACE_NAME PARTITION_POSITION
--------------- -------------------- ---------------- ------------------
EMPLOYEES_REG_P ZONE_2 EXAMPLE 1
EMPLOYEES_REG_P ZONE_3 USERS 2
EMPLOYEES_REG_P ZONE_1 EXAMPLE 3
EMPLOYEES_REG_P ZONE_4 EXAMPLE 4
EMPLOYEES_REG_P ZONE_5 EXAMPLE 5
EMPLOYEES_REG_P ZONE_6 EXAMPLE 6
EMPLOYEES_REG_P ZONE_MERGE EXAMPLE 7
EMPLOYEES_REG_P ZONE_8 EXAMPLE 8

8 rows selected.

Example 1.10 (MODIFY DEFAULT ATTRIBUTES)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

It modifies only the clauses which are inherited from the table or tablespace
level, for example, the PCTFREE clause which is set at 60.

SQL> select TABLE_NAME, PARTITIONING_TYPE, DEF_PCT_FREE from user_part_tables
where table_name = 'EMPLOYEES_REG_P';

TABLE_NAME PARTITIONING_TYPE DEF_PCT_FREE
--------------- -------------------- ------------
EMPLOYEES_REG_P LIST 60

SQL> alter table EMPLOYEES_REG_P MODIFY DEFAULT ATTRIBUTES PCTFREE 40;

Table altered.

TABLE_NAME PARTITIONING_TYPE DEF_PCT_FREE
--------------- -------------------- ------------
EMPLOYEES_REG_P LIST 40

Example 1.11 (MODIFY REAL ATTRIBUTES OF LIST PARTITION)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

It modifies really the current parameters associated with
a specified partition table.

SQL> select table_name, partition_name, pct_free from user_tab_partitions
2 where table_name = 'EMPLOYEES_REG_P' and partition_name = 'ZONE_3';

TABLE_NAME PARTITION_NAME PCT_FREE
--------------- -------------------- ----------
EMPLOYEES_REG_P ZONE_3 10

SQL> alter table EMPLOYEES_REG_P modify partition zone_3 pctfree 20;

Table altered.

SQL> select table_name, partition_name, pct_free from user_tab_partitions
2 where table_name = 'EMPLOYEES_REG_P' and partition_name = 'ZONE_3';

TABLE_NAME PARTITION_NAME PCT_FREE
--------------- -------------------- ----------
EMPLOYEES_REG_P ZONE_3 20



II. List Partition Pruning ( Partition Elimination )
=====================================================

There are three pruning types supported for LIST partitioned tables:

1. EQUALITY ( col1='AB' )
2. IN-LIST ( col1 IN ('AB','AC') )
3. RANGE ( col1 <= 'AB' )


2.0 List Partition Pruning - Examples
======================================

The partitioned table must be analyzed for validation of Pruning

SQL> analyze table EMPLOYEES_REG_P compute statistics;

Table analyzed.


Example 2.1 ( FULL SCAN )
~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> SELECT region from employees_reg_p;


------------------------------------------------------------------------------------------
| Operation | Name | Rows | Bytes| Cost | Pstart| Pstop |
------------------------------------------------------------------------------------------
| SELECT STATEMENT | | 808 | 16K| 4 | | |
| PARTITION LIST ALL | | | | | 1 | 8 |
| TABLE ACCESS FULL |EMPLOYEES_REG_P | 808 | 16K| 4 | 1 | 8 |
------------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
0 recursive calls
16 db block gets
77 consistent gets
0 physical reads
0 redo size
34270 bytes sent via SQL*Net to client
7446 bytes received via SQL*Net from client
55 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
808 rows processed

Note: Notice the logical reads (db block gets + consistent gets). these
numbers will help determine if partition pruning is taking place.
Compare the FULL baseline scan of the entire partition table above
to the partition pruning examples below.


Example 2.2 ( EQUALITY )
~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> SELECT region, employee_id, last_name FROM employees_reg_p
2 WHERE region = 'R13';


------------------------------------------------------------------------------------------
| Operation | Name | Rows | Bytes| Cost | Pstart| Pstop |
------------------------------------------------------------------------------------------
| SELECT STATEMENT | | 101 | 505 | 1 | | |
| TABLE ACCESS FULL |EMPLOYEES_REG_P | 101 | 505 | 1 | 1 | 1 |
------------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
7 recursive calls
2 db block gets
12 consistent gets
0 physical reads
0 redo size
4435 bytes sent via SQL*Net to client
1289 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
101 rows processed


Example 2.3 ( IN-LIST )
~~~~~~~~~~~~~~~~~~~~~~~~

SQL> SELECT region, employee_id, last_name FROM employees_reg_p
2 WHERE region IN ('R18', 'R25');


------------------------------------------------------------------------------------------
| Operation | Name | Rows | Bytes| Cost | Pstart| Pstop |
------------------------------------------------------------------------------------------
| SELECT STATEMENT | | 2 | 42 | 1 | | |
| PARTITION LIST INLIST | | | | |KEY(I) |KEY(I) |
| TABLE ACCESS FULL |EMPLOYEES_REG_P | 2 | 42 | 1 |KEY(I) |KEY(I) |
------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
7 recursive calls
4 db block gets
7 consistent gets
0 physical reads
0 redo size
338 bytes sent via SQL*Net to client
372 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
0 rows processed


Example 2.4 ( RANGE )
~~~~~~~~~~~~~~~~~~~~~~

SQL> SELECT region, employee_id, last_name FROM employees_reg_p
2 WHERE region >= 'R31';

------------------------------------------------------------------------------------------
| Operation | Name | Rows | Bytes| Cost | Pstart| Pstop |
------------------------------------------------------------------------------------------
| SELECT STATEMENT | | 555 | 11K| 2 | | |
| PARTITION LIST ITERATOR | | | | | | |
| TABLE ACCESS FULL |EMPLOYEES_REG_P | 555 | 11K| 2 | | |
------------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
7 recursive calls
4 db block gets
21 consistent gets
0 physical reads
0 redo size
8521 bytes sent via SQL*Net to client
2206 bytes received via SQL*Net from client
15 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
202 rows processed


Example 2.5 (INVALID)
~~~~~~~~~~~~~~~~~~~~~

SQL> select * from EMPLOYEES_REG_P where region < 'R1';

------------------------------------------------------------------------------------------
| Operation | Name | Rows | Bytes| Cost | Pstart| Pstop |
------------------------------------------------------------------------------------------
| SELECT STATEMENT | | 101 | 2K| 1 | | |
| PARTITION LIST EMPTY | | | | |INVALID|INVALID|
| TABLE ACCESS FULL |EMPLOYEES_REG_P | 101 | 2K| 1 |INVALID|INVALID|
------------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
7 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
855 bytes sent via SQL*Net to client
372 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/38542/viewspace-926390/,如需轉載,請註明出處,否則將追究法律責任。

相關文章