我在SQL Server中有一个数据库。其中有2个表格,我们称之为MASTER
和SLAVE
。它们之间存在一对多的关系,因此一条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进行测试,则相同)。
如何加快速度?
感谢大家!
答案 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关系