在Sql数据库怎么循环取主键的值(主键是日期格式的流水号)

Zhang_Jia_Hao1 2017-12-15 01:53:42


主键列就是这种格式,在数据库里面怎么循环获取主键列
...全文
224 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamblues 2018-12-20
  • 打赏
  • 举报
回复
其实吧,可以用between ... and ... update 表 set 字段 where 流水号 between 最小值 and 最大值
Zhang_Jia_Hao1 2017-12-15
  • 打赏
  • 举报
回复
已经解决了!!! 各位大佬看看, declare @no varchar(50) //这个是作为获取主键值的变量 declare @i int //这个是作为循环的条件 set @i =0 while @i<(select count(*) from Table)//根据表的总条数判断循环多少次 begin set @no= (select top 1 OrderNo from Table where OrderNo not in (select top (@i) OrderNo from Table)) //给no赋值,每次获取减掉@i条数的主键 end
Zhang_Jia_Hao1 2017-12-15
  • 打赏
  • 举报
回复
引用 7 楼 duanzi_peng 的回复:
[quote=引用 6 楼 hanjun0612 的回复:] [quote=引用 5 楼 An_Net 的回复:] [quote=引用 1 楼 hanjun0612 的回复:] 什么叫循环获取主键列? 游标?或者 row_number+while循环?
我要修改这个表的一个字段(ZT),但是不是都改为一样, 可以说每次修改都只修改一条数据的ZT,这时候我就要获取这张表的 主键作为where 条件去进行 判断[/quote] 那我就不懂了。 不就是 update table set ZT=值 where orderNo='xxxxx' 吗? 你既然要修改,你肯定知道这个号码啊。不然你怎么确定谁应该更新?[/quote] 嗯,没毛病,应该就是这个意思。不过他得意思应该是要同时多条修改。[/quote] 不是,假设我这张表有80条数据,我每次都只修改一条数据的Z
引用 7 楼 duanzi_peng 的回复:
[quote=引用 6 楼 hanjun0612 的回复:] [quote=引用 5 楼 An_Net 的回复:] [quote=引用 1 楼 hanjun0612 的回复:] 什么叫循环获取主键列? 游标?或者 row_number+while循环?
我要修改这个表的一个字段(ZT),但是不是都改为一样, 可以说每次修改都只修改一条数据的ZT,这时候我就要获取这张表的 主键作为where 条件去进行 判断[/quote] 那我就不懂了。 不就是 update table set ZT=值 where orderNo='xxxxx' 吗? 你既然要修改,你肯定知道这个号码啊。不然你怎么确定谁应该更新?[/quote] 嗯,没毛病,应该就是这个意思。不过他得意思应该是要同时多条修改。[/quote] 不是,假设这张表有80 条数据,我每次只修改一条数据的ZT,但是要循环80次,每次获取不同的orderNo作为where条件
Zhang_Jia_Hao1 2017-12-15
  • 打赏
  • 举报
回复
引用 6 楼 hanjun0612 的回复:
[quote=引用 5 楼 An_Net 的回复:] [quote=引用 1 楼 hanjun0612 的回复:] 什么叫循环获取主键列? 游标?或者 row_number+while循环?
我要修改这个表的一个字段(ZT),但是不是都改为一样, 可以说每次修改都只修改一条数据的ZT,这时候我就要获取这张表的 主键作为where 条件去进行 判断[/quote] 那我就不懂了。 不就是 update table set ZT=值 where orderNo='xxxxx' 吗? 你既然要修改,你肯定知道这个号码啊。不然你怎么确定谁应该更新?[/quote] 就是在不确定的情况下,循环获取这张表的orderNo。
exception92 2017-12-15
  • 打赏
  • 举报
回复
引用 6 楼 hanjun0612 的回复:
[quote=引用 5 楼 An_Net 的回复:] [quote=引用 1 楼 hanjun0612 的回复:] 什么叫循环获取主键列? 游标?或者 row_number+while循环?
我要修改这个表的一个字段(ZT),但是不是都改为一样, 可以说每次修改都只修改一条数据的ZT,这时候我就要获取这张表的 主键作为where 条件去进行 判断[/quote] 那我就不懂了。 不就是 update table set ZT=值 where orderNo='xxxxx' 吗? 你既然要修改,你肯定知道这个号码啊。不然你怎么确定谁应该更新?[/quote] 嗯,没毛病,应该就是这个意思。不过他得意思应该是要同时多条修改。
正怒月神 版主 2017-12-15
  • 打赏
  • 举报
回复
引用 5 楼 An_Net 的回复:
[quote=引用 1 楼 hanjun0612 的回复:] 什么叫循环获取主键列? 游标?或者 row_number+while循环?
我要修改这个表的一个字段(ZT),但是不是都改为一样, 可以说每次修改都只修改一条数据的ZT,这时候我就要获取这张表的 主键作为where 条件去进行 判断[/quote] 那我就不懂了。 不就是 update table set ZT=值 where orderNo='xxxxx' 吗? 你既然要修改,你肯定知道这个号码啊。不然你怎么确定谁应该更新?
Zhang_Jia_Hao1 2017-12-15
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
什么叫循环获取主键列? 游标?或者 row_number+while循环?
我要修改这个表的一个字段(ZT),但是不是都改为一样, 可以说每次修改都只修改一条数据的ZT,这时候我就要获取这张表的 主键作为where 条件去进行 判断
Zhang_Jia_Hao1 2017-12-15
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
select 主键列 from 你的table 。 如果不清楚最基本得查询sql语句得话,http://csharp.net-informations.com/
我要修改这个表的一个字段(ZT),但是不是都改为一样, 可以说每次修改都只修改一条数据的ZT,这时候我就要获取这张表的 主键作为where 条件去进行 判断,假设这张表有80条数据, select 主键列 from table 这样能行?
Zhang_Jia_Hao1 2017-12-15
  • 打赏
  • 举报
回复
我要修改这个表的一个字段(ZT),但是不是都改为一样, 可以说每次修改都只修改一条数据的ZT,这时候我就要获取这张表的 主键作为where 条件去进行 判断,假设这张表有80条数据, select 主键列 from table 这样能行?
正怒月神 版主 2017-12-15
  • 打赏
  • 举报
回复
什么叫循环获取主键列? 游标?或者 row_number+while循环?
exception92 2017-12-15
  • 打赏
  • 举报
回复
select 主键列 from 你的table 。 如果不清楚最基本得查询sql语句得话,http://csharp.net-informations.com/
Oracle数据库设计策略及规范 设计策略及规范 1. 目的 定义Oracle数据库设计规范,作为数据库规划、设计、开发以及维护人员的技术参考资料。用以规范和指导相关人员的设计行为。 2. 概述 本文档根据Oracle数据库性能特点,描述对表、视图、存储过程、对象命名等方面的设计规范。 3. 基本策略 3.1 设计策略 分类拆分数据量大的表。 对于经常使用的表(如某些参数表或代码对照表),由于其使用频率很高,要尽量减少表中的记录数量。例如,银行的户主账表原来设计成一张表,虽然可以方便程序的设计与维护,但经过分析发现,由于数据量太大,会影响数据的迅速定位。如果将户主账表分别设计为活期户主账、定期户主账及对公户主账等,则可以大大提高查询效率。 分区策略 在拥有数500行以上的表时,采用分区策略。 索引设计。 对于大的数据库表,合理的索引能够提高整个数据库的操作效率。在索引设计中,索引字段应挑选重复较少的字段;在对建有复合索引的字段进行检索时,应注意按照复合索引字段建立的顺序进行。例如,如果对一个5万多条记录的流水表以日期流水号为序建立复合索引,由于在该表中日期的重复接近整个表的记录数,用流水号进行查询所用的时间接近3秒;而如果以流水号为索引字段建立索引进行相同的查询,所用时间不到1秒。因此在大型数据库设计中,只有进行合理的索引字段选择,才能有效提高整个数据库的操作效率。 有时候为了提高性能。减少表的关联,恰当的数据冗余是允许的。 索引对新增,删除,更新的性能影响比较大,对相关的表的索引使用要权衡 为表和索引建立不同的表空间,禁止在系统表空间中放入非核心oracle系统成分的对象, 确保数据表空间和索引表空间位于不同的磁盘磁盘驱动器上。 对于经常发生同时查询或频繁查询的表,最好把他放到不同的磁盘空间上 4. 逻辑设计规范 4.1 范式 如果没有性能上的原因,应该使用关系数据库理论,达到较高的范式,避免数据冗余。 如果在数据量上与性能上无特别要求,考虑到实现的方便性可以有适当的数据冗余,但基本上要达到3NF。 4.2 表设计 对于数据量比较大的表,根据表数据的属性进行分区,以得到较好的性能。如果表按某些字段进行增长,则采用按字段范围进行范围分区;如果表按某个字段的几个关键进行分布,则采用列表分区;对于静态表,则采用Hash分区或列表分区;在范围分区中,如果数据按某关键字段均衡分布,则采用子分区的复合分区方法。 每个表均创建类型为Sequence的主键字段。 每个表中需含有如下几个基本字段:一个表的SEQ号,4个创建信息字段,5-8个备用字段,一个删除标记字段,最好还有一个行版本字段 字段名 类型 备注 业务SEQ号 整数型 作为表主键 OBLIGATE1 字符型 备用字段 OBLIGATE2 OBLIGATE3 OBLIGATE4 OBLIGATE5 CREATE_USER_ID VARCHAR 创建用户ID CREATE_DATETIME DATE 创建时间 LAST_UPDATE_USER_ID VARCHAR 更新用户ID LAST_UPDATE_DATETIME TIMESTAMP 更新时间 不要用Identify字段作为表的主键与其它表关联。 4.3 索引设计 常规OLTP应用,创建B-TREE索引,不创建位图索引。 不需要为小型数据表(<5000)创建索引。 给单个表创建的索引不超过5个,特别是海量交易类表。 索引条件查询结果记录,不超总记录的20%。 不要给固定选项的字段创建独立索引。 如只有'男,女'的性别字段;'是,否'的状态字段等,不要创建独立索引,位可以建立复合索引。 对于复合索引,索引字段顺序比较关键,把查询频率比较高的字段排在索引组合的最前面。 索引放到独立的表空间,该表空间不需要REDO LOG。 含有外键约束的表的字段,必须有单独索引。如订单明细的表头外键。 5. 对象命名规范 5.1 一般规范 5.1.1 语言 命名使用英文单词,不使用复数。 Oracle数据库设计策略及规范全文共3页,当前为第1页。 英文单词使用同对象本身意义相对或相近的单词。选择最简单或最通用的单词。不能使用毫不相干的单词来命名。 Oracle数据库设计策略及规范全文共3页,当前为第1页。 当一个单词不能表达对象含义时,用词组组合,如果组合太长时,采用简写或缩写,缩写要基本能表达原单词的意义。 当出现对象名重名时,是不同类型对象时,加类型前缀或后缀以示区别。 禁止使用中文或拼音缩写进行命名 5.1.2 大小写 名称一律大写,以方便不同数据库移植,以及避免程序调用问题 5.1.3 单词分隔 命名的各单词之间使用下划线进行分隔。 命名的各单词之间不允许有空格存在 5.1.4 保留字 命名不允许使用SQL保留字。 5.1.5 
`"信息系统数据库技术(一)"课程设计要求 1. 课程设计基本步骤 1.提出问题。首先确定用户对象,描述用户业务现状。 2.数据库设计。设计E_R模型,设计关系数据。 3.系统实现。基于Access或SQL SERVER环境,建立数据库,建立相应的表和视图,建立表间联系,实现各种数据约束。 4.调试运行。输入测试数据,进行调试分析,纠正错误。 2. 课程设计文档要求 根据课程设计基本步骤组织文档。 1. 封面。 2. 系统开发目的。确定系统应用环境,及统开发目的。 3. 系统概述。确定用户对象,描述用户业务现状,确定系统功能。 4. 数据模型设计。由用户业务需求得出数据E_R模型。 5. 数据库设计。由E_R模型转换成数据表,建立表间联系。规范表设计至4NF(如有特殊情 况未达到4NF需说明理由)。 6. 数据库实现。基于Access或SQL SERVER环境,建立数据库,建立数据表,建立表间联系,实现各种数据约束。 7. 调试运行说明。输入测试数据进行调试分析,给出调试运行的有关情况说明。 8. 总结。总结个人在本次课程设计中遇到的问题和心得体会。 9. 成绩评定表。 3. 课程设计具体实施办法 1. 第10周由任课老师给出数据库课程设计题目。 2. 信管0901、0902班至第14周结束,信管1021、1022班至第17周结束,并将所有设计结果 交任课老师。 3. 课程设计提交的具体内容:课程设计文档(每人一份打印稿+电子档,文件命名规则: 学号+姓名,如"080310618唐永.doc")、课程设计数据库文件(文件命名规则:学号+ 姓名)。由课代表将所有打印稿和电子档(每班刻一张光盘,含文档和数据库)收齐 后在规定时间内统一交任课老师。逾期不交者视为弃考,按学校相关规定参加重修或 者重新分配题目参加补考。 4. 期终考核成绩构成:南院总计100分,课程设计占80%,平时成绩占20%。北院总计100 分,课程设计占70%,平时成绩占30%。 社会养老保险数据库设计与实现 1. 系统开发目的 通过理论与实践教学,掌握关系型数据库的基本操作,理解关系型数据库的有关概念 ,具备一定的数据库结构设计的能力,并能综合运用所学知识,进行小型数据库应用系 统的开发工作。本次课程设计是基于ACCESS 2003数据库进行的社会养老保险数据库系统设计与实现。 2. 系统概述 此系统建立了社会养老保险数据库应用系统,适用于农村社会养老保险处理。用户主 要为农村乡镇参保人员。社会养老保险数据库系统的设计与实现主要完成以下几个功能 :实现对参保、缴费、发放、终保、退保、转出、给付开户的数据存储及各种业务状态 的查询。 3. 数据模型设计 1、缴费信息原始单据及E-R模型 图一: 图二: 图三: 2、开户信息原始单据及E-R模型 图四: 3、终保信息原始单据及E-R模型 图五: 4、退保信息原始单据及E-R模型 图六: 5、转出信息原始单据及E-R模型 图七: 6、发放原始单据及E-R模型 图八: 7、人员变更信息及原始单据及E-R模型 图九: 分析说明。。。 2、整体E_R模型 4. 数据库设计。 5. 数据库实现。 1、发放标准信息数据表 "字段名称 "数据类型 "索引 "其他 " "个人编号 "文本(50) "有(无重复) "主键,NOT NULL " "起始时间 "日期/时间 "有(有重复) "主键 " "截止时间 "日期/时间 "有(有重复) " " "发放金额 "货币 "有(有重复) "默认:0 " 2、发放信息数据表 "字段名称 "数据类型 "索引 "其他 " "个人编号 "文本(50) " "主键, NOT NULL " "发放年月 "日期/时间 "有(有重复) "主键,NOT NULL " "发放金额 "货币 "有(有重复) "默认:0 " 3、给付开户信息数据表 "字段名称 "数据类型 "索引 "其他 " "单据流水号 "文本(50) "有(无重复) "主键,NOT NULL " "补贴额 "货币 "有(有重复) "默认:0 " "开户日期 "日期/时间 "有(有重复) " " "个人编号 "文本(50) "有(无重复) "外键,NOT NULL " 4、机构信息数据表 "字段名称 "数据类型 "索引 "其他 " "机构编号 "文本(50) "有(无重复) "主键,NOT NULL " "机构名称 "文本(50) " "NULL " 5、集体信息数据表 "字段名称 "数据类型 "索引 "其他 " "集体编号 "文本(50) "有(无重复) "主键,NOT NULL " "集体名称 "文本(50) "有(有重复) "NULL " 6、乡镇信息数据表 "字段名称 "数据类型 "索引 "其他 " "乡镇编号 "文本(50) "有
服装销售系统数据库设计 一:需求描述 某服装连锁店要开发一套服装销售管理软件,对日常的服装销售进行信息化管理,要 求该软件实现服装销售行业的采购订货、退货、前台零售、批发业务、促销管理、会 员管理、库存管理、库存盘点等各个业务流程,把服装销售行业的进货、退货、销售 、库存、财务等业务实现一体化管理。 开发该软件有两大部分工作要做:第一后台数据库的设计;第二前端界面功能开发。 现阶段我们要完成后台数据库的设计。为了方便起见,我们实现对服装销售核心业务 "销售管理"子模块的设计。该模块实现"服装的基础信息维护、服装销售、常见查询、 利润统计、销售冠军排名"等功能。 二:开发环境 开发工具:SQL Server2005 企业版。 三:技能点 (1)、在SQL Server中创建库、建表、建约束。 (2)、INSERT、UPDATE、DELETE、SELECT语句。 (3)、统计函数:如SUM、COUNT、AVG等。 (4)、多表关联查询。 (5)、GROUP By分组统计。 四:问题分析 为了实现服装销售管理,需要建立数据库及数据表对数据进行有效存储。经过分析, 涉及到的数据表至少有服装基础表和服装销售表。以下为服装基础表和服装销售表。 1. 服装基础表(clBaseInfo) "字段名称 "数据类型 "描述 " "SectionCode "varchar(5) "款号,服装款型编号,必填项。" " " "只能是5位字符,并且前两为是"" " " "MC"。如"MC201"。 " "BarCode "char(8) "服装条形码,服装的唯一标识," " " "主键。规则"款号+3位流水号"," " " "一款服装可能会有不同颜色或尺" " " "码。 " "clName "varchar(100"服装名称,必添项。 " " ") " " "Type "varchar(20)"服装类别。如男鞋、女鞋、上衣" " " "、裤子。 " "Brand "varchar(100"品牌,服装的品牌信息。 " " ") " " "Fabric "varchar(20)"面料。如"纯棉、皮、革、"默认" " " ""纯棉" " "clSize "varchar(20)"尺码。只能是"L、S、M、XL"中 " " " "的一种,因为L号较为常见,默 " " " "认为"L"。 " "Color "varchar(50)"颜色 " "SalesPrice "float "销售单价 " "InPrice "float "进货价格 " 表3.1 服装表(clBaseInfo) 2. 服装销售表(clSales) "字段名称 "数据类型 "描述 " "ID "int "标识列,主键。 " "ShopName "varchar(100"连锁店名,必填项。默认"人百" " ") "店" " "SalesMan "varchar(30)"销售员姓名 " "SalesDate "datetime "销售日期。默认为系统当天。 " "SalesCode "varchar(10)"销售单号,必填项。长度是10 " " " "位字符串。且前4位为"2010"," " " "中间2位为分店简码,后4位为 " " " "数字型流水号。 " "BarCode "char(8) "服装条形码。外键。 " "SalesCount "int "销售数量,必填项。数范围 " " " "大于0. " "Rebeat "float "折扣,默认为1,代表不打折。" "payType "varchar(20)"付款方式:可以是"现金、银行" " " "卡、信誉卡、代金券",默认" " " " "现金" " "Total "money "实收金额 " 表3.2 服装销售表(clSales) 五:任务实现 1. 创建数据库 在本机D盘新建文件夹SalesProject,在SQL Server Managerment Studio中按要求创建数据库SalesDB,保存在SalesProject文件夹下。主数据库文件增 长率为12%,日志文件增长率为5%,并且日志文件最大为50M。 2. 创建数据表 (1)、在数据库中创建服装基础表clBaseInfo,逐一设置字段名、字段长度、数据 类型 等。 (2)、在数据库中创建服装销售表clSales。 3. 增加约束 根据表3.1说明部分要求,设置各列约束: (1)、必填项,表明该字段应添加非空约束。 (2)、服装条形码,为主键列,应增加主键约束。 (3)、有默认的应增加默认约束。 (4)、款号列应配合LIKE关键字增加检查约束。 根据表3.2说明部分要求,设置各列约束: (1)、ID增加标识列约束,标识种子为1,标识增量为1;并设置主键约束。 (2)
1 性能优化 1.1 避免频繁 commit,尤其是把 commit 写在循环体中每次循环都进行commit。 1.2 使用绑定变量,避免常量的直接引用。 示例:以下书写不符合本规范。 INSERT INTO sm_users (user_id, user_name, created_by, creation_date) VALUES (1, 'Tang', -1, SYSDATE); 建议用如下方式操作: DECLARE v_user_id sm_users.user_id%TYPE; v_user_name sm_users_user_name%TYPE; v_created_by sm_users.created_by%TYPE; v_creation_date sm_users.creation_date%TYPE; BEGIN ... INSERT INTO sm_users (user_id, user_name, created_by, creation_date) VALUES (v_user_id, v_user_name, v_created_by, v_creation_date); END; 1.3 Operator 的使用规范  IN  比较容易写及清晰易懂  但效能是比较低的  ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。  NOT IN  此操作是强列推荐不使用的,因为不能应用表的索引。  推荐方案:用NOT EXISTS 或(Outer-Join+判断为空)方案代替 例如: SELECT deptno FROM dept WHERE deptno NOT IN(SELECT deptno FROM emp) 建议写成: SELECT deptno FROM dept, emp WHERE dept.deptno = emp.deptno(+) AND emp.deptno IS NULL  <>  永远不会用到索引的  推荐方案:用其它相同功能的操作运算代替,如: a<>0 改为 a>0 or a<0 a<>’’ 改为 a>’’  IS NULL 或IS NOT NULL  一般是不会应用索引的,因为B-tree索引是不索引空的。  推荐方案:用其它相同功能的操作运算代替,如: a is not null 改为 a>0 或a>’’  不允许字段为空,而用一个default代替空,如业扩申请中状态区位不允许为空, default为申请。  > 及 <  有索引就会采用索引查找  但有的情况下可以对它进行优化  如一个表有100万记录,一个数型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。  LIKE  LIKE可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。性能肯定大大提高。  UNION  SQL在运行时先出数个查询的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。  实际大部分应用中是不会产生重复的记录,推荐采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。  Exists 示例:当有 A、B 两个结果集,当结果集 B 很大时,A 较小时,适用 exists,如: SELECT * FROM a WHERE EXISTS(SELECT 1 FROM b WHERE a.COLUMN = b.COLUMN); 当结果集 A 很大时,B 很小时,适用 in,如: SELECT * FROM a WHERE a.COLUMN IN(SELECT b.COLUMN FROM b) 1.4 SQL书写的影响  同一功能同一性能不同写法SQL的影响  Select * from zl_yhjbqk  Select * from dlyx.zl_yhjbqk(带表所有者的前缀)  Select * from DLYX.ZL_YHJBQK(大写表名)  Select * from DLYX.ZL_YHJBQK(中间多了空格)  以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。  WHERE后面的条件顺序影响  Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1  Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'  以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。  查询表顺序的影响  在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析,ORACLE会自动先进小表的链接,再进行大表的链接)  对条件字段的一些优化  采用函数处理的字段不能利用索引,如: substr(hbs_bh,1,4)=’5400’,优化处理:hbs_bh like ‘5400%’ trunc(sk_rq)=trunc(sysdate), 优化处理: sk_rq>=trunc(sysdate) and sk_rq50,优化处理:ss_df>30 ‘X’||hbs_bh>’X5400021452’,优化处理:hbs_bh>’5400021542’ sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5 hbs_bh=5401002554,优化处理:hbs_bh=’ 5401002554’ 注:此条件对hbs_bh 进行隐式的to_number转换,因为hbs_bh字段是字符型  条件内包括了多个本表的字段运算时不能进行索引,如: ys_df>cx_df,无法进行优化 qc_bh||kh_bh=’5400250000’,优化处理:qc_bh=’5400’ and kh_bh=’250000’  HINT  是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。它可以对SQL进行以下方面的提示  目标方面的提示:  COST(按成本优化)  RULE(按规则优化)  CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)  ALL_ROWS(所有的行尽快返回)  FIRST_ROWS(第一行资料尽快返回)  执行方法的提示:  USE_NL(使用NESTED LOOPS方式联合)  USE_MERGE(使用MERGE JOIN方式联合)  USE_HASH(使用HASH JOIN方式联合)  索引提示:  INDEX(TABLE INDEX)(使用提示的表索引进行查询)  其它高级提示(如并行处理等等) 1.5 索引的规则: 建立索引常用的原则如下: 1. 表的主键、外键必须有索引 2. 数据量超过 1000 行的表应该有索引 3. 经常与其它表进行连接的表,在边接字段上应建立索引 4. 经常出现在 where 子句中的字段且过滤性极强的,特别是大表的字段,应该建立索引 5. 索引字段,尽量避免为 null 6. 复合索引的建立需要仔细分析;尽量考虑用单字段索引代替:  正确选择复合索引中的第一个字段,一般是选择性较好的且在 where 子句中常的字段上。  复合索引的几个字段是否经常同时以and方式出现在where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引。  如果复合索引中包含的字段经常单独出现在 where 子句中,则分解为多个单字段索引。  如果复合索引所包含的字段超过 3 个,那么仔细考虑其必要性,考虑减少复合的字段。  如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; 7. 频繁 DDL 的表,不要建立太多的索引 8. 删除无用的索引,避免对执行计划造成负面影响 9. 让 SQL 语句用上合理的索引,合理让 SQL 语句使用索引的原则如下:  首先,看是否用上了索引,对于该使用索引而没有用上索引的 SQL 语句,应该想办法用上索引。  其次,看是否用上正确的索引了,特别复杂的 SQL 语句,当其中 where 子句包含多个带有索引的字段时,更应该注意索引的选择是否合理。错误的索引不仅不会带来性能的提高,相反往往导致性能的降低。  针对如何用上合理的索引,以 Oracle 数据中的例子进行说明:  任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数。  避免不必要的类型转换,要了解“隐藏”的类型转换。  增加查询的范围,限制全范围的搜索。  索引选择性低,但资料分布差异很大时,仍然可以利用索引提高效率。  Oracle 优化器无法用上合理索引的情况下,利用 hint 强制指定索引。  使用复合索引且第一个索引字段没有出现在 where 中时,建议使用 hint 强制。 1.6 索引使用优化  建立Plan_Table CREATE TABLE PLAN_TABLE ( STATEMENT_ID VARCHAR2(30), TIMESTAMP DATE, REMARKS VARCHAR2(80), OPERATION VARCHAR2(30), OPTIONS VARCHAR2(30), OBJECT_NODE VARCHAR2(128), OBJECT_OWNER VARCHAR2(30), OBJECT_NAME VARCHAR2(30), OBJECT_INSTANCE NUMBER(38), OBJECT_TYPE VARCHAR2(30), OPTIMIZER VARCHAR2(255), SEARCH_COLUMNS NUMBER(38), ID NUMBER(38), PARENT_ID NUMBER(38), POSITION NUMBER(38), OTHER LONG )  Syntax 说明: explain plan set statement_id = user_define for select ... 将结果显示 SELECT LPAD(' ', 2 *(LEVEL - 1)) || operation op, options, object_name, POSITION FROM plan_table START WITH ID = 0 AND STATEMENT_ID = user_define CONNECT BY PRIOR ID = parent_id AND STATEMENT_ID = user_define  示例 如要测试下面SQL: SELECT c.short, a.cday, a.card_no, a.qty FROM sales.stockiohis a, sales.product_info b, sales.vendor c WHERE a.card_no = b.card_no AND b.vendorid = c.vendorid AND a.produce_no = '2007090001' AND a.CATEGORY = '10' AND a.iotype = '1' 新增文件:例 d:\mydoc\plan.sql '0001'为user_define为使用者自定义编号 EXPLAIN PLAN SET STATEMENT_ID = '0001' FOR SELECT 'X' FROM sales.stockiohis a ,sales.product_info b ,sales.vendor c WHERE a.card_no = b.card_no AND b.vendorid = c.vendorid AND a.produce_no = '2007090001' AND a.CATEGORY = '10' AND a.iotype = '1' / SET arraysize 1 SET line 100 COLUMN op format a40 COLUMN object_name format a20 COLUMN options format a20 SELECT LPAD(' ', 2 *(LEVEL - 1)) || operation op, options, object_name, POSITION FROM plan_table START WITH ID = 0 AND STATEMENT_ID = '0001' CONNECT BY PRIOR ID = parent_id AND STATEMENT_ID = '0001' / DELETE FROM plan_table WHERE STATEMENT_ID = '0001' / COMMIT / 结果 1.7 避免不必要的排序 说明:对查询结果进行排序会大大的降低系统的性能,group与union都会对数据作排序,要耗费较多的内存,视状况用union all既可,不然有时数据太大又要进行union的排序,会导致Oracle数据库SORT_AREA_SIZE不足发生系统错误。 1.8 对于数字型的Primary Key,建议用序列 sequence 产生。 说明:除非是单据的单号,要求必须是唯一,并且依据流水号不可以跳号,不然在大量交易的表格中,不在乎跳耗时,要得唯一的Primary Key 建议使用Oracle Sequence这样速度会较快,而且不会有锁定(Lock)的问题。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧