Sql 2005 MultiHilo o hyperthreading o Dual Core

27/07/2006 - 10:52 por GenioMaestro | Informe spam
Hola a todos:

Tengo una aplicación desarrollada en sql 2005 que entrará en produccion en
septiembre, espero, y tengo algunos problemas que me hacen dudar sobre la
configuracion de la maquina de produccion.

Es un sistema de calculo bursatil. La base de datos tiene ya unos 15 GB y
creciendo. La estructura interna es muy sencilla, tan solo tengo dos tablas
principales, una de cotizaciones con 8 campos y otra de calculos con 53
campos. Pero eso si, cada tabla tiene unos 25 Millones de registros.

El programa lo he desarrollado en el portatil, un centrino 1.6 con 1 Gb de
memoria y se mueve muy bien, usando el micro siempre por encima del 80% y
mucho tiempo al 100%, lo que veo normal porque estoy haciendo muchos
calculos matematicos y consultas bastante complejas.

El problema lo tengo al pasar a la maquina grande de desarrollo. Es un
Pentium4 3.2 con HT, un 630 o 640 con 2 Gb de memoria y 200 Gb de disco duro
Sata2 de 3 Gbs y NCQ. En esta maquina, el uso del procesador está cerca del
50% con un máximo del 55%. Parece como si no usara el HT. Y sin embargo, los
dos graficos se mueven en paralelo, cuando uno sube el otro baja y
viceversa.

En el portatil centrino no hay HT y supuse que al pasarlo a la maquina
grande, con un micro más potente, los tiempos mejorarían, pero no es así. He
probado a poner un Dual Core, que no es HT, pero me pasa lo mismo. Los
tiempos de calculo son exactamente los mismos, tanto en el portatil como en
el P4 con HT que con el Dual Core.

Alguna idea de lo que puede estar pasando???? Que maquina pongo en
produccion si todas las maquinas me tardan lo mismo????

Todas las maquinas tienen Windows XP Pro SP2, y la version demo de 6 meses
de Sql Server 2005 Enterprise.

Espero vuestras ideas y orientaciones.

Gracias.

Preguntas similare

Leer las respuestas

#11 GenioMaestro
28/07/2006 - 21:55 | Informe spam
Que descripcion necesitas??? No entiendo que quieres decir con uno o dos
niveles.

Y que parte del scrip de base de datos???


"Miguel Egea" escribió en el mensaje
news:
Mostrar la cita
#12 Miguel Egea
01/08/2006 - 09:06 | Informe spam
A ver si me explico

tu tiees un update que haces
update t
set campo= (subquery),
campo=(subquery)

y a esos campos les estás llamando maxnivelXX, necesitaría el scritp de las
tablas de origen, de la de destino y una descripción de que quieres
conseguir (el valor máximo de fecha de entrada para el cliente X o cosas de
este tipo). Mi objetivo es darte pistas de como reconstruir el query más
eficazmente..

Saludos
Miguel Egea

"GenioMaestro" wrote in message
news:epqM$%
Mostrar la cita
#13 GenioMaestro
01/08/2006 - 11:17 | Informe spam
Vale, te explico. Es un sistema de calculo bursatil. Por tanto tengo miles
de valores en cada mercado(Nasdaq, Nyse, ...).

Cada valor tiene, para cada dia, Apertura, Maximo, Minimo, Cierre y Volumen.
Cada valor tiene un historico distinto dependiendo de la antiguedad del
valor, con una media de 250 cotizaciones por año. La mayoría de los valores
tienen un historico de 5 a 10 años, o más, lo que da entre 1250 y 2500
registros por valor, o más.

Hay que calcular una serie de cosas para cada día de cotizacion de cada
valor. Por tanto tengo el mismo número de registros en la tabla de calculos
y todas las formulas están referidas a la fecha de calculo.

Lo que tienen que hacer las consultas que os pase es:

Localizar el segundo cierre más alto de los 2500 registros saltando los 600
primeros ordenados por fecha.

Localizar el segundo cierre más bajo de los 2500 registros saltando los 600
primeros ordenados por fecha.

Por tanto, explicando mi consulta en varios pasos, lo que hace es:

1 Localizar la fecha del registro 600: Cojo los 600 primeros registros
para ese valor cuya fecha sea menor o igual que la del calculo, los ordeno
por fecha y cojo la fecha del primero ordenado por fecha, que es la que me
interesa, el punto de salto.
(SELECT TOP 1 FECHA FROM
(SELECT TOP 600 FECHA FROM COTIZACIONES WITH (TABLOCKX) WHERE COD_VALOR
= @PASA_VALOR AND FECHA <= FECHA_CAL ORDER BY FECHA DESC) AS XX_TEMPO
ORDER BY FECHA ASC)

2 Cojo los 1900 registros que estan debajo de esa fecha de corte
(SELECT TOP 1900 CIERRE FROM COTIZACIONES WITH (TABLOCKX)
WHERE COD_VALOR = @PASA_VALOR AND FECHA < xxx_fecha_corte ORDER BY FECHA
DESC)

3 Cojo los dos cierres más altos, ordenando por cierre en descendente y
luego cojo el cierre más bajo de esos dos ordenando en ascendente, lo que me
da exactamente lo que necesito.
( select top 1 cierre from (SELECT TOP 2 cierre FROM (-lista registros
seleccionados-)
AS XX_TEMPO ORDER BY CIERRE DESC ) as xx_tempo2
order by cierre asc )

Puede parecer que sobra tanto order by, pero es necesario porque estoy
usando siempre la clausula TOP, la cual solo funciona correctamente si está
acompañada de una clausula ORDER BY.

Para localizar los cierres más bajos, se hace lo mismo pero en el punto 3,
se cambia el asc por desc y viceversa.

Si necesitas estructura de datos y datos de prueba, avisame y te mando un
privado.

Gracias por el interes que te tomas.


"Miguel Egea" escribió en el mensaje
news:
Mostrar la cita
#14 Miguel Egea
01/08/2006 - 17:37 | Informe spam
bueno, como el tread se llama algo de 2005 supongo que tienes 2005, si no,
por supuesto que también se puede hacer. Revisa esto, dame de alta en
messenger, como webmaster arroba portalsql.com y vemos como hay que hacerlo
para que sea más eficiente, el resultado lo posteamos en el grupo como
solucion..

drop table #valores
go
create table #valores(idValor int,
fecha smalldatetime,
maximo float,
minimo float,
apertura float,
cierre float,
orden smallint,
grupo smallint)
go

with mycte(fecha,maximo,minimo,apertura,cierre,row)
as
(
select getdate() Fecha,
rand()*9000 maximo,
rand()*1000 minimo,
rand()*1000 apertura,
rand()*1000 cierre,
1 row
union all
select Fecha-1,
rand(row)*maximo,
minimo,
apertura,
cierre,
row+1 as row
from myCte where row<2500
)
insert into #valores
(idvalor,fecha,maximo,minimo,apertura,cierre,orden,grupo)
select 123,fecha,maximo,minimo,apertura,cierre,row, case when row <600 then
1 else 2 end from mycte option (maxrecursion 0)
go

select * from (
select idvalor,fecha,maximo,minimo,apertura,cierre,
row_number() over(partition by grupo order by maximo) fila
from #valores
where grupo=2
) a
where fila in (1,2)


Saludos
Miguel Egea
"GenioMaestro" wrote in message
news:
Mostrar la cita
#15 GenioMaestro
01/08/2006 - 21:10 | Informe spam
Muchas gracias Miguel, tu rutina de creacion de datos me la guardo como oro
en paño, es fantastica.

Nunca se me habia ocurrido hacer una funcion recursiva como esta para crear
datos. Es buenisima.

Aparte. En algún punto no me he explicado bien o no me has entendido bien.
Verás.

Cuando digo que hay que calcular para cada día de cotizacion, me refiero a
que mecesito un max_nivel5 y un min_nivel5 para cada fecha de cotización. Y
si debajo de esa fecha no hay 1900 registros, pues los que haya, y si hay
cero registros porque nisiquiera llegan a 600, pues nada, no hay ni
max_nivel5 ni min_nivel5, da nulo.

Es decir, tu, al generar los registros has puesto un contador hasta 600 y
luego usas partition by grupo para separar los bloques. Usar partition ya lo
intenté yo sin exito, porque, según tu idea, tengo que regenerar el contador
para cada fecha de cotizacion. Más claro:

Contando desde hoy 01/08/2006 hacia atrás, el punto de corte es el
10/12/2004, pero para la fecha 31/07/2006, el punto de corte es el
09/12/2004, es decir, cada fecha y cada valor, tienen un punto de corte
distinto que, segun tu idea, tengo que recalcular, cosa que puede tardar
mucho y usar mucha IO. Aparte, como verás tengo 5 niveles, osea trabajo
multiplicado por 5. Por eso yo calculo el punto de corte de forma dinámica
con una select.

Te apunto al messenger y te paso un scrip con mi tabla, unos datos de prueba
y la consulta completa.

Un saludo.



"Miguel Egea" escribió en el mensaje
news:
Mostrar la cita
Ads by Google
Search Busqueda sugerida