【发布时间】:2015-04-19 18:03:14
【问题描述】:
我在 SQL Server 中有一个数据库。里面有两张桌子,我们称它们为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 中有大约 50 000 条记录。我发现查询非常慢,超过一分钟(如果我从 .net 代码的 SQL Server Management Studio 进行测试,也是一样的)。
如何加快速度?
谢谢大家!
【问题讨论】:
-
对我来说不是一个好选择,因为查询后我需要所有记录进行后期处理
-
在
SLAVE.recordid上创建一个外键指向MASTER.grps_id,然后在SLAVE.recordid上创建一个非聚集索引 -
这个查询总共返回了多少行?此外,Actual Query Plan 对查询调优和性能分析非常有帮助。
-
结果是大约 450 000 条记录。谢谢
-
只执行这个需要多长时间:
Select * From SLAVE?
标签: c# sql .net sql-server inner-join