En esta página, se describe cómo realizar lecturas en Cloud Spanner cuando no se trata 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
Cloud Spanner te permite determinar qué tan actuales deben ser los datos para leerlos. Para esto, 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. Cloud 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.
Elegir los límites de la marca de tiempo
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. Son el límite predeterminado de marca de tiempo de las lecturas de Cloud 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 Cloud Spanner en la página sobre TrueTime y la coherencia externa.
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.
Métodos de lectura única
Cloud 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 de SQL o usar la API de lectura de Cloud 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.
C++
Usa ExecuteQuery()
para ejecutar una instrucción de consulta de 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.
C++
El código de lectura de datos es el mismo que el ejemplo anterior para consultar Cloud 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 Cloud 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.
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.
C++
Usa la función Read()
para realizar una lectura mediante un índice.
C#
Para leer los datos mediante el índice, ejecuta 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 lees o consultas grandes cantidades de datos de Cloud Spanner, puede ser útil dividir la consulta en partes más pequeñas, o particiones, y usar varias máquinas para recuperar las particiones en paralelo.
Puedes realizar cualquier operación de la API de lectura en paralelo mediante las bibliotecas cliente de Cloud Spanner. Sin embargo, solo puedes particionar las consultas de SQL en las que el primer operador en el 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 contiene sea una unión distribuida.
C++
En este ejemplo, se recuperan las particiones de una consulta de SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crea una transacción por lotes de Cloud 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 las particiones de una consulta de SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crea una transacción por lotes de Cloud 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 las particiones de una consulta de SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crea un cliente y una transacción de Cloud 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 las particiones de una consulta de SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crea un cliente por lotes y una transacción de Cloud 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 muestra cómo recuperar las particiones de una consulta de SQL de la tabla Singers
y, luego, ejecutar la consulta en cada partición.
Esta parte del código genera particiones:
Luego, esta parte del código ejecuta la consulta en cada partición:
PHP
En este ejemplo, se recuperan las particiones de una consulta de SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crea un cliente y un lote de Cloud 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.
Python
En este ejemplo, se recuperan las particiones de una consulta de SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crea un cliente y una transacción por lotes de Cloud 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.
Ruby
En este ejemplo, se recuperan las particiones de una consulta de SQL de la tabla Singers
y se ejecuta la consulta en cada partición mediante los siguientes pasos:
- Crea un cliente por lotes de Cloud 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.