2012-03-23 7 views
5

Tengo una declaración de SQL bastante grande que tiene varias combinaciones internas y de aplicación cruzada para hacer algunos cálculos que crean nuevas columnas para cada entrada en función de la consulta anterior.Ejecutar una declaración de SQL grande y llenar una vista de cuadrícula

Me preguntaba cuál sería la mejor/mejor manera de ejecutar esta consulta desde C# en el código para llenar una vista de cuadrícula?

¿Rompiendo el SQL y escribiendo algunos de los cálculos en C#?

¿Crear un procedimiento almacenado?

Simplemente pasar el sql in como una cadena y crear un conjunto de datos y luego vincular el conjunto de datos a la vista de cuadrícula parece llevar demasiado tiempo.

+0

1) ¿Qué tan grande (filas y columnas) es el conjunto de datos devuelto ?, y 2) nos muestra la declaración de SQL. – RBarryYoung

+0

si te gusta utilizar ** LINQ ** podrás hacer el cálculo en tu código ** C# ** fácilmente –

+0

No quiero realmente publicar el SQL aquí, pero intentaré cambiarlo para que sea más genérico ... puede tener en función de la búsqueda de hasta 10.000 filas y tiene al menos 30 columnas – user1186144

Respuesta

3

Su problema principal es que la consulta de la base de datos debe ejecutarse más rápido. Una vez que tenga una solución para eso, puede ajustar su código en consecuencia.

Lo primero que miraría es optimizar los índices de su base de datos para aumentar el rendimiento de su consulta. Si puede, use SQL Profiler y Index Tuning Wizard (no creo que estas herramientas estén disponibles en la edición Express de SQL Server). Tenga en cuenta que los índices nuevos también pueden causar una degradación del rendimiento con inserciones, por lo que si su base de datos necesita admitir un alto volumen de transacciones, debe tener cuidado con el uso de este enfoque.

Si puede encontrar la manera de aumentar el rendimiento de su consulta dividiendo la consulta en partes y agregando los resultados con el código de procedimiento, entonces tendría sentido pasar a un ObjectDataSource. Esto le permitirá la máxima flexibilidad en la forma en que se adquieren los datos.

Como punto de partida, haría un prototipo de su consulta y/o partes de su consulta en un editor de SQL para que pueda enfocarse solo en la optimización de consultas antes de tomar decisiones sobre cómo cambiará su código ASP.NET.

No puedo comentar más sobre exactamente cómo optimizar su extracción de datos sin mirar los detalles de su esquema y las consultas que está utilizando. Pero esto debería llevarlo en la dirección correcta.

+0

Gracias, creo que voy a probar esto y optimizar mi consulta y ejecutarla como un procedimiento almacenado – user1186144

1

¿Ya está ejecutando algún script SQL desde cualquier otro lugar en su código (es decir, ya ha llegado a la decisión de cómo va a acceder a los datos)? La razón por la que pregunto es que recientemente utilicé el modelo de marco de entidades .NET de ADO para cerrar la brecha entre mi base de datos y los objetos conceptuales con los que quería trabajar a partir de los datos en la base de datos, y lo recomiendo encarecidamente. Realmente es fácil dominarlo también. Una vez que haya implementado un modelo de EF, simplemente se trata de llamar al procedimiento almacenado (sí, le aconsejaría que mantenga la consulta en un procedimiento almacenado) utilizando el método que generará el modelo de EF y buscará en sus clases (que son también creado automáticamente por el modelo). La lista de clases que acaba de recuperar del procedimiento obviamente puede estar vinculada al control que desee.

http://msdn.microsoft.com/en-us/data/ff191186

Vale la pena conocer.

+0

No te marqué ni – user1186144

+0

No hay problema, todos tienen derecho a su voto. –

+1

¿Un mal consejo en general para optar por un modelo de marco de entidades? "Muchos"? En realidad, no recuerdo haber planteado 'muchos' puntos para ser honesto - las dos sugerencias que he hecho son para implementar un modelo EF (ampliamente utilizado, nada de malo en eso), y que el guión se almacena en un procedimiento (que muchos otros en este hilo estarán de acuerdo conmigo). Además, creo que es una lástima por no aceptar mi edición; la ortografía y la gramática de la respuesta dejan mucho que desear. –

-2

Me preguntaba cuál sería la mejor/mejor manera de ejecutar esta consulta desde C# en el código para llenar una vista de cuadrícula?

¿Quieres decir que de la única versión posible tienes que empezar?

La única forma de ejecutar una consulta que devuelve una tabla es ejecutar un comando que devuelve un DataReader. Punto. Si se proporciona el SQL, eso es todo. No hay alternativa

Nota: todas las otras cosas que desee arrojar aquí lo usan internamente. Lo envuelven

¿Rompiendo el SQL y escribiendo algunos de los cálculos en C#?

¿Cuál es mi comida favorita? Dígame usted. Depende mucho del hardware, el volumen de datos y la consulta. No puedo responder.

¿Cómo crear un procedimiento almacenado?

Sin diferencia.

Simplemente pasar el sql in como una cadena y crear un conjunto de datos y luego vincular el conjunto de datos a la vista de cuadrícula parece llevar demasiado tiempo.

  • ¿Qué es demasiado tiempo?
  • ¿Qué demora tanto? Cargando 100 millones de filas? ¿Procesamiento de SQL Server? Todo lo que determina la optmización. Proporcione información relevante: infórmenos sobre el tiempo invertido.

QUE DICHO: no utilizar un conjunto de datos pero una colección observable de objetos que llene en segundo plano al menos permitiría que aparezcan los resultados mientras se completa la lista.

+0

No te marqué por cierto BTW – user1186144

+4

Lo hice. No aprecio los comentarios como '¿cuál es mi comida favorita? DÍGAME USTED'. Confrontando el sarcasmo a alguien que simplemente busca ayuda y consejo. Crear un procedimiento almacenado HACE una diferencia, ya sea en el rendimiento o en lo que respecta a la organización y una estructura "adecuada" para la solución. Además, la ortografía y la gramática están "al alza" y, si no va a aceptar una edición, acepte un voto negativo. –

+0

No estoy aquí para ser amistoso. Estoy aquí para hacer todo lo posible para devolver la ayuda que me brindan amablemente de manera regular, y creo que ya lo he hecho. He recomendado una solución que, para muchos desarrolladores de software de todo el mundo MUCHO más competentes que usted y usted, utiliza diariamente en soluciones estándar de la industria. Está llegando al punto en que estoy luchando por comprenderte ahora. –

2

Parece que su problema es que está ejecutando algunos cálculos costosos en cada SELECCIÓN. La solución adecuada es precalcular los resultados del cálculo y almacenarlos en la base de datos, de modo que su cuadrícula simplemente lea los datos sin ningún cálculo.

Puede disparar el recálculo de sus resultados cuando los datos subyacentes cambian. Puede usar activadores o llamar al sproc que implementa el cálculo desde el código C#.

Cuestiones relacionadas