整个模式中所有列的样本数据和不同计数 - 优化

时间:2015-11-05 16:44:28

标签: sql sql-server sql-server-2008 tsql

所以这是我的问题。我正在创建一个“映射”文档,以便更轻松地从不熟悉的数据库进行数据分析。我将其复制到Excel文档中以方便使用。我有标准的INFORMATION_SCHEMA之类的东西,如列名,data_type等......但是我需要一个数据采样来使映射决策更容易。

代码需要的项目:

  

X架构中每列的列内容示例(在我的示例中为CONV)。

我在代码中解决了这个问题:如果它有所有nulls =“All Nulls”,如果它有一个唯一值=“Unique Value:[value here]”,并且它有多个值“Multiple Values:[逗号分隔的引用列表就在这里]和[计数不同 - 如果有超过3个不同的项目则为3]。“

问题:

  

这的本质是它运行缓慢。我有什么事吗   可以做什么来优化这个数量不同?

if exists (select 1 from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'dbo' and TABLE_NAME = 'MappingUniqueValuesTbl')begin drop table dbo.MappingUniqueValuesTbl end
create table dbo.MappingUniqueValuesTbl (UniqueVal varchar(max),tblname varchar(max),colname varchar(max))

set nocount on

SET ANSI_WARNINGS OFF

declare UniqVal cursor 
for

select 
 'declare @tbl table (id numeric(12) IDENTITY(1,1),fld varchar(max))'
+' insert into @tbl'
+' select fld'
+'   from(select fld = ['+COLUMN_NAME+']'
+'  from '+TABLE_SCHEMA+'.'+TABLE_NAME
+' group by ['+COLUMN_NAME+']) T'
+' where fld is not null'
+' declare @cnt numeric(10) = isnull((select MAX(id) from @tbl),0)'
+' declare @top3 varchar(max) = '''''
+' set @top3 = @top3+isnull(''"''+(select left(fld,25)+case when len(fld)>25 then ''...'' else '''' end from @tbl where id = 1)+''"'','''')'
+' set @top3 = @top3+isnull('',''+''"''+(select left(fld,25)+case when len(fld)>25 then ''...'' else '''' end from @tbl where id = 2)+''"'','''')'
+' set @top3 = @top3+isnull('',''+''"''+(select left(fld,25)+case when len(fld)>25 then ''...'' else '''' end from @tbl where id = 3)+''"'','''')'
+' insert into dbo.MappingUniqueValuesTbl '
+' select UniqueVal = ('
+' select case when @cnt = 0 then ''All Nulls'''
+'  when @cnt = 1 then ''Unique Value: '' + @top3'
+'    when @cnt > 1 then ''Multiple Values: '+CHAR(39)
+' +@top3+case when @cnt > 3 then '', and ''+cast(@cnt-3 as varchar(10))+'' more.'' else '''' end'
+'   end) ,'''+TABLE_NAME+''' ,'''+replace(COLUMN_NAME,CHAR(39),CHAR(39)+'+CHAR(39)+'+CHAR(39))+''''
  from INFORMATION_SCHEMA.COLUMNS
 where TABLE_SCHEMA = 'CONV'
   and TABLE_NAME not like '%BAK%'

open UniqVal
declare @sqlexec varchar(max)
  fetch next 
   from UniqVal into @sqlexec
  while (@@FETCH_STATUS = 0)
        begin 
        --select @sqlexec
        exec (@sqlexec)
        print cast(getdate() as time)
        fetch next from UniqVal into @sqlexec
        end
  close UniqVal
deallocate UniqVal
set nocount off
SET ANSI_WARNINGS ON

-- Select Results
select * from dbo.MappingUniqueValuesTbl
go

这会产生每个列的以下单个实例。

declare @tbl table (id numeric(12) IDENTITY(1,1),fld varchar(max)) 
insert into @tbl
select fld   
  from(select fld = [Tst_Field]  
         from DBO.TestTbl
        group by [Tst_Field]) T 
 where fld is not null 
declare @cnt numeric(10) = isnull((select MAX(id) from @tbl),0) 
declare @top3 varchar(max) = '' 
set @top3 = @top3+isnull('"'+(select left(fld,25)+case when len(fld)>25 then '...' else '' end from @tbl where id = 1)+'"','') 
set @top3 = @top3+isnull(','+'"'+(select left(fld,25)+case when len(fld)>25 then '...' else '' end from @tbl where id = 2)+'"','') 
set @top3 = @top3+isnull(','+'"'+(select left(fld,25)+case when len(fld)>25 then '...' else '' end from @tbl where id = 3)+'"','') 
insert into dbo.MappingUniqueValuesTbl  
select UniqueVal = (
        select case when @cnt = 0 then 'All Nulls'  
                    when @cnt = 1 then 'Unique Value: ' + @top3    
                    when @cnt > 1 then 'Multiple Values: ' +@top3+case when @cnt > 3 then ', and '+cast(@cnt-3 as varchar(10))+' more.' else '' end   
                     end) 
      ,'TestTbl' 
      ,'Tst_Field'

希望这很清楚,任何提示或想法都是惊人的

最后一点:我确实找到了doing something similar的人,但是他们所有的桌子都有不同的数据。我想不出如何修改它以适应我需要的东西。

根据Juan的请求,这是我的一个列上的实际执行计划。 https://drive.google.com/file/d/0B9n-RmuEDGf6eEVzU2xOQkEtaXM/view?usp=sharing

另外,这是图像:

编辑:再显示一张图片,以显示未编入索引的内容,我认为这是我的问题。Non-Indexed Actual Plan

1 个答案:

答案 0 :(得分:0)

检查您的计划看起来第一次插入成本最高。

可以重写为

insert into @tbl
   select distinct [Tst_Field] as fld
   from DBO.TestTbl
   where [Tst_Field] is not null 

试一试,让我知道