pbixuser1993
Hola a todos,
Estoy tratando de recuperar datos de prueba del servidor SQL usando una consulta a continuación (simplificado un poco, la consulta real usa más filtros). La tabla SQL contiene millones de filas
let
Source = Sql.Database("DATABASE", "DATABASE",
Query="SELECT
TEST.STATION,
TEST.START_DATE_TIME,
TEST.DATA
FROM TEST
WHERE TEST.STATION = '"&Station&"'
AND TEST.START_DATE_TIME >= DATEADD(day, -"&DaysStart&", GETDATE())
AND TEST.START_DATE_TIME < DATEADD(day, -"&DaysEnd&", GETDATE())"])
in
Source
Sin embargo, si selecciono el intervalo de fechas a un valor más alto, la consulta se atasca al evaluar el estado. Esto podría ser una limitación de la memoria del servidor.
Puedo resolver este problema creando varias consultas más pequeñas con intervalos de fechas menores y agregándolas. También puedo crear una consulta con múltiples instrucciones SELECT y UNION ALL entre ellas. Ambas opciones funcionan, pero el código de consulta se vuelve muy grande y no es fácil de editar.
¿Hay alguna manera de repetir la consulta, iterar el parámetro de fecha en cada paso y agregar todos los datos? No pude encontrar una manera simple tanto en M como en SQL para esto. Espero que puedas ayudarme.
pbixuser1993
En respuesta a pbixuser1993
Encontré una solución por mí mismo. Creé una función:
let Loaddata= (Days as text) =>
let
Source = Sql.Database("DATABASE", "DATABASE",
Query="SELECT
TEST.STATION,
TEST.START_DATE_TIME,
TEST.DATA
FROM TEST
WHERE TEST.STATION = '"&Station&"'
AND TEST.START_DATE_TIME >= DATEADD(day, -"&Days&", GETDATE())
AND TEST.START_DATE_TIME < DATEADD(day, -"&Days&"+1, GETDATE())"])
in
Source
in Loaddata
Y lo usó como una columna personalizada para la lista. Después de expandirlo obtuve el resultado deseado.
Anónimo
Una base de datos es una pieza de software que se ejecuta en una computadora y está sujeta a las mismas limitaciones que todo el software: solo puede procesar tanta información como su hardware es capaz de manejar. La forma de hacer que una consulta se ejecute más rápido es reducir la cantidad de cálculos que debe realizar el software (y, por lo tanto, el hardware). Para hacer esto, necesitará cierta comprensión de cómo SQL realmente realiza los cálculos. Primero, abordemos algunas de las cosas de alto nivel que afectarán la cantidad de cálculos que debe realizar y, por lo tanto, el tiempo de ejecución de sus consultas:
- Tamaño de la tabla: Si su consulta llega a una o más tablas con millones de filas o más, podría afectar el rendimiento.
- Uniones: Si su consulta une dos tablas de una manera que aumenta sustancialmente el recuento de filas del conjunto de resultados, es probable que su consulta sea lenta. Hay un ejemplo de esto en la lección de subconsultas.
- Agregaciones: La combinación de varias filas para generar un resultado requiere más cálculos que simplemente recuperar esas filas.
El tiempo de ejecución de consultas también depende de algunas cosas que realmente no puede controlar relacionadas con la base de datos en sí:
- Otros usuarios que realizan consultas: Cuantas más consultas se ejecuten simultáneamente en una base de datos, más deberá procesar la base de datos en un momento dado y más lento se ejecutará todo. Puede ser especialmente malo si otros ejecutan consultas particularmente intensivas en recursos que cumplen algunos de los criterios anteriores.
- Software de base de datos y optimización: Esto es algo que probablemente no pueda controlar, pero si conoce el sistema que está utilizando, puede trabajar dentro de sus límites para que sus consultas sean más eficientes.
pbixuser1993
En respuesta a Anónimo
Soy consciente de las limitaciones del servidor, por lo que intento reducir los cálculos del servidor necesarios para las consultas.
Como dije antes, me gustaría Repita la consulta, itere el parámetro de fecha en cada paso y agregue todos los datos. ¿Cómo podría lograrse esto usando Power BI?
pbixuser1993
En respuesta a pbixuser1993
Encontré una solución por mí mismo. Creé una función:
let Loaddata= (Days as text) =>
let
Source = Sql.Database("DATABASE", "DATABASE",
Query="SELECT
TEST.STATION,
TEST.START_DATE_TIME,
TEST.DATA
FROM TEST
WHERE TEST.STATION = '"&Station&"'
AND TEST.START_DATE_TIME >= DATEADD(day, -"&Days&", GETDATE())
AND TEST.START_DATE_TIME < DATEADD(day, -"&Days&"+1, GETDATE())"])
in
Source
in Loaddata
Y lo usó como una columna personalizada para la lista. Después de expandirlo obtuve el resultado deseado.