sql查询耗时太长

时间:2009-09-25 04:17:48

标签: sql sql-server-2005 optimization

我有简单的“插入...”查询,大约需要40秒才能执行。它只是从一个表中获取记录并插入另一个表中。

  1. 我在F1表格上的BatchIDtbl_TempCatalogue上有索引
  2. 146624条记录受到影响。
  3. select本身并不慢,insert into很慢。
  4. 完整的查询是:

    insert into tbl_ItemPrice
        (CATALOGUEVERSIONID,SERIESNUMBER,TYPE,PRICEFIELD,PRICE,
    PRICEONREQUEST,recordid)
    select  296 as CATALOGUEVERSIONID
            ,ISNULL(F2,'-32768') as SERIESNUMBER
            ,ISNULL(F3,'-32768') as TYPE
            ,ISNULL(F4,'-32768') as PRICEFIELD,F5 as PRICE
           ,(case  when F6 IS NULL  then null when F6 = '0' then 'False' 
                                    else 'True' end ) as PRICEONREQUEST
           ,newid()
     from tbl_TempCatalogue  
     where F1 = 450
      and BATCHID = 72
    

    由于

4 个答案:

答案 0 :(得分:2)

如果您的表很大,您可能会受益于tbl_TempCatalogue表中F1和BATCHID的索引。目前尚不清楚您使用的DBMS,但大多数都有不错的工具来向您展示执行计划。如果您在大型表上进行全表扫描,则可能需要很长时间才能运行。

另外,你说“插入”很慢,但你只包括选择的代码。选择本身是否缓慢?

答案 1 :(得分:1)

tbl_TempCatalogue表上是否有索引可帮助数据库找到F1 = 450和BATCHID = 72的行?

否则,它可能需要扫描整个表才能找到它们。

答案 2 :(得分:1)

你的查询看起来很好..但是我关心的是newid()函数,那里写的那些可能达到性能的逻辑,请尝试在没有newid()的情况下运行并查看select语句的执行时间..

按照步骤

解决此类问题
  1. 仅查看select语句的执行时间
  2. 使用select
  3. 查看insert语句的执行时间
  4. 查看没有newid()函数的select语句的执行时间
  5. 在比较这些时间段后,您将能够找到问题所在的确切根本原因。之后请发布这些时间段,以便我们尝试解决此问题。

答案 3 :(得分:1)

你说问题在于INSERT而不是SELECT。所以可能的罪魁祸首(没有固定的顺序):

  • 触发器
  • 存储分配
  • 外键验证
  • 检查约束验证
  • i / o瓶颈
  • 有故障的磁盘
  • 与其他会议的争论

您需要进行哪些诊断工具取决于您使用的数据库产品(以及哪个版本的数据库)。请在您的问题中包含这些详细信息。