SQL Server Performance

problemas con inserccion de datos

Discussion in 'Preguntas sobre SQL Server en Español.' started by acuario21, Dec 29, 2004.

  1. acuario21 New Member


    Saludos a todos...!!!

    tengo un problema que no he podido solucionar... y es por eso que recurro a los mas entendido en el tema...

    El problema es el siguiente :

    Tengo una aplicacion construida sobre VC++, la cual se comunica con otro programa para obtener dartos en linea desde un sistema productivo. Esta aplicacion una vez obtenido los datos los almacena en una base de datos sobre SQL-Server 7.0 . La aplicacion funciona bien, se comunica con la otra aplicaion y captura los datos y almacena los datos en la base, pero de vez en cuando me arroja el siguiente error:

    "Violation of PRIMARY KEY constraint 'PK_Datos'. Cannot insert duplicate key in object 'Datos'"
    Debo agregar que la clave primaria de esa tabla esta formada por :

    @id + @fecha

    la fecha incluye el año, mes, dia, minutos y segundos

    Captura un gran cantidad de datos sin problema pero de repente aparece con este error ...

    alguien podria decir que puede estar ocurriendo ???

    se los agreceria mucho...

    gracias
  2. Luis Martin Moderator

    Es posible una clave con igual id pero fecha distinta?
    Si esto es posible, podrìa ser que en un instante coincidan, aunque sea difícil, la fecha.
    Quizás habría que agregar un campo tipo TIMESTAMP (Ver libros on line) que se asegure clave única.
    Por otro lado, que SO y SP tienes, además que sp tienes en el SQL.

    (Permíteme aclararte que soy el único moderador de éste forum y no voy a estar desde este jueves hasta el lunes, por lo tanto no podré seguir con el tema hasta la vuelta.)



    Luis Martin
    Moderator
    SQL-Server-Performance.com

    All postings are provided “AS IS” with no warranties for accuracy.

  3. acuario21 New Member

    Antes que nada, quiero agradecer la amabilidad que has tenido para responder a mi pregunta. Por esto te estoy muy agradecido...

    Con respecto a tu pregunta...
    SI, eso es mas que posible, por esa razon la clave primaria incluye la fecha al nivel del segundo.
    La verdad es que no debiera darse ese error. Por eso estoy super intrigado y no tengo una idea clara de porque se da esa situacion. Cuando captura los datos para un dispositivo de control en particular, este no vuelve a ser capturado hasta un cierto tiempo previamente configurado.
    Actualmente estoy trabajando sobre una maquina con procesador pentium IV de 2.4GHz con 640MB. S.O Windows 2000 profesional SP-4. Estoy claro que no son las condiciones ideales para trabajar. Pero estoy en la fase de construccion , y este error es el unico que me va quedando por solucionar.
    Debo mencionar que he dejado capturando los datos durante todo la noche y este error no aparece. Solo aparece cuando lo sobre cargo de tareas (digamos otras aplicaciones).
    Con respecto al procedimiento almacenado. Inicialmente parti con lo mas simple, desde la instruccion de insercion hasta llegar a un sp con manejo de errores y el cuento se mantiene igual.

    saludos y que pases un feliz año nuevo.

  4. c_maldon Member

    Hola,

    ¿Cuando se realiza el insert en la tabla, es C++ quien arma el valor a ingresar en el campo @fecha o es un defaul de sql server?
  5. acuario21 New Member

    Hola c_maldon
    SI..es asi...
    En la aplicacion C++ , llamo al procedimiento almacenado y ademas le paso los parametros
    @id, @fecha, @valor


    gracias por contestar ...!!!
  6. c_maldon Member

    Tenes posibilidades desde C++ de incluir milisegundos a la variable @fecha?
  7. acuario21 New Member

    creo que si !!
    no se me habia ocurrido ...lo voy revisar a ver que pasa..!!

    gracias..!!
  8. c_maldon Member


    En caso de que puedas, dejalo correr unos días y
    despues evaluá:

    Select id,
    convert(varchar,fecha,120) as [Fecha],
    count(*) as '# Inserciones'
    From Tu_Tabla
    Group by id,
    convert(varchar,fecha,120)
    Having count(*) > 1

    así vas a poder ver si insertas más de un registro en un segundo.

  9. acuario21 New Member

    Hola c_maldon

    Revise la documentacion de VC++ y no permite capturar la fecha al milisegundo. Y si ubiera sido posible creo que tendria el mismo problema. Esto por que cuadno realizo la captura de los datos, lo que ocurre es que no todos los datos que se capturan se almacenan en la BD, si no que solo algunos, por esta razon yo capturo la fecha en ese instante y todos los datos que deban ser almacenados en la BD se les asigna esa fecha.
    Creo que lo habia mencionado antes, pero para realizar la captura hacia la BD, los datos se almacenann de acuerdo a una freceuncia predeterminada, esto quiere decir que hay datos que cada 5 segundos por ejemplo se deben almacenar en la Bd, mientras que otros datos pueden tener frecuencia de muestreo distintas. Por ello la implementacion incluye hebras de control se ejecutan cuando un grupo de datos requiere ser almacenada.

    No se si me explique bien...

    saludos...
  10. c_maldon Member

    Por que no quitas la clave primaria momentaneamente y dejas capturar los datos,
    luego analizas la captura viendo las duplicaciones, talvez te den una pista de por que la clave se duplica.
  11. acuario21 New Member

    c_maldron..!!!

    Eso ya lo habia hecho...!! no de la forma como tu lo planteas ...pero cada vez que ocurria el error capturaba la duplicacion a un tabla alternativa con el valor la fecha y su codigo...ademas del tipo de error...
    Si lo dejo corriendo varios dias y si nadie usa el computador ..no me marca este error...solo cuando empieso a realizar muchas tareas en la maquina que este error aparece..Me da impresion de que en algun momento se quedara sin recurso de algun tipo y las tareas que se ejecutan desde la aplicacion cometieran el error creo yo..o algo parecido....

    En todo caso lo que me molesta mas es que la aplicacion que captura los datos genera el cuadro de dialogo indicando el error !! y eso si que es desagradable !!!

    con respecto a quitar la clave primaria !!! ....pordria ser ..pero lo utilizaria como ultimo rescurso...
    en todo caso ..

    saludos
  12. c_maldon Member

    Vos insertás los registros de uno en uno, llamando a procedimiento una vez por cada inserción?

    Si haces esto, no podés tomar la fecha dentro del stored procedure en lugar que enviarla desde C++,
    algo como

    Set @fecha = getdate()

    y luego el INSERT?

  13. acuario21 New Member

    Si eso tambien lo tenia en mente inicialmente al diseñar la la aplicaion...el motivo del por que la diseñe de esta forma fue para asegurarme de que el grupo de datos tuviera la misma fecha. Pero voy a realizar pruebas capturando la fecha dentro del sp y ver si la frecuencia de muestreo se mantiene !!!

    saludos
  14. acuario21 New Member

    saludos ....

    He revisado en la literatura y me encontre con que existe una opcon llamada "free buffer" que tiene como valor minimo 20 y valor maximo 524288. Este parametro permite cambiar la memoria intermedia para aumentar el rendimiento para el proceso de escritura....esto permite escribir en memoria en vez del disco..cuando se llega al valor del umbral se escribe en disco para mantener las paginas libre de memoria....

    Dice que se puede manipular desde el administardor del sql server o desde consola de comando con el comando sp_configure...pero el problema es que no encuentro ese paramentro....

    saludos
  15. Luis Martin Moderator

    En sql2000 ese parámetro no está más disponible, fue removido. No recuerdo en SQL 7.0, pero de todas formas podés ejecutar sp_configure en el Analizador de Consultas para ver si existe.
    Con ese mismo comando se puede cambiar. Fíjate en la documentación.


    Luis Martin
    Moderator
    SQL-Server-Performance.com

    All postings are provided “AS IS” with no warranties for accuracy.

Share This Page