代码之家  ›  专栏  ›  技术社区  ›  Tom

内部联接上的SQL查询非常慢

  •  0
  • Tom  · 技术社区  · 11 年前

    我有一个SQL Server数据库。里面有两张桌子,我们叫他们吧 MASTER SLAVE 他们之间有一对多的关系,所以 船长,船长 记录可以连接到多个 从,从 记录。

    下面是表创建者SQL命令(您也可以在那里看到我的索引):

    CREATE TABLE [MASTER] 
    (
        [gprs_id] INTEGER  IDENTITY  NOT NULL,
        [date_time] DATETIME  NOT NULL,
        [valid] TINYINT NOT NULL,
        [lat] REAL  NOT NULL,
        [lon] REAL  NOT NULL,
    
        CONSTRAINT MASTERPrimaryKey PRIMARY KEY NONCLUSTERED(gprs_id)
    );
    
    CREATE CLUSTERED INDEX MASTERDate ON MASTER (date_time);
    
    CREATE TABLE [SLAVE] 
    (
        [io_id] INTEGER  IDENTITY NOT NULL,
        [recordid] INTEGER  NOT NULL,
        [ioid] TINYINT  NOT NULL,
        [iovalue] FLOAT  NOT NULL,
    
        CONSTRAINT SLAVEPrimaryKey PRIMARY KEY CLUSTERED(io_id)
    );
    

    我进行了以下查询以从SLAVE查询数据:

    DECLARE @fromdate datetime;
    DECLARE @todate datetime;
    SET @fromdate = '2014-01-01T00:00:00.000';
    SET @todate = '2015-01-01T00:00:00.000';
    
    SELECT 
        MASTER.date_time, SLAVE.* 
    FROM 
        MASTER 
    INNER JOIN 
        SLAVE ON MASTER.gprs_id = SLAVE.recordid 
    WHERE
        date_time >= @fromdate 
        AND date_time <= @todate;
    

    我有大约50万张唱片 从,从 约50000英寸 船长,船长 。我发现查询非常慢,超过一分钟(如果我从.net代码的SQL Server Management Studio进行测试,也是如此)。

    我怎样才能加快速度?

    谢谢大家!

    2 回复  |  直到 11 年前
        1
  •  3
  •   Gordon Linoff    11 年前

    这是您的查询:

    SELECT m.date_time, s.* 
    FROM MASTER m INNER JOIN 
         SLAVE s
         ON m.gprs_id = s.recordid 
    WHERE m.date_time >= @fromdate AND m.date_time <= @todate;
    

    此查询的最佳索引为: master(date_time, gprs_id) slave(recordid) 。您的现有索引不是最佳的。

        2
  •  1
  •   paparazzo    11 年前

    在[SAVE]上的索引中创建。[io_id]并声明FK关系