tuning rendimiento plan optimizar optimización mejorar ejemplos ejecución datos consultas consulta acelerar sql database database-design data-structures

rendimiento - plan de ejecución y optimización de consultas sql server 2008 r2



¿Por qué usar una base de datos SQL? (25)

No estoy seguro de que stackoverflow sea un lugar para una pregunta tan general, pero pruébelo.

Al estar expuesto a la necesidad de almacenar datos de aplicaciones en alguna parte, siempre he usado MySQL o sqlite, simplemente porque siempre se hace así. Como parece que todo el mundo está usando estas bases de datos (sobre todo productos de software, marcos, etc.), es bastante difícil para un desarrollador principiante como yo comenzar a pensar si esta es una buena solución o no.

Ok, digamos que tenemos alguna lógica orientada a objetos en nuestra aplicación, y los objetos están relacionados entre sí de alguna manera. Necesitamos asignar esta lógica a la lógica de almacenamiento, por lo que también se requieren relaciones entre los objetos de la base de datos. Esto nos lleva a usar una base de datos relacional, y estoy de acuerdo con eso; para decirlo de manera simple, las filas de la tabla de la base de datos a veces necesitarán tener referencias a las filas de otras tablas. Pero, ¿por qué usar el lenguaje SQL para interactuar con una base de datos como esa?

La consulta SQL es un mensaje de texto. Puedo entender que esto es genial para entender realmente lo que hace, pero ¿no es una tontería usar la tabla de texto y los nombres de columnas para una parte de la aplicación que nadie ha visto después del despliegue? Si tuviera que escribir un almacenamiento de datos desde cero, nunca habría utilizado este tipo de solución. Personalmente, habría utilizado un bytecode ''compiled db query'', que se ensamblaría una vez dentro de una aplicación cliente y se pasaría a la base de datos. Y seguramente nombraría tablas y dos puntos por números de identificación, no cadenas de caracteres. En el caso de cambios en la estructura de la tabla, esas consultas de byte podrían recompilarse según el nuevo esquema db, almacenado en XML o algo así.

¿Cuáles son los problemas de mi idea? ¿Hay alguna razón para que no lo escriba yo mismo y para usar la base de datos SQL en su lugar?

EDITAR Para que mi pregunta sea más clara. La mayoría de las respuestas afirman que SQL, al ser una consulta de texto, ayuda a los desarrolladores a comprender mejor la consulta y a depurarla más fácilmente. Personalmente, no he visto personas escribiendo consultas SQL a mano por un tiempo. Todos los que conozco, incluido yo, estamos usando ORM. Esta situación, en la que construimos un nuevo nivel de abstracción para ocultar SQL, nos lleva a pensar si necesitamos SQL o no. Estaría muy agradecido si pudiera dar algunos ejemplos en los que SQL se utiliza sin ORM a propósito, y por qué.

EDIT2 SQL es una interfaz entre un ser humano y una base de datos. La pregunta es ¿por qué tenemos que usarlo para la interacción aplicación / base de datos? Todavía pido ejemplos de escritura / depuración de seres humanos SQL.


Pero, ¿por qué usar el lenguaje SQL para interactuar con una base de datos como esa?

Creo que es por la misma razón que utilizas un lenguaje legible por humanos (código fuente) para interactuar con el compilador.

Personalmente, habría utilizado un bytecode ''compiled db query'', que se ensamblaría una vez dentro de una aplicación cliente y se pasaría a la base de datos.

Esta es una característica existente (opcional) de las bases de datos, llamada "procedimientos almacenados".

Editar:

Estaría muy agradecido si pudiera dar algunos ejemplos en los que SQL se utiliza sin ORM a propósito, y por qué

Cuando implementé mi propio ORM, implementé el marco ORM utilizando ADO.NET: y el uso de ADO.NET incluye el uso de declaraciones SQL en su implementación.


SQL es una interfaz entre un ser humano y una base de datos. La pregunta es ¿por qué tenemos que usarlo para la interacción aplicación / base de datos? Todavía pido ejemplos de escritura / depuración de seres humanos SQL.

Utilizo sqlite mucho desde las tareas más simples (como registrar mis registros de cortafuegos directamente en una base de datos sqlite) hasta tareas analíticas y de depuración más complejas en mi investigación diaria. Establecer mis datos en tablas y escribir consultas SQL para comunicarlos de maneras interesantes parece ser lo más natural para mí en estas situaciones.

En su punto acerca de por qué todavía se utiliza como una interfaz entre la aplicación / base de datos, este es mi razonamiento simple:

  1. Hay alrededor de 3-4 décadas de investigación seria en esa área a partir de 1970 con el trabajo seminal de Codd sobre álgebra relacional. Relational Algebra forma la base matemática para SQL (y otras QL), aunque SQL no sigue completamente el modelo relacional.

  2. La forma de "texto" del lenguaje (aparte de ser fácilmente comprensible para los humanos) también es fácilmente analizable por las máquinas (digamos usando un analizador gramatical como lex) y es fácilmente convertible a cualquier "bytecode" usando cualquier cantidad de optimizaciones.

  3. No estoy seguro si hacer esto de otra manera habría producido beneficios convincentes en los casos genéricos. De lo contrario, probablemente habría sido descubierto y adoptado en las 3 décadas de investigación. SQL probablemente ofrezca las mejores compensaciones al cerrar la brecha entre seres humanos / bases de datos y aplicaciones / bases de datos.

La pregunta que luego se vuelve interesante es: "¿Cuáles son los verdaderos beneficios de hacer SQL en cualquier otra forma de" no texto "?" Will google para esto ahora :)


Creo que la premisa de la pregunta es incorrecta. Que SQL puede representarse como texto es inmaterial. La mayoría de las bases de datos modernas solo compilan consultas una vez y las almacenan en caché de todos modos, por lo que ya tiene efectivamente un ''bytecode compilado''. Y no hay razón para que esto no ocurra en lo que respecta al cliente, aunque no estoy seguro si alguien lo hizo.

Dijiste que SQL es un mensaje de texto, bueno, pienso en él como un mensajero, y, como sabemos, no disparas al messenger. El verdadero problema es que las relaciones no son una forma lo suficientemente buena de organizar datos del mundo real. SQL es solo una barra de labios en el cerdo.


Creo que la razón podría ser los algoritmos de búsqueda / búsqueda / captura a los que está conectado el lanzamiento sql. Recuerde que sql se ha desarrollado durante 40 años, y el objetivo ha sido tanto premonitorio como inteligente.

Pregúntese cuál es la mejor forma de encontrar 2 atributos. Ahora, ¿por qué investigar eso cada vez que querría hacer algo que incluye eso cada vez que desarrolla su aplicación? Asumiendo que el objetivo principal es el desarrollo de su aplicación al desarrollar una aplicación.

Una aplicación tiene similitudes con otras aplicaciones, una base de datos tiene similitudes con otras bases de datos. Entonces debería haber una "mejor manera" de interactuar, lógicamente.

También pregúntese cómo desarrollaría una mejor aplicación de consola que no utiliza sql laungage. Si no puedes hacerlo, creo que debes desarrollar un nuevo tipo de GUI que sea aún más fácil de usar que con una consola: desarrollar cosas a partir de él. Y eso en realidad podría ser posible. Pero aún la mayoría del desarrollo de aplicaciones se basa en consola y tipeo.

Luego, cuando se trata de lanzar, no creo que puedas hacer un lanzamiento de texto mucho más sencillo que sql. Y recuerde que cada palabra de algo está inseparablemente conectada a su significado; si elimina el significado, la palabra no puede usarse; si elimina la palabra, no puede comunicar el significado. No tienes nada para describirlo (y tal vez ni siquiera puedas pensarlo porque no estaría conectado a nada que hayas pensado antes ...).

Así que, básicamente, los mejores algoritmos posibles para la manipulación de la base de datos se asignan a las palabras: si elimina estas palabras, tendrá que asignar estas manipulaciones de otra manera, ¿y qué sería eso?


Dado el hecho de que usaste MySQL y SQLite, entiendo completamente tu punto de vista. La mayoría de los DBMS tienen características que requerirían parte de la programación de su lado, mientras que la obtienen de la base de datos de forma gratuita:

  • Índices : puede almacenar grandes cantidades de datos y aún así poder filtrar y buscar muy rápidamente debido a los índices. Por supuesto, podría implementar su propia indexación, pero ¿por qué reinventar la rueda?

  • Integridad de los datos : el uso de funciones de la base de datos como la conexión en cascada de claves externas puede garantizar la integridad de los datos en todo el sistema. Solo necesita declarar la relación entre los datos, y el sistema se ocupa del resto. Por supuesto, una vez más, podría implementar restricciones en el código, pero es más trabajo. Considere, por ejemplo, eliminación, donde tendría que escribir código en el destructor del objeto para rastrear todos los objetos dependientes y actuar en consecuencia

  • capacidad de tener múltiples aplicaciones escritas en diferentes lenguajes de programación, trabajando en diferentes sistemas operativos, algunos incluso distribuidos en la red, todos usan los mismos datos almacenados en una base de datos común

  • ejecución fácil y muerta del patrón de observador a través de desencadenantes. Hay muchos casos en que solo algunos datos dependen de otros datos y no afectan el aspecto de la interfaz de usuario de la aplicación. Garantizar la consistencia puede ser muy complicado o requerir mucha programación. Por supuesto, podría implementar un comportamiento similar a un disparador con los objetos, pero requiere más programación que la simple definición de SQL.


Después de todas las ediciones y comentarios, el punto principal de su pregunta parece ser: ¿por qué la naturaleza de SQL está más cerca de ser una interfaz humana / de base de datos que ser una interfaz de aplicación / base de datos?

Y la respuesta muy simple a esa pregunta es: porque eso es exactamente lo que originalmente estaba destinado a ser.

Los predecesores de SQL (QUEL, presumiblemente, el más importante) tenían la intención de ser exactamente eso: un lenguaje de consulta, es decir, uno que no tenía ninguno de INSERT, UPDATE, DELETE.

Además, se pretendía que fuera un lenguaje de consulta que pudiera ser utilizado por cualquier usuario, siempre que el usuario conociera la estructura lógica de la base de datos y, obviamente, supiera cómo expresar esa estructura lógica en el lenguaje de consulta que estaba utilizando.

Las ideas originales detrás de QUEL / SQL fueron que una base de datos fue construida usando "cualquier mecanismo concebible", que la base de datos "real" podría ser cualquier cosa (por ejemplo, un solo archivo XML gigantesco, aunque ''XML'' no se consideró una opción válida) en ese momento), y que habría "algún tipo de maquinaria" que entendiera cómo transformar la estructura real de ese "cualquier cosa" en la estructura relacional lógica tal como la percibió el usuario de SQL.

El hecho de que para lograrlo realmente, las estructuras subyacentes están obligadas a "verlos relacionalmente", no se entendía tan bien en esos días como lo es ahora.


En cuanto a encontrar una base de datos relacional que no use SQL como su interfaz principal, creo que no la encontrará. Motivo: SQL es una excelente manera de hablar sobre las relaciones. No entiendo por qué eso es un gran problema para ti: si no te gusta SQL, pon una abstracción sobre él (como un ORM) para que no tengas que preocuparte por ello. Deje que la abstracción se preocupe por eso. Te lleva al mismo lugar.

Sin embargo, el problema que usted realmente menciona aquí es la desconexión de la relación de objeto, el problema es con la relación misma. Los objetos y las tuplas relacionales no siempre se prestan a ser una relación 1-1, que es la razón por la que un desarrollador puede sentirse frustrado con una base de datos. La solución a eso es usar un tipo de base de datos diferente.


En realidad, hay algunas bases de datos que no son SQL (como Objectivity, Oracle Berkeley DB, etc.) que llegaron productos pero ninguno de ellos tuvo éxito. En el futuro, si alguien encuentra una alternativa intuitiva para SQL, responderá a su pregunta.


Hay algunas buenas respuestas aquí. Intentaré agregar mis dos centavos.

Me gusta SQL, puedo pensarlo bastante fácilmente. Las consultas producidas por capas en la parte superior de la base de datos (como marcos ORM) suelen ser horribles. Seleccionan toneladas de cosas extra, se unen a cosas que no necesitas, etc .; todo porque no saben que solo quieres una pequeña parte del objeto en este código. Cuando necesite un alto rendimiento, a menudo terminará entrando y utilizando al menos algunas consultas SQL personalizadas en un sistema ORM solo para acelerar algunos cuellos de botella.

Por qué SQL? Como han dicho otros, es fácil para los humanos. Hace un buen mínimo común denominador. Cualquier lenguaje puede hacer SQL y llamar a los clientes de línea de comandos si es necesario, y casi siempre son una buena biblioteca.

¿Analizar SQL es ineficiente? Algo. La gramática es bastante estructurada, por lo que no hay toneladas de ambigüedades que harían el trabajo del analizador realmente difícil. Lo cierto es que la sobrecarga de analizar SQL no es nada.

Supongamos que ejecuta una consulta como "SELECCIONAR x FROM tabla WHERE id = 3", y luego lo vuelve a hacer con 4, luego 5, una y otra vez. En ese caso, la tara de análisis puede existir. Es por eso que ha preparado declaraciones (como otros lo han mencionado). El servidor analiza la consulta una vez, y puede intercambiar el 3, 4 y 5 sin tener que volver a analizar todo.

Pero ese es el caso trivial. En la vida real, su sistema puede unir 6 tablas y tiene que extraer cientos de miles de registros (si no más). Puede ser una consulta que permite ejecutar en un clúster de base de datos durante horas, porque esa es la mejor manera de hacer las cosas en su caso. Incluso con una consulta que tarda solo uno o dos minutos en ejecutarse, el tiempo para analizar la consulta es esencialmente gratuito en comparación con extraer registros del disco y hacer la ordenación / agregación / etc. La sobrecarga de enviar la extensión "LEFT OUTER JOIN ON" es de solo unos pocos bytes en comparación con el envío de bytes codificados especiales 0x3F. Pero cuando su conjunto de resultados es de 30 MB (y mucho menos de gigs +), esos pocos bytes adicionales son inútiles en comparación con no tener que meterse con algún objeto especial del compilador de consultas.

Muchas personas usan SQL en pequeñas bases de datos. El más grande con el que interactúo es solo unas pocas docenas de conciertos. SQL se usa en todo, desde pequeños archivos (como pequeños DB de SQLite) hasta clústeres de Oracle de tamaño de terabyte. Teniendo en cuenta su potencia, en realidad es un conjunto de comandos sorprendentemente simple y pequeño.



Mi principal razón para SQL es el reporte Ad-hoc. Ese informe que desean los usuarios de su empresa, pero aún no saben que lo necesitan.


Mientras veo su punto, el lenguaje de consulta de SQL tiene un lugar, especialmente en aplicaciones grandes con una gran cantidad de datos. Y para señalar lo obvio, si el idioma no estaba allí, no podría llamarlo SQL (Structured Query Language). La ventaja de tener SQL sobre el método que describió es que SQL es generalmente muy legible, aunque algunos realmente superan los límites en sus consultas.

Estoy completamente de acuerdo con Mark Byers, no deberías protegerte de SQL. Cualquier desarrollador puede escribir SQL, pero para realmente hacer que su aplicación funcione bien con la interacción de SQL, comprender el lenguaje es imprescindible.

Si todo estaba precompilado con bytecode como describiste, odiaría ser el que tenga que depurar la aplicación después de que se haya ido el desarrollador original (o incluso después de no ver el código durante 6 meses).


No creo que la mayoría de las personas reciban su pregunta, aunque creo que es muy clara. Lamentablemente, no tengo la respuesta "correcta". Supongo que es una combinación de varias cosas:

  1. Decisiones semi arbitrarias cuando fue diseñado, como la facilidad de uso, sin necesidad de un compilador de SQL (o IDE), portabilidad, etc.
  2. Resultó atrapar bien (probablemente debido a razones similares)
  3. Y ahora debido a razones históricas (compatibilidad, bien conocido, probado, etc.) continúa siendo utilizado.
  4. No creo que la mayoría de las compañías se hayan molestado con otra solución porque funciona bien, no es un cuello de botella, es un estándar, bla, bla ...

Porque a menudo, no puede estar seguro de que (citando a usted) "nadie haya visto después de la implementación" . Saber que hay una interfaz fácil para informar y para consultar el nivel de datos es una buena ruta para la evolución de su aplicación.
Tienes razón, hay otras soluciones que pueden ser válidas en algunas situaciones: XML, archivos de texto plano, OODB ...
Pero tener un conjunto de interfaces comunes (como ODBC) es una gran ventaja para la vida de los datos.


Sí, es molesto tener que escribir sentencias SQL para almacenar y recuperar objetos.

Es por eso que Microsoft ha agregado cosas como LINQ (consulta integrada de lenguaje) en C # y VB.NET para hacer posible consultar bases de datos utilizando objetos y métodos en lugar de cadenas.

La mayoría de los otros idiomas tienen algo similar con diferentes niveles de éxito dependiendo de las habilidades de ese idioma.

Por otro lado, es útil saber cómo funciona SQL y creo que es un error protegerse por completo de él. Si utiliza la base de datos sin pensar, puede escribir consultas extremadamente ineficientes e indexar la base de datos de forma incorrecta. Pero una vez que comprenda cómo usar SQL correctamente y haya ajustado su base de datos, tendrá a su disposición una herramienta muy poderosa y probada para encontrar exactamente los datos que necesita con suma rapidez.


SQL es una interfaz común utilizada por la plataforma DBMS: todo el punto de la interfaz es que todas las operaciones de la base de datos se pueden especificar en SQL sin necesidad de llamadas API suplementarias. Esto significa que hay una interfaz común entre todos los clientes del sistema: software de aplicación, informes y herramientas de consulta ad-hoc.

En segundo lugar, SQL se vuelve más y más útil a medida que las consultas se vuelven más complejas. Intente utilizar LINQ para especificar una combinación de 12 vías con tres condiciones basadas en predicados existenciales y una condición basada en un agregado calculado en una subconsulta. Este tipo de cosas es bastante comprensible en SQL pero es poco probable que sea posible en un ORM.

En muchos casos, un ORM hará el 95% de lo que desee; la mayoría de las consultas emitidas por aplicaciones son operaciones simples de CRUD que un ORM u otro mecanismo de interfaz de base de datos genérico puede manejar fácilmente. Algunas operaciones se realizan mejor utilizando código SQL personalizado.

Sin embargo, los ORM no son el único y el final de todas las interfaces de bases de datos. Los Patrones de Arquitectura de Aplicaciones Empresariales de Fowler tienen una sección bastante buena sobre otros tipos de estrategia de acceso a bases de datos con alguna discusión sobre los méritos de cada uno.

A menudo hay buenas razones para no utilizar un ORM como capa de interfaz de base de datos primaria. Un buen ejemplo es que las bibliotecas de bases de datos de plataforma como ADO.Net a menudo hacen un trabajo lo suficientemente bueno y se integran muy bien con el resto del entorno. Es posible que descubra que la ganancia de usar otra interfaz realmente no supera los beneficios de la integración.

Sin embargo, la razón final por la que no se puede ignorar el SQL es que finalmente se trabaja con una base de datos si se está haciendo una aplicación de base de datos. Hay muchas, muchas historias de la WTF sobre errores en el código de aplicación comercial hechas por personas que no entendieron las bases de datos correctamente. Un código de base de datos mal pensado puede causar problemas de muchas maneras, y alegremente pensar que no es necesario que entiendas cómo funciona DBMS es un acto de Hubris que seguramente vendrá y morderá algún día. Peor aún, vendrá y morderá a otro pobre schmoe que hereda tu código.


SQL se creó para proporcionar una interfaz para realizar consultas ad hoc en una base de datos relacional.

En general, la mayoría de las bases de datos relacionales comprenden alguna forma de SQL.

Existen bases de datos orientadas a objetos, y (presumiblemente) usan objetos para hacer sus consultas ... pero, según tengo entendido, las bases de datos OO son mucho más escuchadas, y las bases de datos relacionales funcionan muy bien.

Las bases de datos relacionales también le permiten operar en un estado "desconectado". Una vez que tenga la información que solicitó, puede cerrar la conexión de la base de datos. Con una base de datos OO, debe devolver todos los objetos relacionados con el actual (y los que están relacionados con ... y el ... etc ...) o volver a abrir la conexión para recuperar nuevos objetos, ya que son accedido.

Además de SQL, también tiene ORM (asignaciones relacionales de objetos) que asignan objetos a SQL y viceversa. Hay bastantes de ellos, incluidos LINQ (.NET), MS Entity Framework (.NET), Hibernate (Java), SQLAlchemy (Python), ActiveRecord (Ruby), Class :: DBI (Perl), etc. .


Si la primera parte parece referirse a lo que se suele llamar Objeto, la impedancia de mapeo relacional. Ya hay muchos marcos para aliviar ese problema. También hay tradeofs. Algunas cosas serán más fáciles, otras serán más complejas, pero en el caso general funcionan bien si puede pagar la capa adicional.

En la segunda parte parece que se queja de que SQL es texto (usa cadenas en lugar de identificadores, etc.) ... SQL es un lenguaje de consulta . Cualquier lenguaje (informático u otro) que debe leer o escribir el ser humano está orientado al texto. Asamblea, C, PHP, lo que sea. ¿Por qué? Porque, bueno ... tiene sentido, ¿no?

Si desea consultas precompiladas, ya tiene procedimientos almacenados. Las declaraciones preparadas también se compilan una vez sobre la marcha, IIRC. La mayoría (si no todos) los controladores db hablan de todos modos con el servidor de base de datos utilizando un protocolo binario.


Si todo lo que necesita hacer es almacenar algunos datos de aplicaciones en alguna parte, entonces un RDBMS de propósito general o incluso SQLite podría ser excesivo. Serializar sus objetos y escribirlos en un archivo puede ser más simple en algunos casos. Una ventaja de SQLite es que si tiene mucho de este tipo de información, todo está contenido en un archivo. Una desventaja es que es más difícil de leer. Por ejemplo, si serializa sus datos a YAML, puede leer el archivo con cualquier editor de texto o shell.

Personalmente, habría utilizado un bytecode ''compiled db query'', que se ensamblaría una vez dentro de una aplicación cliente y se pasaría a la base de datos.

Así es como funcionan algunas API de base de datos. Verifique el SQL estático y las declaraciones preparadas.

¿Hay alguna razón para que no lo escriba yo mismo y para usar la base de datos SQL en su lugar?

Si necesita muchas funciones, en algún momento será más fácil usar un RDMBS existente y luego escribir su propia base de datos desde cero. Si no necesita muchas funciones, una solución más simple puede ser más inteligente.

El objetivo de los productos de base de datos es evitar escribir la capa de la base de datos para cada nuevo programa. Sí, un RDMBS moderno puede no ser el ajuste perfecto para cada proyecto. Esto se debe a que fueron diseñados para ser muy generales, por lo que en la práctica, siempre obtendrá funciones adicionales que no necesita. Eso no significa que sea mejor tener una solución personalizada. El guante no siempre tiene que ser un ajuste perfecto.

ACTUALIZAR:

Pero, ¿por qué usar el lenguaje SQL para interactuar con una base de datos como esa?

Buena pregunta.

La respuesta a eso se puede encontrar en el documento original que describe el modelo relacional Un modelo relacional de datos para grandes bancos de datos compartidos , de EF Codd, publicado por IBM en 1970. Este documento describe los problemas con las tecnologías de bases de datos existentes de la época. y explica por qué el modelo relacional es superior.

La razón para usar el modelo relacional, y por lo tanto un lenguaje de consulta lógica como SQL, es la independencia de los datos.

La independencia de los datos se define en el documento como:

"... la independencia de los programas de aplicación y las actividades de la terminal a partir del crecimiento en los tipos de datos y los cambios en las representaciones de datos".

Antes del modelo relacional, la tecnología dominante para las bases de datos se conocía como el modelo de red. En este modelo, el programador tenía que conocer la estructura en el disco de los datos y atravesar el árbol o el gráfico manualmente. El modelo relacional permite escribir una consulta contra el esquema conceptual o lógico que es independiente de la representación física de los datos en el disco. Esta separación del esquema lógico del esquema físico es la razón por la que usamos el modelo relacional. Para obtener más información sobre este tema, here hay algunas diapositivas de una clase de base de datos. En el modelo relacional, utilizamos lenguajes de consulta basados ​​en lógica como SQL para recuperar datos. El documento de Codd entra en más detalles sobre los beneficios del modelo relacional. Dale una lectura.

SQL es un lenguaje de consulta que es fácil de escribir en una computadora, en contraste con los lenguajes de consulta que suelen utilizarse en los artículos de investigación. Los artículos de investigación generalmente usan álgebra de relación o cálculo relacional para escribir consultas.

En resumen, utilizamos SQL porque utilizamos el modelo relacional para nuestras bases de datos.

Si comprende el modelo relacional, no es difícil ver por qué SQL es como es. Entonces, básicamente, necesita estudiar el modelo de relación y las partes internas de la base de datos más a fondo para comprender realmente por qué usamos SQL. Por lo demás, puede ser un misterio.

ACTUALIZACIÓN 2:

SQL es una interfaz entre un ser humano y una base de datos. La pregunta es ¿por qué tenemos que usarlo para la interacción aplicación / base de datos? Todavía pido ejemplos de escritura / depuración de seres humanos SQL.

Como la base de datos es una base de datos relacional, solo comprende los lenguajes de consulta relacionales. Internamente, utiliza un lenguaje de álgebra relacional para especificar consultas que luego se convierte en un plan de consulta. Por lo tanto, escribimos nuestra consulta en una forma que podamos entender (SQL), el DB toma nuestra consulta SQL y la convierte en su lenguaje interno de consulta. Luego toma la consulta e intenta encontrar un "plan de consulta" para ejecutar la consulta. Luego ejecuta el plan de consulta y devuelve el resultado.

En algún momento, debemos codificar nuestra consulta en un formato que la base de datos comprenda. La base de datos solo sabe cómo convertir SQL a su representación interna, es por eso que siempre hay SQL en algún punto de la cadena. No puede ser evitado.

Cuando usa ORM, simplemente agrega una capa encima del SQL. El SQL todavía está allí, está oculto. Si tiene una capa de nivel superior para traducir su solicitud en SQL, entonces no necesita escribir SQL directamente, lo cual es beneficioso en algunos casos. Algunas veces no tenemos una capa que sea capaz de hacer los tipos de consultas que necesitamos, así que debemos usar SQL.


Un lenguaje de base de datos es útil porque proporciona un modelo lógico para sus datos, independientemente de las aplicaciones que lo utilizan. Sin embargo, SQL tiene muchos defectos, entre los que destaca que su integración con otros idiomas es deficiente, el soporte de tipo está a unos 30 años del resto de la industria y, de todos modos, nunca ha sido realmente un lenguaje relacional.

SQL ha sobrevivido sobre todo porque el mercado de bases de datos ha sido y sigue siendo dominado por los tres mega vendedores que tienen un gran interés en proteger su inversión. Eso está cambiando y los días de SQL probablemente están contados, pero el modelo que finalmente lo reemplazará probablemente aún no haya llegado, aunque hay muchos contendientes por estos días.


Uno de los principios de diseño de Unix se puede decir así: "Escribir programas para manejar flujos de texto, porque esa es una interfaz universal".

Y eso, creo, es la razón por la que normalmente utilizamos SQL en lugar de algunos ''byte-SQL'' que solo tienen una interfaz de compilación. Incluso si tuviéramos un byte-SQL, alguien escribiría un "SQL de texto" y el ciclo estaría completo.

Además, MySQL y SQLite tienen menos funciones que, por ejemplo, MSSQL y Oracle SQL. Entonces todavía está en el extremo inferior del conjunto de SQL.


creo que puedes usar ORM

si y solo si sabes lo básico de sql.

de lo contrario, el resultado no es el mejor


sí, el texto es un poco ineficiente. Pero en realidad obtener los datos es mucho más costoso, por lo que el sql basado en texto es razonablemente insignificante.


Todos los que conozco, incluido yo, estamos usando ORM

Extraño. Todos los que conozco, incluyéndome a mí, todavía escriben la mayor parte del SQL a mano. Por lo general, terminas con consultas más estrictas y de mayor rendimiento que con una solución generada. Y, dependiendo de su industria y aplicación, esta velocidad importa. A veces mucho. sí, algunas veces usaré LINQ para un quick-n-dirty en el que realmente no me importa cómo se ve el SQL resultante, pero hasta ahora nada automatizado supera el SQL ajustado a mano para el desempeño frente a una gran base de datos en un alto el entorno de carga realmente importa.


  • Es un estándar omnipresente. Prácticamente todos los lenguajes de programación tienen una forma de acceder a bases de datos SQL. Pruébalo con un protocolo binario patentado.
  • Todos lo saben. Puede encontrar expertos fácilmente, los nuevos desarrolladores generalmente lo entenderán hasta cierto punto sin requerir entrenamiento
  • SQL está muy relacionado con el modelo relacional, que ha sido explorado minuciosamente en lo que respecta a optimización y escalabilidad. Pero todavía requiere ajustes manuales (creación de índices, estructura de consultas, etc.), lo cual es relativamente fácil debido a la interfaz textual.