I am trying to insert some data into some stage tables where the insert is taking far too long. For example a table containing up 600000 records is taking nearly an hour to complete. In the select part of the query we are are creating a hash of the columns which is later used for change detection. Due to the Data Warehouse methodology we are using, DataVault, we cannot remove the change hash. When I look at the execution plan I see warnings of type conversion in expression. and example is shown below.
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(max),[load].[load_acbs_loan_product_dimension].[product_month],0)" />
I have also included a example of an insert statement that we are using:
INSERT INTO [stage_acbs_balance_category_dimension]
( hk_h_balance_category_dimension
, balance_category_key
, balance_category_code
, balance_category_description
, balance_class_code
, balance_class_description
, user_define_code_1
, user_define_code_2
, user_define_code_3
, user_define_code_4
, user_define_code_5
, bal_cat_short_name
, include_bal_in_tax_reporting
, include_in_billings_statements
, include_in_past_due_reporting
, dss_change_hash_acbs_balance_category_dimension_lroc
, dss_record_source
, dss_load_date
, dss_create_time)
SELECT CAST(HASHBYTES('sha2_256',
COALESCE(CAST(load_acbs_balance_category_dimension.balance_category_key AS VARCHAR(MAX)),'null')
) AS BINARY(32)) AS hk_h_balance_category_dimension
, load_acbs_balance_category_dimension.balance_category_key AS balance_category_key
, load_acbs_balance_category_dimension.balance_category_code AS balance_category_code
, load_acbs_balance_category_dimension.balance_category_description AS balance_category_description
, load_acbs_balance_category_dimension.balance_class_code AS balance_class_code
, load_acbs_balance_category_dimension.balance_class_description AS balance_class_description
, load_acbs_balance_category_dimension.user_define_code_1 AS user_define_code_1
, load_acbs_balance_category_dimension.user_define_code_2 AS user_define_code_2
, load_acbs_balance_category_dimension.user_define_code_3 AS user_define_code_3
, load_acbs_balance_category_dimension.user_define_code_4 AS user_define_code_4
, load_acbs_balance_category_dimension.user_define_code_5 AS user_define_code_5
, load_acbs_balance_category_dimension.bal_cat_short_name AS bal_cat_short_name
, load_acbs_balance_category_dimension.include_bal_in_tax_reporting AS include_bal_in_tax_reporting
, load_acbs_balance_category_dimension.include_in_billings_statements AS include_in_billings_statements
, load_acbs_balance_category_dimension.include_in_past_due_reporting AS include_in_past_due_reporting
, CAST(HASHBYTES('SHA2_256',
COALESCE(CAST(load_acbs_balance_category_dimension.balance_category_code AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.balance_category_description AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.balance_class_code AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.balance_class_description AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.user_define_code_1 AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.user_define_code_2 AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.user_define_code_3 AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.user_define_code_4 AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.user_define_code_5 AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.bal_cat_short_name AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.include_bal_in_tax_reporting AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.include_in_billings_statements AS VARCHAR(MAX)),'null') +'||'+
COALESCE(CAST(load_acbs_balance_category_dimension.include_in_past_due_reporting AS VARCHAR(MAX)),'null')
) AS BINARY(32)) AS dss_change_hash_acbs_balance_category_dimension_lroc
, load_acbs_balance_category_dimension.dss_record_source AS dss_record_source
, load_acbs_balance_category_dimension.dss_load_date AS dss_load_date
, getdate() AS dss_create_time
FROM [load_acbs_balance_category_dimension] load_acbs_balance_category_dimension
I am looking for a way to get rid of the implicit conversions and get the insert to perform. I initially thought of making the column a computed persisted hash but the hash is non-deterministic. Any ideas would be much appreciated.