内部连接的SQL查询非常慢

时间:2015-02-18 16:30:28

标签: c# sql .net sql-server inner-join

我在SQL Server中有一个数据库。其中有2个表格,我们称之为MASTERSLAVE。它们之间存在一对多的关系,因此一条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;

我的SLAVE表中有大约500 000条记录,MASTER中有大约5万条记录。我发现查询速度非常慢,超过一分钟(如果我从.net代码的SQL Server Management Studio进行测试,则相同)。

如何加快速度?

感谢大家!

2 个答案:

答案 0 :(得分:2)

这是您的查询:

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)。您现有的索引不是最佳的。

答案 1 :(得分:1)

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