优化大型数据库上的选择查询

时间:2017-08-22 18:35:44

标签: sql sql-server select optimization

我正在使用基于两个表(表1和表2)的Join开发SQL查询.RDBMS是SQL Server。两个表都有一个共同的ID列,基于该列将形成连接。两列中都有一个日期时间列。

目标:我想从Table2中检索Table2.datetimeTable1.datetime 1分钟范围内的所有行。

注意:我没有数据库的写权限,因此索引不适合我。

我的查询正确。它运作正常;但是,数据库是巨大的。如果我想要检索过去15天的数据,则需要永久。

有更好的方法吗?

这是查询

SELECT
    A.Column1, A.Column2,
    A.Column3, A.Column4,
    A.Column5, A.Column6,
    A.Column7, A.Column8,
    A.Column9, A.Column10, A.Column11, 
    B.Column1, B.Column2,
    B.Column3, B.Column4, B.Column5 
FROM 
    TABLE1 A, TABLE2 B
WHERE 
    A.CommonColumn = B.CommonColumn 
    AND B.DateTime BETWEEN DATEADD(minute, -1, A.DateTime) 
                       AND DATEADD(minute, 1, A.DateTime)
    AND A.DateTime BETWEEN GETDATE() - 15 AND GETDATE()

2 个答案:

答案 0 :(得分:0)

在应用分钟条件之前,尝试先过滤数据以减少记录数 还为startDate和endDate定义变量,并在下面的查询中使用它们。(希望它有所帮助,或者给你一个想法) (我担心CTE的表现,但试试吧)

Declare @startDate Datetime =GetDate()-15;
Declare @endDate Datetime=GetDate();

;with filteredDataA as (
SELECT A.CommonColumn,A.DateTime,
    A.Column1, A.Column2,
    A.Column3, A.Column4,
    A.Column5, A.Column6,
    A.Column7, A.Column8,
    A.Column9, A.Column10, A.Column11
FROM 
    TABLE1 A
where A.DateTime BETWEEN @startDate AND @endDate
),
filteredDataB as (
Select B.CommonColumn,B.DateTime,
B.Column1, B.Column2,
B.Column3, B.Column4, B.Column5
From Table2 B
where B.DateTime BETWEEN @startDate AND @endDate
)

Select A.Column1, A.Column2,
    A.Column3, A.Column4,
    A.Column5, A.Column6,
    A.Column7, A.Column8,
    A.Column9, A.Column10, A.Column11, 
    B.Column1, B.Column2,
    B.Column3, B.Column4, B.Column5

    from filteredDataA A left join filteredDataB  B on A.commonColumn=B.CommonColumn
    and B.DateTime BETWEEN DATEADD(minute, -1, A.DateTime) 
                        AND DATEADD(minute, 1, A.DateTime)

答案 1 :(得分:0)

尝试更改第二个子句

WHERE 
A.CommonColumn = B.CommonColumn 
--AND B.DateTime BETWEEN DATEADD(minute, -1, A.DateTime) 
--                   AND DATEADD(minute, 1, A.DateTime)
AND ABS(DateDiff(mi, A.DateTime, B.DateTime)) <= 1
AND A.DateTime BETWEEN GETDATE() - 15 AND GETDATE()