¿El Plan Optimizante de consulta funciona bien con las funciones de valoración de la tabla se unidas / filtradas? -- sql-server campo con sql-server-2005 campo con tsql campo con query-optimization campo con user-defined-functions camp Relacionados El problema

Does query plan optimizer works well with joined/filtered table-valued functions?


2
vote

problema

Español

En SQLSERVER 2005, estoy usando la función valorada en la tabla como una forma conveniente de realizar la agregación arbitraria en los datos de subcondicional de la tabla grande (rango de fecha de aprobación o tales parámetros).

Estoy usando tesis dentro de las consultas más grandes, como se unió a los cálculos y me pregunto si el Plan de consulta Optimizer funciona bien con ellos en todas las condiciones o si soy mejor para invertir un cálculo de este tipo en mis consultas más grandes.

  1. hace consultar el optimizador del plan de consulta Funciones valoradas en la tabla si lo hace. ¿sentido?
  2. si no lo hace, ¿qué haces? Recomendar para evitar la duplicación de código. eso ocurriría manualmente ¿Sin impedirlos?
  3. si lo hace, como lo hacen identificas eso de la ejecución plan?

Muestra de código:

  create table dbo.customers (     [key] uniqueidentifier     , constraint pk_dbo_customers         primary key ([key]) ) go  /* assume large amount of data */ create table dbo.point_of_sales (     [key] uniqueidentifier     , customer_key uniqueidentifier     , constraint pk_dbo_point_of_sales         primary key ([key]) ) go  create table dbo.product_ranges (     [key] uniqueidentifier     , constraint pk_dbo_product_ranges         primary key ([key]) ) go  create table dbo.products (     [key] uniqueidentifier     , product_range_key uniqueidentifier     , release_date datetime     , constraint pk_dbo_products          primary key ([key])     , constraint fk_dbo_products_product_range_key          foreign key (product_range_key)          references dbo.product_ranges ([key]) ) go   

.

  /* assume large amount of data */ create table dbo.sales_history (     [key] uniqueidentifier     , product_key uniqueidentifier     , point_of_sale_key uniqueidentifier     , accounting_date datetime     , amount money     , quantity int     , constraint pk_dbo_sales_history         primary key ([key])     , constraint fk_dbo_sales_history_product_key         foreign key (product_key)         references dbo.products ([key])     , constraint fk_dbo_sales_history_point_of_sale_key         foreign key (point_of_sale_key)         references dbo.point_of_sales ([key]) ) go  create function dbo.f_sales_history_..snip.._date_range (     @accountingdatelowerbound datetime,          @accountingdateupperbound datetime ) returns table as return (     select                   pos.customer_key         , sh.product_key         , sum(sh.amount) amount         , sum(sh.quantity) quantity     from          dbo.point_of_sales pos         inner join dbo.sales_history sh              on sh.point_of_sale_key = pos.[key]     where                   sh.accounting_date between                        @accountingdatelowerbound and                        @accountingdateupperbound     group by                   pos.customer_key                   , sh.product_key ) go  -- TODO: insert some data  -- this is a table containing a selection of product ranges declare @selectedproductranges table([key] uniqueidentifier)  -- this is a table containing a selection of customers declare @selectedcustomers table([key] uniqueidentifier)  declare @low datetime     , @up datetime  -- TODO: set top query parameters   

.

  select          saleshistory.customer_key          , saleshistory.product_key          , saleshistory.amount          , saleshistory.quantity from          dbo.products p          inner join @selectedproductranges productrangeselection               on p.product_range_key = productrangeselection.[key]          inner join @selectedcustomers customerselection on 1 = 1          inner join           dbo.f_sales_history_..snip.._date_range(@low, @up) saleshistory              on saleshistory.product_key = p.[key]              and saleshistory.customer_key = customerselection.[key]   

Espero que la muestra tenga sentido.

¡Muchas gracias por tu ayuda!

Original en ingles

In SQLSERVER 2005, I'm using table-valued function as a convenient way to perform arbitrary aggregation on subset data from large table (passing date range or such parameters).

I'm using theses inside larger queries as joined computations and I'm wondering if the query plan optimizer work well with them in every condition or if I'm better to unnest such computation in my larger queries.

  1. Does query plan optimizer unnest table-valued functions if it make sense?
  2. If it doesn't, what do you recommend to avoid code duplication that would occur by manually unnesting them?
  3. If it does, how do you identify that from the execution plan?

code sample:

create table dbo.customers (     [key] uniqueidentifier     , constraint pk_dbo_customers         primary key ([key]) ) go  /* assume large amount of data */ create table dbo.point_of_sales (     [key] uniqueidentifier     , customer_key uniqueidentifier     , constraint pk_dbo_point_of_sales         primary key ([key]) ) go  create table dbo.product_ranges (     [key] uniqueidentifier     , constraint pk_dbo_product_ranges         primary key ([key]) ) go  create table dbo.products (     [key] uniqueidentifier     , product_range_key uniqueidentifier     , release_date datetime     , constraint pk_dbo_products          primary key ([key])     , constraint fk_dbo_products_product_range_key          foreign key (product_range_key)          references dbo.product_ranges ([key]) ) go 

.

/* assume large amount of data */ create table dbo.sales_history (     [key] uniqueidentifier     , product_key uniqueidentifier     , point_of_sale_key uniqueidentifier     , accounting_date datetime     , amount money     , quantity int     , constraint pk_dbo_sales_history         primary key ([key])     , constraint fk_dbo_sales_history_product_key         foreign key (product_key)         references dbo.products ([key])     , constraint fk_dbo_sales_history_point_of_sale_key         foreign key (point_of_sale_key)         references dbo.point_of_sales ([key]) ) go  create function dbo.f_sales_history_..snip.._date_range (     @accountingdatelowerbound datetime,          @accountingdateupperbound datetime ) returns table as return (     select                   pos.customer_key         , sh.product_key         , sum(sh.amount) amount         , sum(sh.quantity) quantity     from          dbo.point_of_sales pos         inner join dbo.sales_history sh              on sh.point_of_sale_key = pos.[key]     where                   sh.accounting_date between                        @accountingdatelowerbound and                        @accountingdateupperbound     group by                   pos.customer_key                   , sh.product_key ) go  -- TODO: insert some data  -- this is a table containing a selection of product ranges declare @selectedproductranges table([key] uniqueidentifier)  -- this is a table containing a selection of customers declare @selectedcustomers table([key] uniqueidentifier)  declare @low datetime     , @up datetime  -- TODO: set top query parameters 

.

select          saleshistory.customer_key          , saleshistory.product_key          , saleshistory.amount          , saleshistory.quantity from          dbo.products p          inner join @selectedproductranges productrangeselection               on p.product_range_key = productrangeselection.[key]          inner join @selectedcustomers customerselection on 1 = 1          inner join           dbo.f_sales_history_..snip.._date_range(@low, @up) saleshistory              on saleshistory.product_key = p.[key]              and saleshistory.customer_key = customerselection.[key] 

I hope the sample makes sense.

Much thanks for your help!

              

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

En este caso, es una "función valorada en línea en línea" El optimizador simplemente se expande (los no preocupes) si es útil (o ver).

Si la función se trata como "caja negra" por la consulta externa, la forma más rápida es comparar IO que se muestra en SSMS vs IO en Profiler. Profler captura "Black Box" que SSMS no.

Publicación de blog por Adam Mechanic (su libro está en mi cajón en el trabajo)

 

In this case, it's an "inline table valued function" The optimiser simply expands (unnests) it if it's useful (or view).

If the function is treated as "black box" by the outer query, the quickest way is to compare IO shown in SSMS vs IO in profiler. Profler captures "black box" IO that SSMS does not.

Blog post by Adam Mechanic (his book is in my drawer at work)

 
 
3
 
vote

1) Sí, usando su sintaxis, lo hace. Si ha estado usando un UDF que devolvió una tabla que tenía la lógica condicional, sin embargo, no lo haría.

3) El optimizador no señalará qué parte de su consulta está optimizando, ya que puede ver adecuado combinar los trozos del plan con su función, o para optimizar los bits de distancia.

 

1) Yes, using your syntax, it does. If you happened to use a UDF that returned a table which had conditional logic in it, it would not, though.

3) The optimizer won't point out what part of your query it's optimizing, because it may see fit to combine chunks of the plan with your function, or to optimize bits away.

 
 

Relacionados problema

176  ¿Cómo despojar todos los caracteres no alfabéticos de la cadena en SQL Server?  ( How to strip all non alphabetic characters from string in sql server ) 
¿Cómo podría eliminar todos los caracteres que no son alfabéticos de una cadena? ¿Qué pasa con lo no alfanumérico? ¿Tiene que ser una función personalizad...

0  PandaS_UDF Función que se ejecuta en el pegamento AWS no pone objetos a S3 sin función de impresión  ( Pandas udf function running in aws glue does not put objects to s3 without print ) 
Esto es lo que estoy tratando de hacer. sparkdataframe - & gt; groupby - & gt; Llame al método PandaS_UDF que crea algunos archivos en S3 usando Boto3 MÉT...

152  Cómo informar un error de una función definida por el usuario de SQL Server  ( How to report an error from a sql server user defined function ) 
Estoy escribiendo una función definida por el usuario en SQL Server 2008. Sé que las funciones no pueden aumentar los errores de la forma habitual: si intenta...

3  ¿Cómo convertir org.apache.spark.sql.columname a cadena, tipo decimal en Spark Scala?  ( How to convert org apache spark sql columnname to string decimal type in spark s ) 
Tengo un JSON como abajo Student0 Estoy cargando mi archivo JSON Student111 Student2 Tengo una función como a continuación: Student3 Est...

-1  Utilizando Pyspark, determinante de cuántos de los elementos dentro de una columna de matriz están contenidos dentro de una matriz de matrices en otra columna  ( Utilizing pyspark determin how many of the elements within an array column are ) 
Tengo un conjunto de datos como a continuación: meld2 Lo que me gustaría poder hacer es identificar cuántos valores en orden de col2 están contenido...

0  Spark (Scala): Cómo aplicar la transformación UDF a las columnas de matriz en datos anidados  ( Spark scala how to apply udf transformation to array columns in nested data ) 
Necesito hacer una transformación en una selección de columnas de un marco de datos que tenga una estructura anidada. La transformación se basa en una función...

71  Resultados de la función de actualización de Excel VBA  ( Refresh excel vba function results ) 
¿Cómo puedo obtener una función definida por el usuario para volver a evaluarse según los datos modificados en la hoja de cálculo? Intenté f9 y shift ...

0  Dividiendo cadenas largas en SQL  ( Splitting long strings in sql ) 
La solución en línea sugerida aquí: ¿Cómo divido una cadena para poder acceder a item x? por VZCZC solo funciona para cadenas que contienen menos de 100 ele...

-1  Cree SPARK UDF de una función que depende de otros recursos  ( Create spark udf of a function that depends on other resources ) 
Tengo un código para tokenizar una cadena. Pero ese método de tokenización utiliza algunos datos que se cargan cuando comienza mi aplicación. val stopwor...

0  Estructura de tabla de SQL Server dentro de una función definida por el usuario  ( Sql server table structure inside a user defined function ) 
En mi portal de comercio electrónico, recibo productos de EAN de distribuidores. Quiero completar los códigos EAN-12 que informen la dígito de suma de compro...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos