none
Optimizar Base De Datos. RRS feed

  • Pregunta

  • Hola al principio todo andaba bien, hasta que después de bastante tiempo he notado que una aplicación mía programada sobre SQL SERVER 2005 demora un poco mas en unas búsquedas, estuve leyendo un poco sobre crear indices, por ejemplo quiero crear un indice a la columna apellido paterno, la gran pregunta es si puedo crearlo a estas alturas o si tuve que que hacer esto al principio, otra pregunta es si creo el indice a apellido paterno significa que se guardara alfabéticamente?.

    Gracias por su tiempo.


    Visual Studio .NET
    viernes, 22 de julio de 2011 3:42

Respuestas

  • Puedes crearlo cuando lo creas conveniente, la tabla no tiene por qué estar vacía para hacerlo.

    Sobre la pregunta de si se "guardará alfabéticamente", pues tendrías que concretar a qué te refieres: ¿a los registros de la tabla? Cuando creas un índice (no agrupado), lo que haces es crear una estructura paralela a la tabla en la que las entradas estarán ordenadas de forma lógica y tendrán una referencia al resto de los datos para poder encontrarlos más rápidamente. Es igual a la función que tiene un índice de un libro: no cambia el orden de las páginas, pero tiene una lista de capítulos ordenados por el identificador del mismo y luego una referencia que indica el número de página donde puedes encontrarlo.

    De todos modos, por la pregunta que haces, te recomiendo que compres un libro de iniciación en SQL Server para poder sacarle todo el partido a este motor. No todo consiste en crear índices para mejorar el rendimiento, hay muchísimos factores que afectan al mismo, y desde luego no es posible explicarlos todos en una respuesta de un foro.

    viernes, 22 de julio de 2011 6:15
  • Añadiendo a lo que dice Carlos, existe en SQL Server una herramienta que se llama "Database Engine Tuning Advisor", en el menú "Performance Tools" debajo de SQL Server. Esta herramienta toma una muestra de las sentencias ejecutadas por el servidor (que podrías capturar previamente mediante el Profiler), y analiza cuáles serían los índices más adecuados para optimizar la ejecución de esas sentencias. Una vez que te saca la lista de índices, desde el propio menú de la herramienta le puedes decir que los cree. Esta es una forma de añadir "a posteriori" los índices de una base de datos en la que los desarrolladores no dejaron ya previstos los índices desde el principio.

     

    viernes, 22 de julio de 2011 6:36
  • Hola.

    Para saber cuando crear índices y de que tipo, es necesario entender como funcionan los tipos de indices y el tipo de consulta que se quiere hacer sobre ellos sin olvidar el tipo de campo/s o diseño de la tabla.


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    viernes, 22 de julio de 2011 22:41

Todas las respuestas

  • Puedes crearlo cuando lo creas conveniente, la tabla no tiene por qué estar vacía para hacerlo.

    Sobre la pregunta de si se "guardará alfabéticamente", pues tendrías que concretar a qué te refieres: ¿a los registros de la tabla? Cuando creas un índice (no agrupado), lo que haces es crear una estructura paralela a la tabla en la que las entradas estarán ordenadas de forma lógica y tendrán una referencia al resto de los datos para poder encontrarlos más rápidamente. Es igual a la función que tiene un índice de un libro: no cambia el orden de las páginas, pero tiene una lista de capítulos ordenados por el identificador del mismo y luego una referencia que indica el número de página donde puedes encontrarlo.

    De todos modos, por la pregunta que haces, te recomiendo que compres un libro de iniciación en SQL Server para poder sacarle todo el partido a este motor. No todo consiste en crear índices para mejorar el rendimiento, hay muchísimos factores que afectan al mismo, y desde luego no es posible explicarlos todos en una respuesta de un foro.

    viernes, 22 de julio de 2011 6:15
  • Añadiendo a lo que dice Carlos, existe en SQL Server una herramienta que se llama "Database Engine Tuning Advisor", en el menú "Performance Tools" debajo de SQL Server. Esta herramienta toma una muestra de las sentencias ejecutadas por el servidor (que podrías capturar previamente mediante el Profiler), y analiza cuáles serían los índices más adecuados para optimizar la ejecución de esas sentencias. Una vez que te saca la lista de índices, desde el propio menú de la herramienta le puedes decir que los cree. Esta es una forma de añadir "a posteriori" los índices de una base de datos en la que los desarrolladores no dejaron ya previstos los índices desde el principio.

     

    viernes, 22 de julio de 2011 6:36
  • Complemento las anteriores respuestas con este buen artículo de TechNet sobre desempeño en SQL Server 2005: Troubleshooting Performance Problems in SQL Server 2005, el cual incluso puedes descargar en formato Word desde http://download.microsoft.com/download/4/7/a/47a548b9-249e-484c-abd7-29f31282b04d/TShootPerfProbs.doc.

    Saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    viernes, 22 de julio de 2011 13:13
  • Los indices puedes agregarlos en cualquier momento . Pero lo mas probable es que las estadisticas estén desactualizadas, lo primero que yo haría seria re compilar el procedimiento almacenada para que se actualice el plan de trabajo.
    viernes, 22 de julio de 2011 15:49
  • No es demasiado probable que las estadísticas estén desactualizadas. Salvo que se haya deshabilitado expresamente, el valor por defecto del parámetro "auto update statistics" es true, por lo que normalmente se mantienen suficientemente actualizadas.

    En cuanto a los procedimientos almacenados, sí que puede ser que se quede obsoleto el plan de ejecución y haya que recompilarlos, pero en la pregunta no se ha mencionado para nada que se estén utilizando procedimientos almacenados; tiene más bien pinta de que se trata de sentencias ad-hoc. Y en cualquier caso, si no hay índices, aunque se recompile el plan de ejecución, el plan va a seguir consistiendo en un "full table scan", al no haber índices no hay más remedio que barrer las tablas.

    En resumen, yo diría que es más probable que el problema de rendimiento se deba a una falta de índices que a un problema de estadísticas o de planes de ejecución desactualizados.

     

    viernes, 22 de julio de 2011 16:05
  • Hola gracias por responder (y rápido) y voy a seguir su orientación en primer lugar buscando información y estudiando un poco más sobre el tema ya que es algo nuevo para mi (gracias por el link), ahora no quisiera irme sin hacer la última pregunta sobre el tema:

    Que pasa si tengo una tabla padre persona y de allí heredan supongamos un personal, un proveedor y un cliente. Si tengo 100 000 registros en cada tabla hijo haciendo un total de 300 000 en la tabla padre, frente a esto es recomendable hacer consultas a la tabla padre haciendo inner joins a la tabla hijo o lo correcto sería tener los campos comunes en ambas tablas como el campo nombre, apellidos (pero se estaría poniendo la misma información en la tabla padre que en la tabla hijo) para así evitar hacer el inner join y solo buscar en la tabla hijo.

     


    Visual Studio .NET
    viernes, 22 de julio de 2011 16:32
  • [...] sería tener los campos comunes en ambas tablas como el campo nombre, apellidos (pero se estaría poniendo la misma información en la tabla padre que en la tabla hijo)

    Mi recomendación es que eso no se haga, es decir, dejar en principio la base de datos perfectamente normalizada, lo cual implica que no se debe repetir la misma información en dos sitios. Esa base normalizada se optimiza creando los índices adecuados, y se comprueba si se logran unas prestaciones suficientemente buenas (normalmente sí que se consiguen). Únicamente en el caso de que se llegue a la conclusión de que con la base normalizada resulta imposible cumplir los requisitos de rendimiento, entonces es cuando se puede pensar en introducir alguna denormalización. Pero en la práctica esto no sucede prácticamente nunca; en general, si los índices están bien puestos, el JOIN funciona sobradamente bien para no tener que denormalizar nada.

     

    viernes, 22 de julio de 2011 17:06
  • Gracias por responder, es de mucha ayuda.

     

    Salu2


    Visual Studio .NET
    viernes, 22 de julio de 2011 19:53
  • Hola.

    Para saber cuando crear índices y de que tipo, es necesario entender como funcionan los tipos de indices y el tipo de consulta que se quiere hacer sobre ellos sin olvidar el tipo de campo/s o diseño de la tabla.


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    viernes, 22 de julio de 2011 22:41