SQLServer导数据到Oracle,索引阐述系列八

2019-10-20 00:12 来源:未知

if exists(select * from sys.objects where name='存款和储蓄进程名称')
drop proc 存款和储蓄进程名称
go
CREATE proc 存款和储蓄进程名称
@tableName varchar(8000),          --表名、视图名
@indexCol varchar(50) = 'a.id',      --标志列名(如:举例主键、标记,推荐使用索引列)
@pageSize int = 10,                --页面大小
@pageIndex int = 0,                --当前页
@orderCol varchar(100) = 'a.id desc',--排序 (如:id)
@where varchar(max) = '',         --条件
@columns varchar(500) = '*'        --要突显的列
as
declare @sql varchar(max)
declare @sql2 varchar(max)
declare @where2 varchar(max)

二. 总计消息分析

--查询统计信息
DBCC SHOW_STATISTICS(tablename,'indexname')

  下边是三个头昏眼花的计算新闻,上贰回革新计算信息时间是二零一八年十月8日,间距未来有二个多月没更新了,也正是说更新标准未有高达(退换达到500次

  • 百分之六十的行数变动)。

  图片 1

  图片 2

  2.1 计算音信三片段:头信息,字段选用性,直方图。
   (1) 头信息

    name:总括消息名称,也是索引的名字。
    updated:上三回总结新闻更新时间(主要)。
    rows:上贰遍计算表中的行数,反映了表里的数据量。
    rows Sampled: 用于总结音信统计的抽样总行数。当表格数据相当的大,为了降耗,只会取一小部分多少做抽样。  rows sampled<rows时候总结新闻或许不是最标准的。
    steps:把多少分为几组。最多200个组,每一种直方图梯级都含有八个列值范围,后跟上限列值。
    density:索引第一列前缀的接纳性。查询优化器不选择此 Density, 值此值的指标是为着与 SQL Server 2009 以前的版本完结向后非常。
    average key length:索引列平均字节数。
    string index: YES 代表字符串索引。

  (2)数据字段选择性

    all density: 反映了索引列的选料度。它突显了数码集里重复的数据量多少,如果数量很稀少重新,那么它选取性就相比较高。 密度为 1/非重复值。值越小选拔性就越高。倘诺值仅次于了0.1,那索引的选拔性就丰盛高了(那或多或少经过翻看自增ID主键索引列,非常显著低于了0.1的值)。
    average length: 索引列平均字节长度 比如model 列值平均长度是二十二个字节。
    columns:索引列名称

  (3)直方图(对应steps 组)

      直方图测量数据集中各样非重复值的出现频率。 查询优化器依据总计消息目的第一个键列中的列值来测算直方图,它选用列值的方法是以总计方法对行进行抽样或对表或视图中的全部行实施完全扫描。
    range_hi_key: 列值也叫做键值。直方图里每少年老成组(step)数据最大值 。上海体育场所值是model字符串类型
    range_rows:每组数据区间猜测数目。
    eq_rows:表中值与直方图每组数据库上限相等的数目
    distinct_range_rows:每组中国和南美洲双重数目, 如果没有再一次则range_rows等于distinct_range_rows值。
    avg_range_rows:每组数据区间重复值平平均数量据, (range_rows)

 

 三. 人工维护的两种情状

1.询问施行时间不长
  假诺查询响应时间非常短或不足预见,则在举行其他故障排除步骤前,确认保障查询全数新颖的总计音讯。
2.在升序或降序键列上发生插入操作。
  与查询优化器试行的总结新闻更新相比较,升序或降序键列(举例 IDENTITY 或实时岁月戳列)上的计算新闻只怕供给更频仍地创新。插入操作将新值追加到升序或降序键列上
3.在保卫安全操作后。
  思索在实行爱抚进程(举个例子截断表或对比一点都不小百分比的行施行大体量插入)后更新总计消息。 那足以制止在未来查询等待自动总结新闻更新时在询问管理中冒出延迟。

-- 更新统计信息
UPDATE STATISTICS tablename(indexname)

  更新总计新闻可确认保证查询利用新型的总计消息实行编写翻译。 不过,更新总结音讯会招致查询重新编译。 大家建议并不是太频仍地换代总结新闻,因为急需在创新询存候顿和再度编译查询所用时间里面权衡质量。

但从导出导入的速度来讲,是最快的,平面文件能够跨不一致的数据库举行搬迁。如若数据不容忍错过,只好通过工具来导了,但速度会绝对异常慢。

GO

一.概述  

  sql server在快速查询值时独有索引还非常不够,还索要精晓操作要管理的数据量有微微,进而猜测出复杂度,选用一个代价小的实践安顿,那样sql server就知道了数额的布满景况。索引的总结值音讯,还放置战略用来在向来不索引的性质列上成立计算值。在有目录和未有索引的习性列上总计值音讯会被活动敬重。超越四分之二处境下无需手动去维护计算消息。   
  成效是 sqlserver 查询优化器使用总括新闻来创立可抓牢查询品质的询存候顿。 对于大大多查询,查询优化器已为高水平查询安顿生成必须的计算音讯。各种索引都会自动创设总括新闻, 总结消息的准头直接影响指令的进程,实践陈设的选料是依据计算音讯。

  1.1 属性列总括值
  暗许景况下,每当在一个查询的where子句中动用非索引属性列时,sqlserver会自动地创立计算值,计算名称以_WA_Sys开头。

-- 查看表中非索引的统计信息
 sp_helpstats PUB_Search_Log

   如下所示:

 图片 3图片 4

  1.2 自动更新总括消息的阀值

  在自动更新计算信息选项 AUTO_UPDATE_STATISTICS 为 ON 时,查询优化器将鲜明总结音信几时大概过期。查询优化器通过总计自最终计算音讯更新后数据修改的次数何况将那风华正茂修改次数与某风度翩翩阈值实行相比,鲜明总括音信曾几何时大概过期。
  (1)假使在评估时间总结新闻时表基数为 500 或更低,则每达到 500 次修改时更新一遍。
  (2)假若在评估时间计算音信时表基数大于 500,则转移每达到 500 + 十分四的行数更新三回(大表极度要介意更新时间)

[oracle@ttoracle /data/import]$ cat import-t1.log 

SQL*Loader: Release 11.2.0.1.0 - Production on Fri Jun 15 12:46:09 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Control File:   import-t1.ctl
Character Set ZHS16GBK specified for all input.

Data File:      /data/import/t1.txt
  File processing option string: "str '
'"
  Bad File:     t1.bad
  Discard File:  none specified

 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:     64 rows, maximum of 256000 bytes
Continuation:    none specified
Path used:      Conventional

Table SCOTT.T1, loaded from every logical record.
Insert option in effect for this table: INSERT
TRAILING NULLCOLS option in effect

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
CARID                               FIRST     *           CHARACTER            
    Terminator string : '||'
ADDTIME                              NEXT     *           DATE YYYY-MM-DD HH24:MI:SS
    Terminator string : '||'
LASTSEARCHTIME                       NEXT     *           DATE YYYY-MM-DD HH24:MI:SS
    Terminator string : '||'
UPDATETIME                           NEXT     *           DATE YYYY-MM-DD HH24:MI:SS
    Terminator string : '||'
CARTYPE                              NEXT     *           CHARACTER            
    Terminator string : '||'
USERTELEPHONE                        NEXT     *           CHARACTER            
    Terminator string : '||'
ISCORRECT                            NEXT     *           CHARACTER            
    Terminator string : '||'
USERID                               NEXT     *           CHARACTER            
    Terminator string : '||'
VALIDFLAG                            NEXT     *           CHARACTER            
    Terminator string : '||'
CHANNEL                              NEXT     *           CHARACTER            
    Terminator string : '||'
CARCODE                              NEXT     *           CHARACTER            
    Terminator string : '||'
ENGINENUMBER                         NEXT     *           CHARACTER            
    Terminator string : '||'
CARNUMBER                            NEXT     *           CHARACTER            
    Terminator string : '||'


Table SCOTT.T1:
  18495032 Rows successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.


Space allocated for bind array:                 214656 bytes(64 rows)
Read   buffer bytes: 1048576

Total logical records skipped:          0
Total logical records read:      18495032
Total logical records rejected:         0
Total logical records discarded:        0

Run began on Fri Jun 15 12:46:09 2018
Run ended on Fri Jun 15 12:55:58 2018

Elapsed time was:     00:09:48.90
CPU time was:         00:03:37.62
  • ' From ' + @tableName + @where +  ' Order by '+ @orderCol +'))'
    select @sql = @sql + @where2
    select @sql = @sql + ' Order by ' + @orderCol
    --得到数据集
    exec (@sql)
    PRINT @sql
    select @sql2 = Replace(@sql2,'Top ' + Convert(varchar(10), @pageSize) + ' ' + @columns, 'count(1)')
    --得到总量量条数
    exec(@sql2)
  • 字符编码
  • 字段分隔符
  • 行终止符
  • 日子或时刻格式
  • 特殊字符
  • 导入字段的逐意气风发
  • 导文件文件的表字段类型和长短是不是适宜

select @sql = 'Select Top ' + Convert(varchar(10),@pageSize) + ' ' + @columns + ' From ' + @tableName
select @sql2 = @sql + @where
select @sql =  @sql + ' Where ' + '(' + @indexCol + ' Not In (Select Top ' + Convert(varchar(10),  ((@pageIndex-1)*@pageSize)) + ' ' + @indexCol

如若导出时还亟需做一些数额的管理,举例多表关联,字符管理等,相比复杂的逻辑,最佳是做成存款和储蓄进程,BCP直接调用存款和储蓄进度就能够。

if @where <> ''
begin
    select @where2 = ' And ' + @where
    select @where = ' Where ' + @where
end
else
    select @where2 = ''

从SQLServer导数据到Oracle大概有以下两种办法:

把以下的内容用vi,写到import-t1.ctl

使用Oracle的SQL*LOADE瑞鹰导入平面文件。假如Oracle中有已经创制好的表,与导入文本对应。

TAG标签:
版权声明:本文由澳门金莎娱乐网站发布于数据库,转载请注明出处:SQLServer导数据到Oracle,索引阐述系列八