tsql - T-SQL Insert - Select in Table variable is very slow -


i have table variable , inserting in values using "insert - select" statement. select combination of few joins, , when executed separately takes 3 seconds. problem whole code takes 3-4 minutes executed. wonder there particular reason this.

this table variable declaration:

declare @result table  (      productid nvarchar(25) primary key     ,productname nvarchar(100)     ,productcategoryid tinyint     ,productcategory  nvarchar(50)     ,productsubcategoryid tinyint     ,productsubcategory  nvarchar(50)     ,brandid tinyint     ,brand  nvarchar(50) ) 

i have other table variable initialize data, , structure:

declare @temptable table (     protosurveyid int,     productid nvarchar(25) primary key ) 

and following code problem statement (insert - select):

insert @result (productid,productname,productcategoryid,productcategory,productsubcategoryid,productsubcategory,brandid,brand) select           products.productid  productid         ,products.productname  productname         ,productcategories.productcategoryid  productcategoryid         ,productcategories.productcategory   productcategory         ,productsubcategories.productsubcategoryid  productsubcategoryid         ,productsubcategories.productsubcategory  productsubcategory         ,brands.brandid brandid         ,brands.brand  brand  (         select                     cast(a.col001 tinyint) productcategoryid               ,cast(a.col002 tinyint) brandid               ,cast(a.col003 nvarchar(25)) productid               ,cast(a.col004 nvarchar(100)) productname               ,cast(a.col006 tinyint) productsubcategoryid               ,b.protosurveyid         datasetsmaterializeddatasqlvariant          inner join @temptable b          on b.productid=cast(a.col003 nvarchar(25))         datasetsmaterializedinternalrowsetid = 3  ) products       inner join (          select cast(a.col001 tinyint) brandid               , cast(a.col002 nvarchar(50)) brand          datasetsmaterializeddatasqlvariant          datasetsmaterializedinternalrowsetid = 1 )brands on products.brandid=brands.brandid inner join (          select cast(a.col001 tinyint) productcategoryid                 ,cast(a.col002 nvarchar(50)) productcategory          datasetsmaterializeddatasqlvariant          datasetsmaterializedinternalrowsetid = 2 ) productcategories on products.productcategoryid=productcategories.productcategoryid inner join (          select cast(a.col001 tinyint) productsubcategoryid               , cast(a.col002 nvarchar(50)) productsubcategory          datasetsmaterializeddatasqlvariant          datasetsmaterializedinternalrowsetid = 11 ) productsubcategories on products.productsubcategoryid=productsubcategories.productsubcategoryid 

as told before, if comment insert line query takes 3 seconds, otherwise - long time.

edit: here execution plan - of cost table scan, why takes many time when insert make, , happens quick without it?

enter image description here

the follow new inline function:

create function [dbo].[fn_xxcustom_retailaudits_getproductsforfilter] (     @securityobjectuserid bigint ) returns table return      cte(protosurveyid,productid)     (         select  distinct  cast(b.protosurveyid int)                          ,cast(a.col002 nvarchar(25)) productid         datasetsmaterializeddatasqlvariant         join surveyinstances b on a.col001=b.surveyinstanceid , cast(b.protosurveyid int) in (select protosurveyid dbo.fn_filter_getprotosurveysallowedshort(@securityobjectuserid, 'clientaccess',null))         datasetsmaterializedinternalrowsetid = 5     )     select               products.productid  productid             ,products.productname  productname             ,productcategories.productcategoryid  productcategoryid             ,productcategories.productcategory   productcategory             ,productsubcategories.productsubcategoryid  productsubcategoryid             ,productsubcategories.productsubcategory  productsubcategory             ,brands.brandid brandid             ,brands.brand  brand          (             select                         cast(a.col001 tinyint) productcategoryid                   ,cast(a.col002 tinyint) brandid                   ,cast(a.col003 nvarchar(25)) productid                   ,cast(a.col004 nvarchar(100)) productname                   ,cast(a.col006 tinyint) productsubcategoryid                   ,b.protosurveyid             cte b             inner join datasetsmaterializeddatasqlvariant              on b.productid=cast(a.col003 nvarchar(25))             datasetsmaterializedinternalrowsetid = 3      ) products           inner join     (              select cast(a.col001 tinyint) brandid                    ,cast(a.col002 nvarchar(50)) brand              datasetsmaterializeddatasqlvariant              datasetsmaterializedinternalrowsetid = 1     )brands on products.brandid=brands.brandid     inner join     (              select  cast(a.col001 tinyint) productcategoryid                     ,cast(a.col002 nvarchar(50)) productcategory              datasetsmaterializeddatasqlvariant              datasetsmaterializedinternalrowsetid = 2     ) productcategories on products.productcategoryid=productcategories.productcategoryid     inner join     (              select  cast(a.col001 tinyint) productsubcategoryid                     ,cast(a.col002 nvarchar(50)) productsubcategory              datasetsmaterializeddatasqlvariant              datasetsmaterializedinternalrowsetid = 11     ) productsubcategories on products.productsubcategoryid=productsubcategories.productsubcategoryid  go 

i runs again. ideas how optimize it?

queries insert table variables can't have parallel plan.

try using #temp table instead allow select parallelised.


Comments

Popular posts from this blog

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -

php - Controller/JToolBar not working in Joomla 2.5 -