Todos los productos
Search
Centro de documentos

Data Management:Configurar un algoritmo de enrutamiento

Última actualización: Sep 03, 2026

Un algoritmo de enrutamiento permite que una consulta con el campo de enrutamiento de una tabla lógica localice directamente el fragmento de tabla destino, sin necesidad de calcular la ruta manualmente. Este tema describe el formato de expresión, el procedimiento de configuración, ejemplos de expresiones de enrutamiento y las funciones integradas disponibles para su uso en una expresión.

Por qué usar un algoritmo de enrutamiento

Un algoritmo de enrutamiento reduce la sobrecarga de enrutamiento. Al configurar este algoritmo para una tabla lógica, cualquier consulta que incluya el campo de enrutamiento localiza rápidamente el fragmento de tabla especificado. Esto elimina la necesidad de calcular rutas manualmente o alternar entre bases de datos y tablas físicas.

Para obtener más información sobre los algoritmos de enrutamiento, consulte routing algorithm.

Casos de uso

  • Consultar datos de fragmentos de tabla específicos.

  • Modificar datos en fragmentos de tabla específicos.

  • Exportar datos de fragmentos de tabla específicos.

Requisitos previos

  • Configure una tabla lógica en una base de datos lógica. Para obtener instrucciones, consulte logical table.

Configurar un algoritmo de enrutamiento de módulo simple

El siguiente procedimiento configura un algoritmo de enrutamiento mediante una operación de módulo simple. Antes de seleccionar una operación de módulo, tenga en cuenta los tipos de campo que admite cada una:

  • Simple Modulo Operation: solo admite campos de tipo numérico.

  • Modular hashing: admite campos de tipo numérico o de cadena.

  1. Vaya a la página Global Search y haga clic en Query, situado a la derecha de la base de datos lógica deseada, para abrir la página SQL Console.

    Nota

    También puede elegir SQL Console > SQL Console en la barra de menú superior.

  2. En la esquina superior derecha de la página, haga clic en el icono Icon that opens the table list para ir a la página de lista de tablas.

  3. En la fila correspondiente a la tabla lógica deseada, haga clic en Configure Algorithm.

  4. En la página de lista de algoritmos, haga clic en Create.

  5. Configure Algorithm Type, Modulo Operation, Table Partitioning Field y Modulus.

    En este ejemplo, establezca Algorithm Type en Modulo Operation on One Column, Modulo Operation en Simple Modulo Operation, Table Partitioning Field en id y Modulus en 4. La expresión resultante es #id#%4.

  6. Haga clic en Save.

  7. Consulte los datos de la tabla o ejecute sentencias INSERT en la tabla lógica para comprobar el resultado del enrutamiento. El sistema calcula dicho resultado e inserta los datos en el fragmento de tabla con el índice correspondiente.

    Por ejemplo, si inserta una fila de datos con un ID de 9, el resultado calculado del enrutamiento es 1 y los datos se insertan en el fragmento de tabla logic_table_01.

Formato de expresión

El algoritmo de enrutamiento de fragmentación de tablas en DMS se define mediante una expresión Groovy, similar a los algoritmos de enrutamiento configurados en el código de la aplicación. Una expresión hace referencia a un campo de enrutamiento con el formato # + campo de enrutamiento + #; por ejemplo, #shardKey#. El campo de enrutamiento es el campo seleccionado como Table Partitioning Field.

Ejemplos de expresiones de enrutamiento

En las siguientes expresiones, user_id es un campo de tabla de ejemplo. Los ejemplos se agrupan según lo que determina la expresión: solo el fragmento de tabla, tanto el fragmento de base de datos como el de tabla, o un destino derivado de una fecha, de dígitos en una cadena o de una función personalizada.

  • Enrutamiento por regla de tabla

    • Operación de módulo simple

      • Módulo sobre números: #user_id#%100

      • Módulo encadenado: #user_id#%10000%100

      • Módulo sobre el hash de Java de un número: Math.abs(#user_id#.hashCode())%100

    • Hash modular sobre cadenas

      • Hash de una cadena numérica: Math.abs(#user_id#.toString().hashCode())%100

      • Hash de una cadena: Math.abs(#user_id#.hashCode())%100

      • CobarHash: Math.abs(cobarHash(#column#,start, end)).intdiv(8)

      • CobarOldHash: Math.abs(cobarOldHash(#column#, len)).intdiv(8)

  • Enrutamiento por regla de base de datos

    • Regla de mismo nombre de base de datos y tabla: 'schema_prefix_'+(#user_id#%10)+'.table_name'

    • Nombre de base de datos y nombre de tabla

      • 'schema_prefix_'+(#user_id#%100)+'.table_name_prefix_'+(#user_id#%1000)

      • Mismo conjunto de fragmentos de tabla en cada fragmento de base de datos: 'schema_prefix_'+lastSwapZero(String.valueOf((#user_id#%1024).intdiv(128)),4)+'.table_name_prefix_'+lastSwapZero(String.valueOf((#user_id#%128)),4)

      • Enrutar a un fragmento de base de datos dividiendo los dígitos 16 y 17 de la cadena entre 2, y enrutar a un fragmento de tabla usando los dígitos 16 y 17 de la cadena: 'schema_prefix_'+substring(#EXTEND_ID#,16,18).toLong().intdiv(2)+'.table_name_prefix_'+substring(#EXTEND_ID#,16,18)

  • Enrutamiento por fecha

    Enrutar a la misma tabla en el mismo día de cada mes: dayOfMonth(#time#)

  • Enrutamiento por el antepenúltimo dígito de una cadena

    El nombre de la tabla se incrementa en pasos de 10, por lo que el dígito extraído se multiplica por 10. Si el incremento es 1, no se requiere multiplicación: Integer.valueOf(substring(#ip_id#,-3,-2))*10

  • Otro enrutamiento complejo

    Uso de una función personalizada:

    String func(String arg){ return arg.hashCode()%10;}
    'table_name_'+func(#user_id#)+'_other_'+func(#user_id#)
    • Agregue un salto de línea entre la función y la expresión.

    • DMS admite el enrutamiento mediante la función CRC32(java.util.zip.CRC32).

Funciones integradas para expresiones de enrutamiento

Puede invocar las siguientes funciones integradas directamente en una expresión de enrutamiento.

  • cobarOldHash: algoritmo CobarHash heredado.

    public static long cobarOldHash(String s, int len) {
      long h = 0;
      int sLen = s.length();
      for (int i = 0; (i < len && i < sLen); i++) {
          h = (h << 5) - h + s.charAt(i);
      }
      return h;
    }
  • cobarHash: nuevo algoritmo cobarHash.

    public static long cobarHash(String s, int start, int end) {
      if (start < 0) {
          start = 0;
      }
      if (end > s.length()) {
          end = s.length();
      }
      long h = 0;
      for (int i = start; i < end; ++i) {
          h = (h << 5) - h + s.charAt(i);
      }
      return h;
    }
  • weekOfYear: devuelve la semana del año.

    public static int weekOfYear(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if(date != null) {
          return DateTimeUtils.getWeekOfYear(date);
      }
      return 0;
    }
  • dayOfYear: devuelve el día del año.

    public static int dayOfYear(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if(date != null) {
          return DateTimeUtils.getDayOfYear(date);
      }
      return 0;
    }
  • dayOfMonth: devuelve el día del mes.

    public static int dayOfMonth(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if (date != null) {
          return DateTimeUtils.getDayOfMonth(date);
      }
      return 0;
    }
  • dayOfWeek: devuelve el día de la semana.

    public static int dayOfWeek(String dateValue) {
      Date date = DateTimeUtils.getSomeDate(dateValue);
      if (date != null) {
          int dayOfWeek = DateTimeUtils.getDayOfWeek(date);
          if (dayOfWeek==1){
              dayOfWeek=7;
          }else {
              dayOfWeek=dayOfWeek-1;
          }
          return dayOfWeek;
      }
      return 0;
    }
  • substring: extrae una subcadena. Las posiciones inicial y final admiten valores negativos, que cuentan hacia atrás desde el final de la cadena.

    public static String substring(String value, int start, int end) {
      return StringUtils.substring(value, start, end);
    }
    public static String substring(String value, int start) {
      return StringUtils.substring(value, start);
    }
  • last4swap: devuelve los últimos cuatro caracteres de una cadena. Si la cadena tiene menos de cuatro caracteres, se rellena con ceros a la izquierda. Posteriormente, los últimos cuatro caracteres se intercambian por pares.

    public static String last4swap(String value) {
      if(value.length() < 4) {
          value = StringUtils.leftPad(value, 4, '0');
      }
      return StringUtils.substring(value, -2)+StringUtils.substring(value, -4, -2);
    }
  • lastSwapZero: devuelve una cadena con la longitud mínima especificada. Si la cadena es más corta que la longitud indicada, se rellena con ceros antes de los dígitos.

    public static String lastSwapZero(String value, int length) {
      if (value.length() < length) {
          return StringUtils.leftPad(value, length, '0');
      }
      return value;
    }