使用TTable控件操作MS SQL时,TTable将给表上锁(我不注意到TTable是否有设置共享打开的属性),dephi出于性能上考虑TTable将在必要时才从Server端提取下一批数据,当表中数据量大时,锁将持续长时间,当另一连接要企图以独占方式锁记录或表时,将发生等待(出现SQL沙漏)。你可以在ms SQL服务器上的管理器中的观察连接视图中看到红色堵塞。
如果真是这样,你优化你的查询,使它尽可能快,而查询是TQuery的强项,另外在操作SQL server时TQuery比TTable更有性能速度的优越,你应尽可能使用它。

解决方案 »

  1.   

    qkl:
    多谢各位关心我的问题,
    但有几点补充:
    我的所有查询都是使用存储过程和QUERY来完成据说这样的运行可减少死锁的发生。
    观察联接视图是不是指TRACE?
      

  2.   

    欢迎大家多多发言,我发现数据库的LOCK TIMEOUT
    好象是在RUN时才有效,而SQL SERVER 的DEFAULT
    为无限长就是永远等待下去。
      

  3.   

    加入索引后对优化查询没有太大改良?不大可能,加入索引后对查询至少有十倍的提高!应该是你建的索引在你的查询中没用上,MS SQL管理器中有对索引分析的功能。
    我想你现在的问题是优化你的查询。加入索引应该会有帮助的,这要根据你的系统中经常用到的查询来制订方案了。你的查询规模是否太大?如果是查询规模是太大造成的,你要重新设计你的查询。注意利用MS SQL管理器帮你找到问题所在。
    祝你好运。
      

  4.   

    如果你自己建立的索引沒有提高效率,把你主要的SQL語句的Where子句貼出來,大家幫你設計索引。
      

  5.   

    要判断是否死锁,看看 sp_who 和 sp_lock 的用法。
      

  6.   

    1.你加的索引可能被SQL SERVER忽略掉了;
    2.仔细看看的存储过程是不是有优化余地;
    3.最后看看的DELPHI代码有没有优化的余地, 如做缓冲等
      

  7.   

    我用的是NO CLUSTER生成索引请多指教。
    DELPHI中如何做缓冲???
      

  8.   


      以下是微软公司预计发布的Windows2000的新特性  1.可能取消99%的键盘按键  2.每次启动前必须先输入社会安全号码  3.按任意键继续或任意键取消  4.按任意键除了...,(不,不,不.......这条取消)  5.按Ctrl+Alt+Del,开始一个IQ测试  6.闭三次眼睛等于按一次[Esc]  7.Badcommandorfilename!将出现在屏幕角落  8.“请稍后,准备关闭Windows,是否进行新GAME?”  9.系统提示:“文件保存错误,是否格式化硬盘?(Y/Y)”  10.来自GATES上帝的信息:“重启动世界,请注销”  11.要关闭你的机器,请输入“WIN”  12.Breakfast.syshalt食物Plug-in端口初始化错误  13.coffee.vxdmissing,请插入一个杯子然后按任意键继续...  14.congress.dll错误,重启动Washionton.D.C.?(Y/N)  15.FilenotFound,是否要伪造一个?  16.BadorMissingMouse,改用CAT?  17.RuntimeError6Dat417A:32CF,盗版用户!  18.读FAT区错误:换一张?(Y/N)  19.致命错误16547:LPT1notfound,使用备份设备(Pencil&Paper.sys)  20.User64.dllError:请换个用户  21.WindowsVirusScan1.0-“Windows2000病毒被发现,是否清除它?”  22.启动信息:欢迎来微软的世界---您的义务就是付钱!  23.如果您是艺术家,您应该感到BILL先生正拥有您和您的全部作品.是否很有安全感?  24.您的硬盘在运行SCANDISK2000后出现:“您的所有盗版软件已经被删除,并且警察正在来的路上:)”  
      

  9.   

    你想做东西,就用Delphi。你想搞研究,可以用C++
      

  10.   

    1.全部用存储过程实现对表的数据的更改和读取。
    2.存储过程对表的修改保持一致的顺序。
    3.不要用DBGrid等控件实现对数据的查询,而用Query调用存储过程读出数据后自己在StringGrid里填充 。
      

  11.   

    选择RAD工具每种工具都比它们的前一个版本有了很大改进。为便于维护现有的项目,我们建议您对现有的工具从较低版本进行升级(例如是为Web项目使用PowerBuilder 6.0,5.0更稳定些)。如果是为新开展的项目选择工具,需要审慎地作出决定。 对三种工具都没有使用经验的程序员会发现Visual Basic更容易学习。学习时间是最初的开发时间,因此使用Visual Basic可以使他们可以更快地投入到生产性编程工作,从而提高开发组的生产能力。不是Visual Basic本身可提供的组件(如对象模板,组件仓库和源代码组件)可从第三方获得。如果您的开发组已经熟悉了Visual Basic,那么没有什么理由换成别的工具。Visual Basic现在具有与PowerBuilder类似的数据库集成能力,与Delphi相当的自身编译速度。 熟悉PowerBuilder的编程开发组,应该用心考虑选用其他的工具。Delphi和Visual Basic都能提供更好的编译和调试工具,Visual Basic还可提供更好的数据库集成工具。PowerBuilder的性能一直是个问题,在实现Web和多层分布式软件时更是不适用。与Delphi和Visual Basic比,即使是熟练的PowerBuilder开发人员,也要花费很多时间对程序进行调试(由于调试器的限制)和调整(由于性能问题)。由于PowerBuilder开发服务器代码的性能很差,因此PowerBuilder程序很难转向多层应用环境。由于无法克服的性能问题,PowerBuilder项目方案有更大的可能性被推翻重来,这也意味着用PowerBuilder实现真正可用的企业应用程序时,生产效率更低。 对于各种RAD工具,PowerBuilder的开发人员转换到Visual Basic是最容易的。PowerScript主要的是Basic变量(受C的影响),当然比Java, C++或Delphi的Pascal更接近于Basic。Visual Basic中的数据库工具可在一天内掌握,因此重新学习Visual Basic所用的时间很少。 熟练的Delphi开发组面临的选择最困难。选择了Delphi后,Delphi程序员可以与Visual Basic程序员一样高效地编程。Delphi的编译器也十分吸引人:它可生成快速的代码。Delphi的COM集成能力也不错,和除Visual Basic外的其他产品一样简便(包括微软的其他开发语言)。 尽管有这些方面的优势,但Delphi毕竟不是主流。寻找优秀的Delphi程序员是困难的,而培训新程序员代价较高──比Visual Basic高。Delphi所带工具集功能最弱(无源代码控件、无模板、很弱的库),对每三方支持也不够。Delphi最大的不足在于Borland Desktop Engine,它在健壮性和可管理性方面不能达到企业软件的标准。相比较而言,Visual C++和Inprise公司自己的C++ Builder一点不比Delphi难掌握,却可以广泛利用第三方的支持。对于新的项目,程序员和管理人员应该仔细考虑更换到一个更简便的环境(如Visual Basic)或是同样较难但功能更强大,更符合标准的环境(如C++)。 想挣钱?用VB...
      

  12.   

    To peacock :
    太老了? 我的脸可就丢大了,那来点新鲜的吧!!!
        一天,一个地狱的使者找到Bill Gates,对他说:我有两个消息要告诉你, 
    一个是好消息,一个是坏消息,你要先听哪一个?GATES想了想,说 
    我要先听好消息。地狱的使者说:好消息是地狱里的所有的操作系统 
    都是你的WINDOWS了!!哦,这真是个好消息,GATES说,那坏消息呢? 
    坏消息是,地狱的使者说;现在WINDOWS出了些问题,你要和我下去修理?!
      

  13.   

    多谢各位,你们都给了我很多启发,从这两天来看,问题解决了!!
    关键:
    1、在程序中确实存在对不同的表单的操作顺序不一致的地方。
       我使用了一个表用来生成唯一编号,SQL SERVER中也有这样功能,
       但我决得不好用,对于这个表单的访问较频繁。但我忽视了对它的
       操作。
    2、在我使用PROFILER来跟踪系统的DEADLOCK和STORED PROCEDURE 的运行,
       终于发现是对该表及其他相关表单的操作时发生DEADLOCK。。
       再往下就好办多了
    3、还有些不明白的地方如PROFILER 在TRACE时的CPU、READ,WRITES是什么,
       当CPU值如果指占用CPU的比例话,在CPU值高于多少时应警惕??
    4、请教ROCHESTER:为什么不能用DBGRID来显示用存储过程查询来的数据???
       我看过它的代码好象没什么问题?
    5、我在数据库专题中也发了相同问题,
       也有200分相送各位请到那边发贴,我好送分。
      

  14.   

    多谢各位,你们都给了我很多启发,从这两天来看,问题解决了!!
    关键:
    1、在程序中确实存在对不同的表单的操作顺序不一致的地方。
       我使用了一个表用来生成唯一编号,SQL SERVER中也有这样功能,
       但我决得不好用,对于这个表单的访问较频繁。但我忽视了对它的
       操作。
    2、在我使用PROFILER来跟踪系统的DEADLOCK和STORED PROCEDURE 的运行,
       终于发现是对该表及其他相关表单的操作时发生DEADLOCK。。
       再往下就好办多了
    3、还有些不明白的地方如PROFILER 在TRACE时的CPU、READ,WRITES是什么,
       当CPU值如果指占用CPU的比例话,在CPU值高于多少时应警惕??
    4、请教ROCHESTER:为什么不能用DBGRID来显示用存储过程查询来的数据???
       我看过它的代码好象没什么问题?
    5、我在数据库专题中也发了相同问题,
       也有200分相送各位请到那边发贴,我好送分。
      

  15.   

    多谢各位,你们都给了我很多启发,从这两天来看,问题解决了!!
    关键:
    1、在程序中确实存在对不同的表单的操作顺序不一致的地方。
       我使用了一个表用来生成唯一编号,SQL SERVER中也有这样功能,
       但我决得不好用,对于这个表单的访问较频繁。但我忽视了对它的
       操作。
    2、在我使用PROFILER来跟踪系统的DEADLOCK和STORED PROCEDURE 的运行,
       终于发现是对该表及其他相关表单的操作时发生DEADLOCK。。
       再往下就好办多了
    3、还有些不明白的地方如PROFILER 在TRACE时的CPU、READ,WRITES是什么,
       当CPU值如果指占用CPU的比例话,在CPU值高于多少时应警惕??
    4、请教ROCHESTER:为什么不能用DBGRID来显示用存储过程查询来的数据???
       我看过它的代码好象没什么问题?
    5、我在数据库专题中也发了相同问题,
       也有200分相送各位请到那边发贴,我好送分。
      

  16.   

    建立一束特殊效果的黑光在 Direct3D 
    作者 Peter Kovach下面的例子告诉您如何建立一束光线并且将它设置为一束 黑光:
        //
        // g_lpD3D3 holds the address of an IDirect3D3 interface
        //
        LPDIRECT3DLIGHT g_lpD3DLight;
        HRESULT   hr;
     
        hr = g_lpD3D3->CreateLight (&g_lpD3DLight, NULL);
        if (SUCCEEDED(hr))
        {
    //
          // g_lpD3DLight variable is a valid pointer to an IDirect3D3 interface.
          //
         D3DLIGHT2 g_light;
        HRESULT   hr;
        //
        // Initialize the structure
        //
        ZeroMemory(&g_light, sizeof(D3DLIGHT2));
        g_light.dwSize = sizeof(D3DLIGHT2);  // MUST set the size!
        //
        // Create our Dark point light.
        //
        g_light.dltType = D3DLIGHT_POINT;
        g_light.dcvColor.r = -0.5f;
        g_light.dcvColor.g = -0.5f;
        g_light.dcvColor.b = -0.5f;
        //
        // Position the light high in the scene, and behind the viewer.
        // These coordinates are in world space, so
        // the viewer could be anywhere in world space. 
        // For this example, the viewer is at the origin of world space.
        //
        g_light.dvPosition.x = 0.0f;
        g_light.dvPosition.y = 1000.0f;
        g_light.dvPosition.z = -100.0f;
        //
    // Don't attenuate
    //
    g_light.dvAttenuation0 = 1.0f; 
    g_light.dvRange = D3DLIGHT_RANGE_MAX;
        //
    // Make the light active light.
    //
    g_light.dwFlags = D3DLIGHT_ACTIVE;
        //
    // Set the property info for this light.
    // We have to cast the LPD3DLIGHT2 to be 
    // an LPD3DLIGHT.
    //
    hr = g_lpD3DLight->SetLight((LPD3DLIGHT)&g_light);
    if (SUCCEEDED(hr))
    {
        //
        // Add the light to the viewport here.
        //
    }
    else
        return hr;
    }
    else
        return hr;