所以这是我的问题。我正在创建一个“映射”文档,以便更轻松地从不熟悉的数据库进行数据分析。我将其复制到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
答案 0 :(得分:0)
检查您的计划看起来第一次插入成本最高。
可以重写为
insert into @tbl
select distinct [Tst_Field] as fld
from DBO.TestTbl
where [Tst_Field] is not null
试一试,让我知道