2011-09-22 17 views
7

Estoy trabajando en algunos problemas de rendimiento de Oracle con nuestra aplicación web. Una cosa que he notado que parece ofuscar cualquier tipo de pruebas es que las consultas simples que arrojan muchos resultados siguen siendo muy lentas. Un ejemplo es:Oracle: ¿Por qué SELECT * FROM Foo; ¿muy lento?

select * from TPM_PROJECTWORKGROUPS; 

Cuando corro, me sale:

5825 record(s) selected [Fetch MetaData: 0ms] [Fetch Data: 59s] 

[Executed: 9/22/2011 1:52:38 PM] [Execution: 203ms] 

Si entiendo esto correctamente, significa que la consulta real tomó 203ms para funcionar pero tomó 59 segundos para que los datos de ser devuelto al cliente, ¿eso es "Fetch" significa en este caso?

No tengo acceso para conectarme a la máquina de la base de datos directamente y ejecutar la consulta localmente, pero ¿es seguro asumir que el culpable es el ancho de banda de red real? Esto tiene sentido ya que estoy en Seattle y el servidor está en Nueva York, pero aún un minuto para 5800 filas parece ser bastante lento.

¿Hay algún consejo rápido para a) confirmar que el ancho de banda de la red es realmente el problema yb) cualquier "error" o cosas para verificar por qué serializar los datos a través del cable es tan lento? ¡Gracias!

algunas actualizaciones Basándose en los comentarios:

SELECT COUNT (*) de (seleccionar * de TPM_PROJECTWORKGROUPS) t;

Resultados:

1 record(s) selected [Fetch MetaData: 0ms] [Fetch Data: 0ms] 

[Executed: 9/22/2011 2:16:08 PM] [Execution: 219ms] 

Y si trato de seleccionar una sola columna:

SELECT projectId DE TPM_PROJECTWORKGROUPS;

Resultados:

5825 registro (s) seleccionado [Fetch metadatos: 0 ms] [Recuperar datos: 0s 1m]

[Ejecutado: 9/22/2011 02:17:20 PM] [Ejecución: 203ms] esquema

Tabla:

projectId (NÚMERO) WORKGROUPID (NÚMERO)

+0

¿Estás seguro de que TPM_PROJECTWORKGROUPS es una tabla y no una vista? – MusiGenesis

+0

¿Cuál es el tamaño de una fila? Cualquier CLOB/BLOB? – muratgu

+2

Pruebe 'SELECT COUNT (*) FROM (seleccione * de TPM_PROJECTWORKGROUPS) t;' y vea si hay una gran diferencia –

Respuesta

6

¿Qué API está utilizando para interactuar con la base de datos (SQL * Plus, JDBC, ODBC, etc.)? Cualquier API tendrá alguna función que especifique cuántas filas (o cuántos datos) se deben buscar en una sola red de ida y vuelta. Por ejemplo, en SQL * Plus, es set arraysize N. En JDBC, es setFetchSize. Otras API tendrán funciones similares. Si está en una WAN, generalmente quiere minimizar la cantidad de conversaciones de su aplicación al aumentar la cantidad de filas que se obtienen con cada viaje de ida y vuelta de la red.

En la misma línea, probablemente se beneficie al mover menos datos a través de la red y llevar más lógica al servidor. ¿Realmente muestra una cuadrícula con 5800 filas de datos para el usuario? ¿O busca esos datos y luego realiza algún procesamiento en la aplicación (es decir, ordena los datos y muestra las primeras 100 filas)? Si puede enviar ese procesamiento a la base de datos y reducir la cantidad de datos que debe transmitirse a través de la base de datos, estará mucho mejor.

Oracle tiene opciones para configurar la SDU y la TDU, así como algunos otros parámetros de red en SQL * Net. Sin embargo, no empezaría a buscar esas opciones hasta que haya optimizado el tamaño de búsqueda y se haya asegurado de que está recuperando la menor cantidad posible de datos.

+0

En este momento, estoy ejecutando esto con Aqua Data Studio, que usa JDBC. Definitivamente soy cuidadoso de obtener más datos de los que necesito; en este caso particular, estoy trabajando para informar que realmente/necesito/necesito mostrar muchos datos. Algunos de estos informes tardan varios minutos en compilarse, ¡pero las consultas parecen ejecutarse en medio segundo! Es increíble para mí que todo el tiempo vaya a enviar los datos a través del cable. –

+0

también, puedo ejecutar estas consultas en SQLPlus, sin embargo, no parece informar cuánto tiempo tardan la búsqueda y la recuperación. ¿Hay una opción para habilitar esto? –

+0

¡Vaya!: Lo encontré: SET TIMING ON; –

1

Al tratar con una aplicación web, recuperar algo rápido es importante. Investigue la sugerencia FIRST_ROWS. Eso puede ser valioso para tu situación.

+0

¡Función interesante, gracias! –

1

Seleccionar unos pocos miles de filas de una tabla no debería tomar casi un minuto. Supongo que tienes un problema de rendimiento en otro lugar de tu sistema. Podría ser otra actividad en la base de datos o problemas con el servidor/red/almacenamiento. ¿El rendimiento con otras consultas en su BD es similarmente lento?

0

Por favor, compruebe la fragmentación de la tabla. Por lo general, la Fragmentación de la tabla causa más E/S y la consulta se ralentiza. puede verificarlo utilizando el asesor de segmentos Oracle y para resolverlo hay dos maneras de usar el comando oracle shrink table: es reducir la velocidad y también bloquear la tabla, segundo usando el comando oracle move table, este es demasiado rápido especialmente si se usa la opción de Oracle parallel . el único punto acerca de la tabla de movimientos es que los índices no utilizados.