【问题标题】:SQL query on inner join extremely slow内部连接上的 SQL 查询非常慢
【发布时间】:2015-04-19 18:03:14
【问题描述】:

我在 SQL Server 中有一个数据库。里面有两张桌子,我们称它们为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 中有大约 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


【解决方案1】:

这是您的查询:

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】:

    在[SLAVE].[io_id]上创建索引并声明FK关系

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多