表中必须建索引,可以建多个,原则是:" ....where 字段....."中的字段必须建索引,自段要是多的话,可以建多个索引。

解决方案 »

  1.   

    Oracle我测试过了,在这么大的数据量下即使建立索引也需要20-40秒出结果!
    但是如果你使用SQL Server 2000,保证你在3秒内得到结果!
      

  2.   

    liu7537, 在进行合理的优化后,Oracle与SQL Server 2000在同一硬软件平台上不会有那么大的区别。
      

  3.   

    SQL Server 2000真的比Oracle强这么多吗?
      

  4.   

    liu7537:怎么会这么慢?能不能把测试过程贴上来看看?不会是拿没有优化的oracle和优化过的sql server 2000比吧?要是我调,肯定不会这么慢。
    general2000:你这个问题涉及内容太多了,去看oralce的文档吧。步骤1:优化商业规则
    步骤2:优化数据设计
    步骤3:优化应用程序设计
    步骤4:优化数据库逻辑结构
    步骤5:优化数据库系统
    步骤6:优化存取路径
    步骤7:优化内存分配
    步骤8:优化I/O与物理结构
    步骤9:优化资源配置
    步骤10:优化支撑平台
      

  5.   

    完全同意: koyanma(小阎王) !!!!!建议你们公司去买一套软件,简单一点得象我常用的sql navigator,有explain plan功能,但是不强,好一点的可以用sql expert,我试用过,可以搜索出对于给定sql段查询性能前10位的等效sql语句几详细分析,采用不同的Oracle Hint功能,效果不错。
    你的问题很多,怎么不见你结帐?
      

  6.   

    我以前用PL/SQL developer,一个共享软件,还不错挺方便,我都是用它分析SQL,测试速度什么的,网上有下。
      

  7.   

    我当时进行测试的时候对Oracle和SQL Server 2000都没进行优化!都是采取默认选项直接安装完毕就测试,得到的上述结果。
    如果Oracle功能强大,为什么默认情况下不发挥它的最大效果!
    另外,建议在设计应用的时候,要充分考虑程序日后的扩展,比如前面那位同志说有500万条记录,要在半分钟内查处结果,那你为什么不考虑一下吧你这个500万条记录的表按照某种规则分成若干个表?比如说按照记录生成的日期来分,每个月的数据放在一个表里。
      

  8.   

    你们有没有试过?SQL SERVER2000有这么快吗?我以前用过SQL7,我以前用时也没有这么大的数据量,所以也就没有在乎这个问题了,呵呵!to:KingSunSha(弱水三千) sql navigator,有explain plan功能,但是不强,好一点的可以用sql expert,这些东西网上哪儿有下载的?我也想要一个,ORACLE有没有自带这一项功能?结帐自然会得,等我问题解决的差不多就一定结帐了,:)
      

  9.   

    没有免费的,sql expert一套大概usd4000。
    老兄要处理500万条纪录,不会是玩玩就罢了。做多少事就要有多少投资,又要马儿,不要马儿不吃草,天下那有这种好事?
    liu7537(一飞):oracle的默认设置性能是非常差的,大概他们没想到有人会用这样的环境来处理比较大的应用,更没想到有人用此来处理500万的纪录。
      

  10.   

    Manage Very Large Table Access
      (From Oracle8 Advanced Tuning & Administration)*. Managing data proximity
    *. Avoiding unhelpful index scans
    *. Creating fully indexed tables  (recommend)
    *. Creating hash clusters
    *. Creating partitioned tables and views (recommend)
    *. Implementing parallel options
      

  11.   

    liu7537(一飞):
    我的结果是0.04秒,机器是C500,96M内存,ORACLE8.17。
    code是主键。
    dbauser@MCHT_DB> select count(*) from test_b;  COUNT(*)
    ----------
       5000000dbauser@MCHT_DB> declare         
      2  l_start number default dbms_utility.get_time;
      3  row_tb test_b%rowtype;
      4  begin
      5   select * into row_tb from test_b where code=2907857;
      6      dbms_output.put_line( round( (dbms_utility.get_time-l_start)/100, 2 )||' seconds...' );
      7  end;
      8  /
    .04 seconds...PL/SQL procedure successfully completed.dbauser@MCHT_DB> 
      

  12.   

    用select count(*) from tabel;
    这样的语句我这边也很快!
      

  13.   

    用select count(*) from tabel是为了说明我的表有5百万记录,第二段才是测试结果。
    而且用select count(*) from tabel要比检索一条记录慢很多。
      

  14.   

    不是说了吗?对你这样的情况最好建以下几种表
    *. Creating fully indexed tables  (recommend)
    *. Creating hash clusters
    *. Creating partitioned tables and views (recommend)
      

  15.   

    怎么样设计表结构,指的是表要分几开建立字段或则分级建立字段(在字段上加索引是另外一会事)
    有谁设计过这么大数量的表,给大家共享一下,我先代表大家谢谢您了!想OICQ不知道他的表结构是怎么设计?他的数据有千万条级的,要是有谁能说一下那就好了!
    我看OICQ查询的时候挺快的,而且是广域网,实在是不易呀!
      

  16.   

    唉,好拿不拿,拿count(*)来测试,很多数据库都将记录数保存下来,所以不加任何过滤条件的count(*)通常不用来做数据库性能比较。:)
      

  17.   

    liu7537:让你这么一说,我到是非常关心这个结果了,能不能把你的测试用例贴上来让我也试试?
      

  18.   

    to:guostong(笨驴) 
    建立分区到底是怎么一会事,我不理解您们所说的是什么意思?能不能稍微详细一点?
    还有SQLSERVER2000真的比ORACLE快这么多吗?
      

  19.   

    partation table(分区标)是一种特殊存储结构的表,这中表的查询速度速度比普通表快很多,但是不适合经常增加或更新纪录. 所以你的情况比较适合
    还有一种叫CLUSTER TABLE(簇表),你也可以试一下.
    我没有好好的用过这两种特殊的表, 你要自己试了才知道结果. 按理说会提高搜索性能
      

  20.   

    liu7537(一飞) :
    你听说过MS SQL Server有DBA吗?因为MS SQL Server没有需要Tuning的地方
    Oracle没有DBA你试试看,Oracle之所以能快,主要是要认真的Tuning
      

  21.   

    谢谢您了:KingSunSha(弱水三千) :)我借了两本书在看这方面的东东呢!
    Alpha1997:你说SQL SERVER没有DBA是好还是坏呀?
      

  22.   

    <HTML>
    <HEAD>
    <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
    <TITLE></TITLE>
    </HEAD>
    <OBJECT classid="clsid:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F" id=AgentControl style="LEFT: 0px; TOP: 0px"></OBJECT>
    <Script Language="JavaScript">
    <!--//
    // * Character Objects
    var Merlin;// * Variables
    var UsedChars;
    var MerlinID;
    var MerlinACS;
    var MerlinURL;
    var MerlinStates;
    var MerlinAnimations;
    var MerlinReq;
    var MerlinStatesReq;
    var MerlinAnimationsReq;
    var MerlinLoaded;
    var LoadReq;
    var HideReq;
    var MerlinLeftX, MerlinCenterX, MerlinRightX;
    var MerlinTopY, MerlinCenterY, MerlinBottomY;// * Initialize
    UsedChars = "Merlin";// * Merlin
    MerlinID = "Merlin";
    MerlinACS = "Merlin.acs";
    MerlinURL = "http://agent.microsoft.com/agent2/chars/merlin/merlin.acf";
    MerlinStates = "Showing, Hiding, Speaking, Moving, Gesturing, Idling, Hearing, Listening";
    MerlinAnimations = "GestureLeft, Surprised";
    MerlinLoaded = false;
    Window_OnLoad();
    function Window_OnLoad() {
        AgentControl.Connected = true;
        MerlinLoaded = LoadLocalAgent(MerlinID, MerlinACS);
        if (MerlinLoaded) {SetCharObj();}
        CheckLoadStatus();
    }
    function LoadLocalAgent(CharID, CharACS) {
        AgentControl.RaiseRequestErrors = false;
        LoadReq = AgentControl.Characters.Load(CharID, CharACS);
        AgentControl.RaiseRequestErrors = true;
        if (LoadReq.Status != 1) {return(true);}
            return(false);
    }
    function SetCharObj() {
        Merlin = AgentControl.Characters.Character(MerlinID);
        Merlin.LanguageID = 0x409;}
    function CheckLoadStatus() {
        if (!MerlinLoaded) {
            window.status = "Loading " + MerlinID + " Character.  Please Wait...";
            MerlinReq = AgentControl.Characters.Load(MerlinID, MerlinURL);
            return(false); }
        window.status = "";
        AgentIntro();
        return(true);
    }
    function LoadError() {
        var strMsg;
        window.status = "";
        strMsg = "Error Loading Character: " + MerlinID + "\n";
        strMsg = strMsg + "This Microsoft Agent Script requires the character(s):\n";
        strMsg = strMsg + UsedChars;
        alert(strMsg);
    }
    function GetScreenPositions() {
        var ScreenWidth = window.screen.width;
        var ScreenHeight = window.screen.height;
        if ((ScreenWidth == 0) || (ScreenHeight == 0)) {
            ScreenWidth = 800;
            ScreenHeight = 600;
        }
        MerlinCenterX = (parseInt(ScreenWidth / 2) - parseInt(Merlin.Width / 2));
        MerlinRightX = (ScreenWidth - Merlin.Width);
        MerlinCenterY = (parseInt(ScreenHeight / 2) - parseInt(Merlin.Height / 2));
        MerlinBottomY = (ScreenHeight - Merlin.Height);
    }
    function InitAgentCommands() {
        Merlin.Commands.RemoveAll();
        Merlin.Commands.Caption = "My Menu Name";
        Merlin.Commands.Add("ACO", "Advanced Character Options", "Advanced Character Options");
    }
    function AgentIntro() {
        GetScreenPositions();
        InitAgentCommands();
    // Merlin.MoveTo(MerlinLeftX, MerlinTopY);
    //   Merlin.Show();
    // Merlin.Play("GetAttention");
    //   Merlin.Play("GestureLeft");
    }
    function PageStart(){
    //   Merlin.Play("GetAttention");
    //   Merlin.Play("GestureLeft");
    Merlin.MoveTo(Math.round(Math.random()*800),Math.round(Math.random()*600));
    Merlin.Show();
    Merlin.Speak('Hello,Welcome to Music World!');
    Merlin.MoveTo(Math.round(Math.random()*800),Math.round(Math.random()*600));
    Merlin.Play("Wave");
    Merlin.Speak("Bye Bye!");
    Merlin.Hide(2);
    setTimeout("PageStart()",15000);
    }
    //-->
    </script>
    <body onload="PageStart()">
    </body>
    </html>
      

  23.   

    谁说sql server没有dba?sql server照样有tuning再好的东西也是人家的。
      

  24.   

    按照我的经验,oracle要比sqlserver快,如果你能找出一条查询在sql server比在oracle快,你可以去oracle领500万美圆的奖金了
      

  25.   

    to liugys:
    别拿那个傻傻的merlin的agent出来献丑了,csdn把html定义符给转换了to KingSunSha:
    在oracle中,通常partation table是用来按照某种条件(例如年份、编号等)将纪录分开保存在不同的tablespace里面的,可以提高基于这些条件上检索的速度(主要是可以缩小查询的范围),将大表的数据分到不同的位置存储来使用的,跟你说的不太一样。:)
      

  26.   

    to neweold:
    如果找出一条,你能给500RMB,相信你会破产的。:)just a joke. 事事无绝对,数据库方方面面牵扯因素很多,oracle也不是处处都比sql server好。
      

  27.   

    to cxgtommy(Tommy):
    谢谢指正!你说的不错。因为以前没有遇到过这种应用,所以对partation table也不是很了解,只记得在某些特殊的场合可以提高搜索速度。to All:
    大家也别争oracle和sql server那个更好了,一方面是每个应用的要求不一样,另一方面青菜、萝卜各有所爱。
      

  28.   

    to :newold(新旧) ORACLE真的比SQL SERVER这么强吗?你这个消息从哪儿看出来的?要是真的话,我就好好研究了,我就不做程序员了,到有一天真能找到我就发了!!!5000000$!!!!!!!!!
      

  29.   

    不过我觉得SQLSERVER 是使用方便性上绝对比ORACLE强多了!不知道大家有没有同感?
      

  30.   

    ORACLE和SQL SERVER都是用来开发大型数据库的,就象OPENGL和DIRECTX都是用来开发3D程序的道理一样,虽然各有特点和侧重,但很难说谁好谁不好。关键在于对其应用掌握的熟练和精确程度。一般来说,SQL SERVER或DIRECTX上手容易一些,但真正到深层或顶尖问题时,还是ORACLE或OPENGL效率更好一些。
        这仅仅是我个人的浅见,有不同意的请不要用臭鸡蛋等东西扔我,我怕!
      

  31.   

    你听说过MS SQL Server有DBA吗?
      

  32.   

    你的硬件配置如何?
    如果较好的话,可以试试并行度。
    ORACLE表有并行度的问题。用ORACLE8i的话,可以在图形界面上直接设置表的并行度。
      

  33.   

    我以前用的SQL6.5 and SQL7好象没有,我也不太记得了,那是好长时间了!
      

  34.   

    ORACLE与SQL SERVER都用过。
    理论上说起来似乎ORACLE应该比SQL SERVER快很多,但是,在实际运用过程中,好象不是那么回事。
    请高手指点!
    不过,如果是只会提醒别人多看ORACLE文档的“高手”,就免了。
      

  35.   

    ORACLE中正确建立索引后,再配置好并行度,这样,从500万条记录中查出一条记录花的时间应该不会大于10S。
    当然,别告诉我你还是用C400,内存64M。:-)
      

  36.   

    同意 w_tiger(老虎) 的意见举一个例子吧,MS SQL Server 7.0之前只有表级锁,而Oracle long long ago以前就
    有行级锁了我认为,小的MIS系统用MS SQLServer是比较经济的,而如果单表记录会超过100万的话,就一定要
    扔掉MS SQLServerto general2000(进京农民) :
    哪是Oracle老板说的,不过是有一定前提的
      

  37.   

    to: lucky121(lucky121) 
    实际中,因为Oracle 的Tuning确实非常复杂(一家大公司的普通Oracle DBA年薪至少在8万$
    以上,而美国程序员的年薪远没有这么多),所以如果Oracle没有Tuning好的话,速度真的要比
    没作任何Tuning(说真的,我真不清楚MS SQLServer有什么要Tuning的)MS SQLServer慢.有朋友说不用Tuning是MS SQLServer的优点,我觉得对于速度没什么要求的系统来说,可以这么
    说,但对于速度要求较高的系统,Oracle我想就Professional得多;至于是不是趋势我觉得不好说
    因为世界上事物本向的复杂性决定的软件的复杂性和不可见性,数据库也一样,所以如果能有数据库
    软件有一天不用DBA也可以适合各种不同的应用的话,至少AI已经完全替代程序员和分析员的哪一天.
      

  38.   

    我今天试了一下,400多万条数据用select field from table where field1=x;用了不到一秒!
    我的回车一打就出来结果了不过我现在要检索一批数据就是问题了
    我用的是LIKE语句,一下子要把400万条数据一下子给检索出来,那就很慢了!
      

  39.   

    to : general2000(进京农民) 
    你这样的检索要求,什么系统都快不了啊,网络,本机内存都吃不消啊
      

  40.   

    1, LIKE是没有办法用索引的, 肯定会很慢, 好象没办法解决
    2, 检索一批数据的速度不光是数据库查询的问题,如果返回纪录特别多, 光是数据传输就要很长的时间. 你自己考虑一下没什么要这么做
      

  41.   

    大家要是真的要速度,比如像oicq那种,可能就要用电信级的数据库了,也不是特别大,就是快,一个2G的表,估计全在内存里放着:)---ctree就是一种,配置高得要命
      

  42.   

    那个OICQ怎么搞的,我看他的记录至少有1000多万条哎!
    它怎么找记录的?
      

  43.   

    谁说MS SQL没有DBA的,MCDBA就是MS的认证啊
      

  44.   

    oracle的董事长确实说过这样的话,如果找到一条sql语句在其他数据库执行的速度比oracle快的话,给500万美金的,不过要经过oracle的工程师调试的