Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一种基于Java的SQL查询生成器的设计方法_Java_Sql_Sql Server_Hibernate_Optimization - Fatal编程技术网

一种基于Java的SQL查询生成器的设计方法

一种基于Java的SQL查询生成器的设计方法,java,sql,sql-server,hibernate,optimization,Java,Sql,Sql Server,Hibernate,Optimization,在我的webapp中,我需要创建一个查询引擎模块,用户可以在视图中选择所需的列和过滤器,并获取与这些查询相关的数据 因此,我必须使用这种格式构建SQL动态查询: 从主表中选择{columns}完全外部联接第二个表位于。。。完全外部连接第三个表位于。。。其中{filters} 列和筛选器在运行时是已知的。(只读) 实际上,我有一个很大的SQL Server视图(Java中的映射实体),它使其他SQL Server视图有3个完整的外部连接。我通过将关键字解析为And、OR、number、date、t

在我的webapp中,我需要创建一个查询引擎模块,用户可以在视图中选择所需的列和过滤器,并获取与这些查询相关的数据

因此,我必须使用这种格式构建SQL动态查询:
从主表中选择{columns}完全外部联接第二个表位于。。。完全外部连接第三个表位于。。。其中{filters}

列和筛选器在运行时是已知的。(只读)

实际上,我有一个很大的SQL Server视图(Java中的映射实体),它使其他SQL Server视图有3个完整的外部连接。我通过将关键字解析为And、OR、number、date、text等,在源代码中构建查询。。。 最后,我在前端模块中返回一个带有数据表的响应

但是,使用这种方法我面临性能问题(可伸缩性),我正在寻找一种更有效的方法来实现这一点

是否可以在子查询中拆分上面提到的SELECT查询以提高性能?还是有更好的设计方法


在这里,我实际使用的请求(名称已更改)与Hibernate一起使用:

SELECT * FROM BigView "+WHERE+" OPTION(ROBUST PLAN)
(BigView是4个视图的聚合:根表、表2、表3、表4)

顺便说一句,我知道
“+WHERE+”
是一种不好的做法,但这不是本主题的关注点

我本想改为使用它(删除SQL Server中的BigView和相关实体),但实际上它做了同样的事情,即使列限制带来了一点性能提升:

SELECT     ROW_NUMBER() OVER (ORDER BY id) AS rownum, tmp.* FROM ( SELECT  '' AS id, "+columns+" "+
                        "FROM RootTable FULL OUTER JOIN "+
                        "Table2 ON RootTable.RT_ID = Table2.RT_N FULL OUTER JOIN "+
                        "Table3 ON RootTable.RT_ID = Table3.RT_ID FULL OUTER JOIN "+
                        "Table4 ON RootTable.RT_ID = Table4.RT_N "+
                        WHERE+" ) AS tmp

我之前删除的问题不够集中,所以我希望这一个是正确的

编辑:我添加此筛选器(WHERE子句)以显示可以请求的内容,例如:
RT\u ID>'10'和(表2\u主题,如“%test%”或表3\u Date=CONVERT(datetime,'24/09/2020',103)或(表3\u N不为null,表2\u ID0))

如果您正在寻找性能增强,我是否可以建议使用Spark?它具有类似SQL查询的内置操作,并且易于扩展。SQL查询中最差的性能通常来自OR、in()和其他条件,这些条件迫使引擎在不使用索引的情况下运行一个或多个整张表。如果有动态视图,则在其条件中也会发生相同的情况。在没有适当索引的情况下连接表也是一个问题。外部连接也不是很快。@ParthPandya我不知道Spark,我会检查它是否能解决某些问题。我也听说过普雷斯托,但我认为有一个更容易的办法solution@drkblog视图的格式不会更改或很少更改。但是,由于行和列的数量很大,BigView的执行时间很长。解决方案可能是在联接之前过滤每个视图。而且,在我的例子中必须使用外部联接,因为我需要对这些视图中的所有列执行搜索。@OFFEN是的,我假设您需要外部联接。必须对视图进行优化,因为在新查询中包含视图后,将无法获得更好的性能。但是你说你可以不去看风景。然后,您将面临一个巨大的挑战,即您的查询更改和SQL中的优化非常依赖于查询。如果对用户没有限制,我看不出您可以如何进行优化。您应该向所有列添加索引,这是不需要考虑的。您可以使用EXPLAIN sql命令获取有关查询的信息,并了解查询速度慢的原因。但同样,在每个查询的基础上。