Sql server SQL查询将永远使用

Sql server SQL查询将永远使用,sql-server,datetime,join,Sql Server,Datetime,Join,我有一个webapplication工具,可以查询数据并在网格中显示。现在很多人都在使用它,所以它必须有相当高的性能 问题是,我需要通过连接添加两个额外的字段,现在查询需要永远运行下去 如果我在sql server中运行以下查询: select top 100 * from bam_Prestatie_AllInstances p join bam_Zending_AllRelationships r on p.ActivityID = r.ReferenceData join bam_Zend

我有一个webapplication工具,可以查询数据并在网格中显示。现在很多人都在使用它,所以它必须有相当高的性能

问题是,我需要通过连接添加两个额外的字段,现在查询需要永远运行下去

如果我在sql server中运行以下查询:

select top 100 *
from bam_Prestatie_AllInstances p
join bam_Zending_AllRelationships r on p.ActivityID = r.ReferenceData
join bam_Zending_AllInstances z on r.ActivityID = z.ActivityID
where p.PrestatieZendingOntvangen >= '2010-01-26' and p.PrestatieZendingOntvangen < '2010-01-27'
选择前100名*
来自bam_Prestatie_AllInstances p
在p.ActivityID=r.ReferenceData上加入bam\u Zending\u AllRelationships r
在r.ActivityID=z.ActivityID上加入bam_Zending_AllInstances z
其中p.PrestatieZendingOntvangen>='2010-01-26'和p.PrestatieZendingOntvangen<'2010-01-27'
这大约需要35-55秒,太长了。因为这只是一个小的

如果我删除两个日期检查中的一个,只需1秒。如果删除两个连接,也只需1秒

当我在这方面使用queryplan时,我可以看到100%的时间都花在PrestatieZendingOntvangen字段的索引上。如果我将此字段设置为索引,则不会发生任何更改

有人知道该怎么做吗

因为我的客户开始抱怨超时等等

谢谢

你想试试吗

where p.PrestatieZendingOntvangen 
   between '2010-01-26 00:00:00' and '2010-01-27 23:00:00'
  • 指定要检索的字段,而不是*
  • 指定内部联接或外部联接

  • 您是否在
    Where
    子句的日期字段中放置了索引

    如果没有,我会在这些字段上创建一个索引,看看它是否对你的V时间有任何影响

    当然,索引会占用更多的磁盘空间,所以你必须考虑额外索引的影响。

    编辑:


    其他人也提出了很好的观点,在
    Select
    而不是*(通配符)中指定所需的列,并在外键上放置更多索引等除了在
    bam_Prestatie_AllInstances.prestatiezendingovangen
    列上建立索引这一明显的问题之外,还要检查外键列是否有索引:

    • p、 ActivityID(表:
      bam\u Prestatie\u AllInstances
    • r、 参考数据(表:
      bam\u Zending\u AllRelationships
    • r、 ActivityID(表:
      bam\u Zending\u AllRelationships
    • z、 活动ID(表:
      bam\u Zending\u AllInstance
    索引外键字段有助于大大加快这些字段上的联接


    此外,如前所述:通过指定特定的字段列表来限制您选择的字段,而不是使用
    SELECT*
    ,特别是如果您连接多个表,只需选择的列数(乘以您选择的行数)可能会导致大量数据传输——如果您不需要所有这些列,那只是浪费了带宽

    有DB背景的人可以澄清我的疑问

    我认为,您应该以DB能够理解的样式指定日期。
    例如,假设日期以mm/dd/yyyy样式存储在表中&您的查询尝试将不同样式的日期用于比较(yyy-mm-dd),则性能将下降


    当我假设这一点时,我是不是太天真了?

    bam_presatie_AllInstances和其他表有多少列?看起来您正在破坏所有列,这肯定是一个性能问题

    您是否尝试过从特定表中选择特定列,例如:

    select top 100 p.column1, p.column2, p.column3
    
    而不是像当前那样查询所有列:

    select top 100 *
    

    请在…之间发布表schemause运算符。。。而且。。。对于这两个日期,如果在
    WHERE
    子句中不使用联接,为什么会有联接?因为我需要来自其他数据库的数据,并且需要将它们转换为c#中的列表。但很明显,如果我在z数据上做where's,速度会快得多,所以你所说的是有道理的,这只是语法上的糖分——底层的查询计划将是相同的,所以我担心这真的没有帮助。另外,这可能会返回不同的结果。包括在内,加上你说的23:00……不,不是这样的。日期存储为DATETIME,而不是特定格式的字符串。您指定的字符串将转换为日期时间,并将对它们进行比较。@marc\s:是的,我同意。但是,当进行比较时,不是每行都会进行转换吗?谢谢你的回复。我希望不会!我相信SQL Server的查询优化器足够聪明,可以将这两个边界值转换一次,然后对每一行重新使用它们。。。在充分阅读问题之前,我先跳起来!我已经做了所有这些,这是标准的。我还选择了字段,这只是为了让查询更具可读性。我发现的主要问题是,如果我删除前100名,它会运行得更快,我认为当我使用前100名时,它会将其复制到临时数据库。我显然不能全部使用,因为这会使我们的网络过载。