如何求解问题一个ORACLE问题

The Will Will Web | 解決一個使用 OracleParameter 影響資料庫查詢效能的問題
我們最近有個專案遇到一個 Oracle 資料庫查詢效能的問題,由於問題有點複雜,我必須先將「前情提要」說明清楚。 運行環境
資料庫版本:Oracle 11g
用戶端版本:
Oracle.DataAccess.dll 組件版本:10.2.0.100& (
) 一些會用到的程式碼 以下是我使用 OracleCommand 與 OracleDataAdapter 的相關方法: public static void FillDataTableBySQL(DataTable dt, string SQL, OracleParameter param1)
OracleCommand cmd = new OracleCommand(SQL, GetConnection());
cmd.Parameters.Add(param1);
FillDataTableByCommand(dt, cmd);
public static void FillDataTableByCommand(DataTable dt, OracleCommand cmd)
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.Fill(dt);
我用來進行資料查詢的程式碼如下:
string SQL = "SELECT * FROM mytable WHERE Field1 = :Field1";
OracleParameter param1 = new OracleParameter("Field1", OracleDbType.NVarchar2, 20);
param1.Value = "TEST";
Utils.FillDataTableBySQL(dt, SQL, param1);
各位看官目前看到這兩段程式會覺得有問題嗎?
我的 mytable 表格中有數十萬筆的資料,Field1 的索引原本沒有加上,所以這段 SQL 的查詢時間很久,大約每次查詢會花上 20 秒。
但是當我請 Oracle DBA 加上索引(INDEX)後,程式執行的查詢速度完全沒改變,每次查詢一樣會花上 20 秒,但我用
工具用完全相同的 SQL 語法手動查詢資料時,每次查詢都只要 0.01 秒以內就可以查到,這真的是鬼打牆了!
我們接著開啟 ASP.NET 的 Trace 功能檢查程式中各個環節,看哪一段花費的時間最長,最後發現執行時間最長的地方在 da.Fill(dt); 這一段,但是這一段要怎麼調阿?所有的地方都執行很快,只有 da.Fill(dt); 這一段在慢,這只能讓我懷疑 SQL 語法是不是有問題,但這麼簡單的一句 SELECT 查詢有什麼好改的呢??
接著我們就測試不使用 OracleParameter 帶參數的方式寫看看,直接將 SQL 傳進 OracleCommand 進行查詢,用自行組合 SQL 字串的方式寫,結果速度奇快,跟使用
工具的查詢速度,但我再怎麼樣都不能接受用自行組合 SQL 字串的方式任何查詢,所以還是繼續研究問題發生的原因與解決辦法。
說實在的,我們幾乎將所有能想到的開發方式都用上了,花了好幾天的時間一直不斷的嘗試不同的寫法,也上網找到了跟我們遇到一樣問題的,可惜並沒有任何實用的解答。
直到最後 (五天後) 我們終於嘗試出可以擁有正常執行效率且繼續使用 OracleParameter 的方法了:
string SQL = "SELECT * FROM mytable WHERE Field1 = :Field1";
OracleParameter param1 = new OracleParameter("Field1", "TEST");
Utils.FillDataTableBySQL(dt, SQL, param1);
我不知道該說些什麼,因為怎麼想都覺得沒道理阿,這兩個寫法到底哪裡不一樣阿!?
一個是先 new 一個 OracleParameter 並指定欄位、型態、與大小,然後再設定其值。
一個是直接 new 一個 OracleParameter 並指定欄位與值。
為什麼用了第一種方法感覺上沒使用「索引」進行查詢,而用了第二種雷同的方法就會使用索引呢?
光這個問題搞了我們五天時間耶,這到底是
的 Bug?還是 Oracle Database Server 的問題呢?有沒有人可以告訴我呢?
總之問題圓滿解決,也可以給客戶一個交代了,但心中依然留存一團迷霧(mist),留待日後再研究吧......
我們最近有個專案遇到一個 Oracle 資料庫查詢效能的問題,由於問題有點複雜,我必須先將「前情提要」說明清楚。 運行環境
資料庫版本:Oracle 11g
用戶端版本:Oracle Databa...
試試看 sql server, sql client data provider 是否也有同樣的問題,
就知是否微軟故意搞的鬼了。
Please enable JavaScript to view the& ORACLE中科学计数法显示问题的解决
ORACLE中科学计数法显示问题的解决
Loading...
Loading...
1、select to_char( to_number(column_name)) from tablename
2、在使用ORACLE中的进行计算或者函数处理时,
会出现大数据自动科学计数的形式表示(类似9.),
有时不希望用科学计算法表示这个数据,
此时要在出来结果的最外层使用TO_CHAR不让得到的数据是科学计数的方式。
TO_CHAR(CEIL(.99999 * 999*/*0000) FROM DUAL
1,442次阅读
浏览过的文章oracle中记录被另一个用户锁住的原因与解决办法
oracle中记录被另一个用户锁住的原因与解决办法 30
oracle中 “记录被另一个用户锁住”的原因与解决办法
为什么会被锁 造成被锁的原因是什么
补充:为什么会被锁 造成被锁的原因是什么& 我问的是原因& 有什么原因会造成被锁
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构,应用于SGA;在我们实际应用开发中涉及较多的是DML锁,其他两种的话DBA会更加关心点;DML锁的目的在于保证并发情况下的数据完整性,主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如下图所示:值& 锁模式& 锁描述& SQL0& NONE&& 1& NULL& 空& SELECT2& SS(ROW-S)& 行级共享锁其他对象只能查询这些数据行& SELECT FOR UPDATE、LOCK FOR UPDATE、LOCK ROW SHARE3& SX(ROW-X)& 行级排它锁在提交前不允许做DML操作& INSERT、UPDATE、DELETE、LOCK ROW SHARE4& S(SHARE)& 共享锁& CREATE INDEX、LOCK SHARE5& SSX(S/ROW-X)& 共享行级排它锁& LOCK SHARE ROW EXCLUSIVE6& X(eXclusive)& 排它锁& ALTER TABLE、DROP TABLE、DROP INDEX、TRUNCATE TABLE、LOCK EXCLUSIVE在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。在大概了解oracle的锁机制之后,我们来解决几个基本的问题:1.UPDATE/DELETE操作会将RS锁定,直至操作被COMMIT或者ROLLBACK;若操作未COMMIT之前其他session对同样的RS做变更操作,则操作会被hold,直至前session的UPDATE/DELETE操作被COMMIT;2.session内外SELECT的RS范围前提:INSERT、UPDATE操作未COMMIT之前进行SELECT;若在同一session内,SELECT出来的RS会包括之前INSERT、UPDATE影响的记录;若不在同一session内,SELECT出来的RS不会包括未被COMMIT的记录;3.SELECT.... FOR UPDATE [OF cols] [NOWAIT/WAIT] [SKIP LOCKED]OF cols:只锁定指定字段所在表的RS,而没有指定的表则不会锁定,只会在多表联合查询时出现;NOWAIT:语句不会hold,而是直接返回错误ORA-00054: resource busy and acquire with NOWAIT specified;WAIT N:语句被hold N秒,之后返回错误ORA-30006: acquire with WAIT timeout expired;SKIP LOCKED:不提示错误,而是直接返回no rows selected;以上几个选项可以联合使用的,比较推荐的有:SELECT.... FOR UPDATE NOWAIT:对同一RS执行该SQL时,直接返回错误;SELECT.... FOR UPDATE NOWAIT SKIP LOCKED:对同一RS执行该SQL时,直接返回空行;PS:当RS被LOCK住之后,只对同样请求LOCK的语句有效,对无需LOCK的SELECT语句并没有任何影响;
其他回答 (2)
oracle数据中删除数据时提示“记录被另一个用户锁住” 解决方法:
1、查看数据库锁,诊断锁的来源及类型:   
select object_id,session_id,locked_mode from v$locked_
或者用以下命令: select b.owner,b.object_name,l.session_id,l.locked_mode from v$locked_object l, dba_objects b where b.object_id=l.object_id
2、找出数据库的serial#,以备杀死:   
select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_
3、杀死该session   alter system kill session 'sid,serial#'
原因很多啊,一个事务执行了,但没有提交罢了用管理员帐号kill掉锁住的session
相关知识等待您来回答
编程领域专家oracle环境,有一个用户的密码忘掉了,并且用户过期,怎么能够使用原来的密码处理用户过期问题_百度知道
oracle环境,有一个用户的密码忘掉了,并且用户过期,怎么能够使用原来的密码处理用户过期问题
1 需要用之前的密码处理过期问题,密码必须是之前的,因为有的软件里面写死了密码。2 要处理过期问题
在10g以前,你可以用有权限的用户登录,查询到此用户密码的密文,再用密文改口令:查询用户口令的密文select password
from dba_users
where username='&USER1&';再修改口令:alter user USER1 identified by value '密文‘;要想口令不过期,先要知道用户的profile是什么,再改这个profile的属性查询用户的profileselect profile from dba_users
where username='&USER1&';修改此profile的的属性ALTER PROFILE &user profile& LIMIT PASSWORD_LIFE_TIME UNLIMITED;
其他类似问题
按默认排序
其他1条回答
Oracle 11g 之前默认的用户时是没有密码过期的限制的,在Oracle 11g 中默认的profile启用了密码过期时间是180天。如下:select * from dba_profiles where profile='DEFAULT' and resource_name='PASSWORD_LIFE_TIME';过期的密码可用alter user userXXX解决,可以修改为和以前一样。如果想设置密码不过期,可用管理员登陆,然后执行: ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;即可。其他相关参数:select * from dba_profiles where profile='DEFAULT' and RESOURCE_NAME like 'PASSWORD%';FAILED_LOGIN_ATTEMPTS 整数设定登录到Oracle 数据库时可以失败的次数。一旦某用户尝试登录数据库的达到该值时,该用户的帐户就被锁定,只能由DBA能解锁。PASSWORD_LIFE_TIME设定口令的有效时间(天数),一旦超过这一时间,必须重新设口令。缺省为180天(11g,10gUNLIMITED).PASSWORD_REUSE_TIME许多系统不许用户重新启用过去用过的口令。该资源项设定了一个失效口令要经过多少天,用户才可以重新使用该口令。缺省为UNLIMITED.PASSWORD_REUSE_MAX重新启用一个先前用过的口令前必须对该口令进行重新设置的次数(重复用的次数)。PASSWORD_LOCK_TIME设定帐户被锁定的天数(当登录失败达到FAILED_LOGIN_ATTEMPTS时)。PASSWORD_GRACE_TIME设定在口令失效前,给予的重新设该口令的宽限天。当口令失效之后回,在登录时会出现警告信息显示该天数。如果没有在宽限天内修改口令,口令将失效。PASSWORD_VERITY_FUNCTION该资源项允许调用一个PL/SQL 来验证口令。Oracle公司已提供该应用 的脚本,但是只要愿意的话,用户可以制定自己的验证脚本。该参数的设定就是PL/SQL函数的名称。缺省为NULL.
oracle的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁一个oracle imp 导入出现如下的错误 超高分求解 ,请高手赐教!谢!!!
[问题点数:100分,结帖人dongyangzhou]
一个oracle imp 导入出现如下的错误 超高分求解 ,请高手赐教!谢!!!
[问题点数:100分,结帖人dongyangzhou]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2013年1月 Oracle大版内专家分月排行榜第二2012年12月 Oracle大版内专家分月排行榜第二2012年9月 Oracle大版内专家分月排行榜第二
2012年11月 Oracle大版内专家分月排行榜第三2012年8月 Oracle大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 如何求解问题 的文章

 

随机推荐