Sql 如何改进SELECT查询

Sql 如何改进SELECT查询,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,有没有办法改进我的查询 SELECT * FROM StringControllerDaten WHERE StringControllerDaten.Erstellt NOT IN ( SELECT Min(Erstellt) AS Erstellt FROM StringControllerDaten GROUP BY StringControllerDaten.StringController, D

有没有办法改进我的查询

SELECT *
FROM  StringControllerDaten
WHERE StringControllerDaten.Erstellt NOT IN
(
    SELECT  
            Min(Erstellt) AS Erstellt   
    FROM        StringControllerDaten

    GROUP BY
    StringControllerDaten.StringController,
    DATEPART(YEAR, Erstellt),
    DATEPART(MONTH, Erstellt),
    DATEPART(DAY, Erstellt),
    DATEPART(HOUR, Erstellt),
    (DATEPART(MINUTE, Erstellt) / 15)
)
此查询返回与15分钟间隔中的一个最小日期时间不匹配的所有数据

它再次运行+1Mio行,需要几个小时


编辑: 估计的查询计划


这篇文章中最重要的答案能帮到你吗

编辑:仍然需要弄清楚如何将
NOT IN
放入内部联接

achinda99写道:“在大多数数据库系统中,连接的运行速度比在WHERE…In中的运行速度快。”

没有办法测试atm,tho

  • 创建一个日期列表,最小值和最大值之间的间隔为15分钟,然后放入一个表/游标/表中
  • 假设该表如下所示:

        CREATE TABLE [dbo].[AllDates]
        ( COLUMN Item DATETIME)
    
  • 将您的表格与1中的列表进行交叉比较

    SELECT
       StringControllerDaten.ID -- or what you need
    FROM
       StringControllerDaten
    WHERE
       StringControllerDaten.Erstellt NOT IN (SELECT AllDates.Item FROM AllDates)
    

  • 检查并发布查询计划。
    select*
    将有所帮助。与
    *
    相比,显式放置列名更好。查询计划将解释很多内容,更重要的是,它将显示查询中最耗时的任务。请先使用表变量存储
    Min(Erstellt)
    ,然后在表中使用该表。是否正确索引表?您可以附加
    .sqlplan
    文件吗?添加一些示例数据会有所帮助。@EvaldasBuinauskas在哪里可以找到此文件?