2015-10-19 88 views
1

我在Microsoft Access上有两个表:T_DATAS(大约200 000行)和T_REAF(大约1000行)。SQL查询优化JOIN多列

T_DATAS有很多列(大约30列),T_REAF有大约10列。

我必须告诉你,我不允许更改这些表格,也不允许创建其他表格。我必须与它合作。

两个表都有6列是相同的。我需要连接这6列中的表,选择T_DATAS中的所有列和T_REAF中但不包含在T_DATAS中的列。

我的查询是:

SELECT A.*, B.CARROS_NEW, B.SEGT_NEW, B.ATTR INTO FINALTABLE FROM T_DATAS A LEFT JOIN T_REAF B ON A.REGION LIKE B.REGION AND A.PAYS LIKE B.PAYS AND A.MARQUE LIKE B.MARQUE AND A.MODELE LIKE B.MODELE AND A.CARROS LIKE B.CARROS AND A.SEGT LIKE B.SEGT

我有结果我需要的,但问题是,这个查询花费了太多的时间给结果(约3分钟)。 我知道T_DATAS包含很多行(200 000),但我认为3分钟对于此查询来说太长了。

你能告诉我这个查询有什么问题吗?

非常感谢您的帮助

+3

为什么你在查询中使用** like **? – pedram

+0

另外,考虑在桌子上放一些索引以加快查询速度 – Veljko89

回答

3

为此的两个步骤。一种是将查询更改为使用=。我不是100%确定这是否有必要,但它不会受到伤害。第二个是创建索引。

所以:

SELECT D.*, R.CARROS_NEW, R.SEGT_NEW, R.ATTR 
INTO FINALTABLE 
FROM T_DATAS D LEFT JOIN 
    T_REAF R 
    ON D.REGION = R.REGION AND 
     D.PAYS = R.PAYS AND 
     D.MARQUE = R.MARQUE AND 
     D.MODELE = R.MODELE AND 
     D.CARROS = R.CARROS AND 
     D.SEGT = R.SEGT; 

其次,你要对T_REAF指数:然后

CREATE INDEX IDX_REAF_6 ON T_REAF(REGION, PAYS, MARQUE, MODELE, CARROS, SEGT); 

MS Access可以使用该指数为JOIN,加快查询。

请注意,我将表别名更改为表名的缩写。这使得查询中的逻辑更加容易。

+0

谢谢!从“LIKE”更改为“AND”使请求更快(大约30秒前3分钟)。我也创建了索引。有没有办法查看索引是否真的被Access使用,还是必须“信任”它? –

2

我认为这6列是相同的可能有相同的数据类型也。

说明:等于(=)运算符是一个比较运算符 - 它将两个值相等进行比较。因此在您的查询中,用=代替LIKE并查看结果时间。

SELECT A.* 
     ,B.CARROS_NEW 
     ,B.SEGT_NEW 
     ,B.ATTR 
     INTO FINALTABLE 
FROM T_DATAS A 
     LEFT JOIN T_REAF B 
      ON A.REGION = B.REGION 
       AND A.PAYS = B.PAYS 
       AND A.MARQUE = B.MARQUE 
       AND A.MODELE = B.MODELE 
       AND A.CARROS = B.CARROS 
       AND A.SEGT = B.SEGT