在sql查询中放置所有排除条件,还是先获取所有结果,然后在内存中执行排除代码?

在sql查询中放置所有排除条件,还是先获取所有结果,然后在内存中执行排除代码?,sql,performance,database-agnostic,Sql,Performance,Database Agnostic,在我的查询中,我希望获得同一城市的所有用户。最终用户也可以使用此查询,以便他们可以看到同一城市的其他用户。 我查询用户表,以便它检索所有用户,甚至是运行查询的用户 现在有两种选择: 我可以添加一个条件来查询user.id!=(查询运行用户的用户ID) 或者在显示查询结果并删除运行查询的用户之前处理查询结果 我用哪一个重要或有相当大的影响 注意-我的主查询不像查找同一个城市那么简单,而是使用3个表连接来访问用户想要显示的数据。我只是简单地把city放在这里。您可以使用第一个选项,因为3个表连接+条

在我的查询中,我希望获得同一城市的所有用户。最终用户也可以使用此查询,以便他们可以看到同一城市的其他用户。 我查询用户表,以便它检索所有用户,甚至是运行查询的用户

现在有两种选择:

  • 我可以添加一个条件来查询user.id!=(查询运行用户的用户ID)

  • 或者在显示查询结果并删除运行查询的用户之前处理查询结果

  • 我用哪一个重要或有相当大的影响


    注意-我的主查询不像查找同一个城市那么简单,而是使用3个表连接来访问用户想要显示的数据。我只是简单地把city放在这里。

    您可以使用第一个选项,因为3个表连接+条件并没有那么大。

    从提供的信息来看,选择哪个选项应该没有什么明显的区别-第一个选项可能会稍微优先,因为它需要从数据库中检索的数据稍微少一点。

    我不想成为给出标准答案的人,但是。。。。对这两个选项进行一些性能测试,然后选择一个更快的选项。如果差异是不确定的,那么选择一个对未来开发人员来说更容易的。我想把它放在查询中对开发人员来说比较容易,因为结果可能会在多个地方使用,签入代码可能在使用时处理得最好(因此每次使用都会复制检查)。

    这取决于我的一般经验,如果在数据库查询中添加代码和在数据库中进行筛选的参数会显著减少返回的数据,这通常意味着数据库实际上能够使用这些东西来制定更好的执行计划,内部工作集更小(而不仅仅是在线工作集),而且通常更好

    例如,在我最近帮助某人的一个查询中,可以编写该查询以返回所有成对的朋友。但是,从应用程序的角度来看,任何特定页面上都只需要特定人的朋友,因此不需要返回刚刚丢弃的额外数据,查询计划本身也不同,因为交叉连接的一侧会有一个较小的集合。无论如何,我的观点是,通常你最好给数据库尽可能多的信息,让它在那里工作