¿Cómo debo gama de particiones de un índice con una columna VARCHAR2 en Oracle? ¿Es una mala idea?

StackOverflow https://stackoverflow.com/questions/1283228

  •  16-09-2019
  •  | 
  •  

Pregunta

Estoy utilizando Oracle 10g edición Enterprise.

Una tabla en nuestra base de datos Oracle almacena la representación de valores soundex de otra columna de texto. Estamos utilizando una aplicación soundex personalizada en la que los valores soundex son más largas que son generados por algoritmos soundex tradicionales (como el que se utiliza Oracle). Eso es realmente fuera de lugar.

Básicamente I tienen una columna varchar2 que tiene valores que contienen un solo carácter seguido de un número dinámico de valores numéricos (por ejemplo 'A12345', 'S382771', etc). La tabla se divide por la otra columna, pero me gustaría añadir un índice con particiones a la columna de soundex ya que a menudo se buscó. Cuando se trata de añadir un índice con particiones gama utilizando el primer carácter de la columna de soundex funcionó muy bien:

create index IDX_NAMES_SOUNDEX on NAMES_SOUNDEX (soundex)
global partition by range (soundex) (
    partition IDX_NAMES_SOUNDEX_PART_A values less than ('B'),  -- 'A%'
    partition IDX_NAMES_SOUNDEX_PART_B values less than ('C'),  -- 'B%'
    ...
);

Sin embargo, con el fin de distribuir de manera más uniforme el tamaño de las particiones, quiero definir algunas particiones por los dos primeros caracteres, así:

create index IDX_NAMES_SOUNDEX on NAMES_SOUNDEX (soundex)
global partition by range (soundex) (
    partition IDX_NAMES_SOUNDEX_PART_A5 values less than ('A5'), -- 'A0% - A4%'
    partition IDX_NAMES_SOUNDEX_PART_A values less than ('B'),   -- 'A4% - A9%'
    partition IDX_NAMES_SOUNDEX_PART_B values less than ('C'),   -- 'B%'
    ...
);

No estoy seguro de cómo cubre adecuadamente partición utilizando columnas VARCHAR2. Estoy seguro de que esta es una opción ideal menos, por lo que tal vez alguien puede recomendar una solución mejor. Aquí hay una distribución de los datos soundex en mi mesa:

-----------------------------------
|  SUBSTR(SOUNDEX,1,1)  |  COUNT  |
-----------------------------------
|                    A  | 6476349 |
|                    B  |  854880 |
|                    D  |  520676 |
|                    F  | 1200045 |
|                    G  |  280647 |
|                    H  | 3048637 |
|                    J  |  711031 |
|                    K  | 1336522 |
|                    L  |  348743 |
|                    M  | 3259464 |
|                    N  | 1510070 |
|                    Q  |  276769 |
|                    R  | 1263008 |
|                    S  | 3396223 |
|                    V  |  533844 |
|                    W  |  555007 |
|                    Y  |  348504 |
|                    Z  | 1079179 |
-----------------------------------

Como se puede ver, la distribución no es uniforme, por lo que quiero definir particiones rango usando los dos primeros caracteres en lugar de sólo el primer carácter.

Sugerencias?

Gracias!

¿Fue útil?

Solución

¿Cuál es exactamente su pregunta?

¿No sabe cómo se puede dividir la tabla en n partes iguales para evitar la inclinación?

Puede hacer eso con PERCENTILE_DISC función analítica ().

A continuación, un ejemplo de SQL PLUS con n = 100, que admitir que no es muy sofisticado pero va a hacer el trabajo.

set pages 0
set lines 200

drop table random_strings;

create table random_strings 
as 
select upper(dbms_random.string('A', 12)) rndmstr
from dual 
connect by level < 1000;


spool parts

select 'select '||level||'/100,percentile_disc('||level||
       '/100) within group (order by RNDMSTR) from random_strings;' 
       sql_statement
from dual 
connect by level <= 100
/

spool off

Esta es la salida de parts.lst archivo:

select 1/100,percentile_disc(1/100) within group (order by RNDMSTR) from random_strings;                                                                                                                
select 2/100,percentile_disc(2/100) within group (order by RNDMSTR) from random_strings;                                                                                                                
select 3/100,percentile_disc(3/100) within group (order by RNDMSTR) from random_strings;                                                 
...
select 100/100,percentile_disc(100/100) within group (order by RNDMSTR) from random_strings;                                                 

Ahora se puede ejecutar parts.lst script para obtener los valores de partición. Cada partición contendrá 1% de los datos inicialmente.

Script parts.lst seria:

   ,01 AJUDRRSPGMNP
   ,02 AOMJZQPZASQZ
   ,03 AWDQXVGLLUSJ
   ,04 BIEPUHAEMELR
   .... 
   ,99 ZTMHDWTXUJAR
   1   ZYVJLNATVLOY

Otros consejos

es la tabla está siendo buscado por la clave de partición, además del valor SOUNDEX? ¿O es que se busca simplemente por la columna de SOUNDEX?

Si usted está tratando de lograr una distribución uniforme de los datos entre las particiones, se ha considerado el uso de particiones hash en lugar de particiones alcance? Suponiendo que elija una potencia de 2 para el número de particiones, que debe darle una distribución bastante uniforme de datos entre particiones.

Háblame!  ¿Me puede decir lo que su razón es para dividir esta tabla? Suena como que es una tabla OLTP y puede no necesita ser partición. No queremos particionar sólo para decir que estamos con particiones. Dime lo que está tratando de lograr mediante la partición de esta tabla y puedo ayudarle a escoger un esquema de partición correcta. Particionamiento no es igual a las consultas más rápidas. En realidad, puede causar que sus consultas sean más lenta en algunos casos.

Veo algunos de sus pensamientos adicionales por encima y yo no creo que se necesita para crear particiones en la tabla. Si sus consultas van a estar haciendo agregados en particiones enteras entonces usted puede desear particionar. Si usted va a tener cientos de millones de filas de datos que puede desear particionar para ayudar con el mantenimiento de DBA. Si lo que desea le consultas a correr rápido, entonces el índice de clave principal será suficiente. Por favor, hágamelo saber

Hay que crear un índice global de sus columnas deseadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top