En esta página, se describe cómo realizar lecturas en Spanner fuera del contexto de transacciones de solo lectura y de lectura y escritura. Esto significa que, si se aplica alguna de las siguientes opciones, deberías leer la página sobre transacciones en su lugar:
Si necesitas escribir, en función del valor de una o más lecturas, debes ejecutar la lectura como parte de una transacción de lectura y escritura. Obtén más información sobre las transacciones de lectura y escritura.
Si realizas varias llamadas de lectura que requieren una vista coherente de tus datos, debes ejecutar las lecturas como parte de una transacción de solo lectura. Obtén más información sobre las transacciones de solo lectura.
Si necesitas realizar una sola llamada de lectura o leer datos en paralelo, y no necesitas escribir, sigue leyendo.
Tipos de lecturas
Spanner te permite determinar qué tan actuales deberían estar los datos cuando los lees. Para ello, ofrece dos tipos de lecturas:
- Una lectura sólida es una lectura en una marca de tiempo actual y se garantiza que se ven todos los datos que se hayan confirmado hasta el inicio de esta lectura. Spanner usa lecturas sólidas de forma predeterminada para entregar solicitudes de lectura.
- Una lectura inactiva se lee en una marca de tiempo anterior. Si tu aplicación es sensible a la latencia, pero tolera los datos obsoletos, las lecturas inactivas pueden proporcionar beneficios de rendimiento.
Para elegir qué tipo de lectura quieres, configura un límite de marca de tiempo en la solicitud de lectura. Usa las siguientes prácticas recomendadas cuando elijas un límite de marca de tiempo:
Elige lecturas sólidas siempre que sea posible. Estos son los límites de marca de tiempo predeterminados para las lecturas de Spanner, incluidas las transacciones de solo lectura. Se garantiza que las lecturas sólidas observan los efectos de todas las transacciones que se confirmaron antes del inicio de la operación, sin importar de qué réplica reciba la lectura. Debido a esto, las lecturas sólidas hacen que el código de la aplicación sea más simple y que las aplicaciones sean más confiables. Obtén más información sobre las propiedades de coherencia de Spanner en TrueTime y External Consistency.
Si la latencia vuelve inviables las lecturas sólidas en algunas situaciones, usa lecturas inactivas (de inactividad limitada o exacta) para mejorar el rendimiento en lugares donde no necesitas que las lecturas sean lo más recientes posible. Como se describe en la sección Solo lectura de Replicación, 15 segundos es un valor de inactividad razonable para obtener un buen rendimiento.
Lee datos con una función de base de datos
Si eres un usuario de control de acceso detallado, debes seleccionar un rol de base de datos para ejecutar consultas y instrucciones de SQL, y realizar operaciones de fila en una base de datos. La selección de la función se mantiene durante toda la sesión hasta que la cambies.
Para obtener instrucciones sobre cómo realizar una lectura con una función de base de datos, consulta Accede a una base de datos con control de acceso detallado.
Métodos de lectura única
Spanner admite métodos de lectura única (es decir, una lectura fuera del contexto de una transacción) en una base de datos para realizar las siguientes acciones:
- Ejecutar la lectura como una instrucción de consulta en SQL o usar la API de lectura de Spanner
- Realizar una lectura sólida desde una o varias filas de una tabla
- Realizar una lectura inactiva desde una o varias filas en una tabla
- Leer desde una o varias filas en un índice secundario
En las siguientes secciones, se describe cómo usar los métodos de lectura mediante las bibliotecas cliente de Cloud de la API de Cloud Spanner.
Ejecutar una consulta
A continuación, se muestra cómo ejecutar una instrucción de consulta de SQL en una base de datos.
GoogleSQL
C++
Usa ExecuteQuery()
para ejecutar una instrucción de consulta en SQL en una base de datos.
C#
Usa ExecuteReaderAsync()
para consultar la base de datos.
Go
Usa Client.Single().Query
para consultar la base de datos.
Java
Usa ReadContext.executeQuery
para consultar la base de datos.
Node.js
Usa Database.run
para consultar la base de datos.
PHP
Usa Database::execute
para consultar la base de datos.
Python
Usa Database.execute_sql
para consultar la base de datos.
Ruby
Usa Client#execute
para consultar la base de datos.
Consulta Expresiones, funciones y operadores y la página sobre la sintaxis de consulta de SQL cuando crees una instrucción de SQL.
Realizar una lectura sólida
A continuación, se muestra cómo realizar una lectura sólida de cero o más filas en una base de datos.
GoogleSQL
C++
El código de lectura de datos es el mismo que el ejemplo anterior para consultar Spanner mediante la ejecución de una consulta de SQL.
C#
El código de lectura de datos es el mismo que el ejemplo anterior para consultar Spanner mediante la ejecución de una consulta de SQL.
Go
Usa Client.Single().Read
para leer filas de la base de datos.
En el ejemplo, se usa AllKeys
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
Java
Usa ReadContext.read
para leer filas de la base de datos.
En el ejemplo, se usa KeySet
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
Node.js
Usa Table.read
para leer filas de la base de datos.
En el ejemplo, se usa keySet
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
PHP
Usa Database::read
para leer filas de la base de datos.
En el ejemplo, se usa keySet
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
Python
Usa Database.read
para leer filas de la base de datos.
En el ejemplo, se usa KeySet
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
Ruby
Usa Client#read
para leer filas de la base de datos.
Realizar una lectura inactiva
En el siguiente ejemplo de código, se muestra cómo realizar una lectura inactiva de cero o más filas de una base de datos mediante un límite de marca de tiempo de inactividad exacta. Si quieres obtener instrucciones para realizar una lectura inactiva mediante un límite de marca de tiempo de inactividad limitada, consulta la nota que se encuentra después del código de muestra. Consulta la página sobre límites de marca de tiempo para obtener más información sobre los distintos tipos de límites de marca de tiempo disponibles.
GoogleSQL
C++
Usa ExecuteQuery()
con MakeReadOnlyTransaction()
y Transaction::ReadOnlyOptions()
para realizar una lectura inactiva.
C#
Usa el método BeginReadOnlyTransactionAsync
en una connection
con un valor especificado TimestampBound.OfExactStaleness()
para consultar la base de datos.
Go
Usa Client.ReadOnlyTransaction().WithTimestampBound()
y especifica un valor ExactStaleness
para realizar una lectura de las filas de la base de datos mediante un límite de marca de tiempo de inactividad exacta.
En el ejemplo, se usa AllKeys
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
Java
Usa el método read
de un ReadContext
que tenga un TimestampBound.ofExactStaleness()
especificado para realizar una lectura de las filas de la base de datos mediante un límite de marca de tiempo de inactividad exacta.
En el ejemplo, se usa KeySet
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
Node.js
Usa Table.read
con la opción exactStaleness
para realizar una lectura de las filas de la base de datos con un límite de marca de tiempo de inactividad exacta.
En el ejemplo, se usa keySet
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
PHP
Usa Database::read
con un valor exactStaleness
especificado para realizar una lectura de las filas de la base de datos mediante un límite de marca de tiempo de inactividad exacta.
En el ejemplo, se usa keySet
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
Python
Usa el método read
de la snapshot
de una Database
que tenga un valor exact_staleness
especificado para realizar una lectura de las filas de la base de datos mediante un límite de marca de tiempo de inactividad exacta.
En el ejemplo, se usa KeySet
para definir una colección de claves o rangos de claves a fin de realizar lecturas.
Ruby
Usa el método read
del Client
de una instantánea que tenga un valor staleness
especificado (en segundos) para leer filas de la base de datos mediante un límite de marca de tiempo de inactividad exacta.
Realizar una lectura mediante un índice
A continuación, se muestra cómo leer cero o más filas de una base de datos mediante un índice.
GoogleSQL
C++
Usa la función Read()
para realizar una lectura mediante un índice.
C#
Lee los datos mediante el índice mediante la ejecución de una consulta que especifique el índice de forma explícita:
Go
Usa Client.Single().ReadUsingIndex
para leer filas de la base de datos mediante un índice.
Java
Usa ReadContext.readUsingIndex
para leer filas de la base de datos mediante un índice.
Node.js
Usa Table.read
y especifica el índice en la consulta para leer filas de la base de datos mediante un índice.
PHP
Usa Database::read
y especifica el índice para leer filas de la base de datos mediante un índice.
Python
Usa Database.read
y especifica el índice para leer filas de la base de datos mediante un índice.
Ruby
Usa Client#read
y especifica el índice para leer filas de la base de datos mediante un índice.
Leer datos en paralelo
Cuando realizas operaciones de lectura o consulta masivas que involucran cantidades muy grandes de datos de Spanner, puedes usar la API de PartitionQuery para obtener resultados más rápidos. La API divide la consulta en partes más pequeñas, o particiones, con varias máquinas para recuperar las particiones en paralelo. Ten en cuenta que el uso de la API de PartitionQuery tendrá una latencia más alta, ya que solo está destinado a operaciones masivas, como la exportación o el análisis de toda la base de datos.
Puedes realizar cualquier operación de la API de lectura en paralelo mediante las bibliotecas cliente de Spanner. Sin embargo, solo puedes particionar las consultas de SQL en las que el primer operador del plan de ejecución de consultas sea una unión distribuida. Para ver el plan de ejecución de consultas de una consulta de SQL en particular, sigue las instrucciones de la página de prácticas recomendadas de SQL.
Una vez que tengas el plan de ejecución de consultas, asegúrate de que el primer operador que contenga sea una unión distribuida.
GoogleSQL
C++
En este ejemplo, se recuperan particiones de una consulta en SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crear una transacción por lotes de Spanner
- Genera particiones para la consulta, de modo que las particiones se puedan distribuir a varios trabajadores.
- Recupera los resultados de la consulta en cada partición.
C#
En este ejemplo, se recuperan particiones de una consulta en SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crear una transacción por lotes de Spanner
- Genera particiones para la consulta, de modo que las particiones se puedan distribuir a varios trabajadores.
- Recupera los resultados de la consulta en cada partición.
Go
En este ejemplo, se recuperan particiones de una consulta en SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crear un cliente y una transacción de Spanner
- Genera particiones para la consulta, de modo que las particiones se puedan distribuir a varios trabajadores.
- Recupera los resultados de la consulta en cada partición.
Java
En este ejemplo, se recuperan particiones de una consulta en SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crear un cliente por lotes y una transacción de Spanner
- Genera particiones para la consulta, de modo que las particiones se puedan distribuir a varios trabajadores.
- Recupera los resultados de la consulta en cada partición.
Node.js
En este ejemplo, se recuperan particiones de una consulta en SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crear un cliente de Spanner y un lote
- Genera particiones para la consulta, de modo que las particiones se puedan distribuir a varios trabajadores.
- Recupera los resultados de la consulta en cada partición.
PHP
En este ejemplo, se recuperan particiones de una consulta en SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crear un cliente de Spanner y un lote
- Genera particiones para la consulta, de modo que las particiones se puedan distribuir a varios trabajadores.
- Recupera los resultados de la consulta en cada partición.
Python
En este ejemplo, se recuperan particiones de una consulta en SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crear un cliente de Spanner y una transacción por lotes
- Genera particiones para la consulta, de modo que las particiones se puedan distribuir a varios trabajadores.
- Recupera los resultados de la consulta en cada partición.
Ruby
En este ejemplo, se recuperan particiones de una consulta en SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crear un cliente por lotes de Spanner
- Crea particiones para la consulta, de modo que las particiones se puedan distribuir a varios trabajadores
- Recupera los resultados de la consulta en cada partición.