1)我正在制作一个应用程序,其中我正在显示一个摘要表。单击每个摘要列时,我可以按升序或降序进行排序。例如,有5列
2)因此,在正常情况下,我将创建至少5个单独的SQL查询来提供此功能。这可以作为预备声明创建。
3)但是创建一个动态的单个SQL代码是一个好习惯,它可以考虑所有的条件和条件。正如我在下面所做的所有顺序?它将如何影响数据库性能?从现在起我不能把任何东西都写成准备好的陈述,我的执行会不会很慢?
请建议 感谢
CREATE DEFINER=`root`@`localhost` PROCEDURE `lSummary`(in fixedConditionList VARCHAR(1000),in OptionalConditionListForBackEnd VARCHAR(1000),in orderByColumnList VARCHAR(1000),in optionalJoinStatement VARCHAR(1000),in startLimit int(10),in OptionalFilterListWithAnd VARCHAR(1000),in OptionalFilterListWithOr VARCHAR(1000),in selectColumnList VARCHAR(10000),in EndLimit int(10)) BEGIN DECLARE SQLStatement varchar(5000); SET @SQLStatement = CONCAT("select l.lCaseId,concat('Staf') as canWrite,concat('Staf') as canShare,DATE_FORMAT(c.nextCourtDate,'%d-%m-%Y') as nextCourtDate,TIME_FORMAT( c.nextTime,'%h:%i %p' ) as nextTime,totalNumberOfSSteps,totalNumberOfSteps, ",selectColumnList," from litigation l left join(select relatedToId,relatedToPrefix,count(*) as totalNumberOfSteps from flowsubmilestoneinuse group by relatedToId) as wt on l.lCaseId=wt.relatedToId and l.lCasePrefix=wt.relatedToPrefix left join (select relatedToId,relatedToPrefix,count(*) as totalNumberOfSSteps from flowsubmilestoneinuse where milestoneReachedById Is not null group by relatedToId ) as wc on l.lCaseId=wc.relatedToId and l.lCasePrefix=wc.relatedToPrefix left join detail c on c.lCaseId= l.lCaseId ",optionalJoinStatement," where (",fixedConditionList,") AND (",OptionalConditionListForBackEnd,") AND (",OptionalFilterListWithAnd,") AND (",OptionalFilterListWithOr,") order by ",orderByColumnList," Limit ",startLimit,EndLimit); EXECUTE STMT; END
答案 0 :(得分:0)
关于数据库性能:通常 - 是的,动态查询会影响性能。 在引擎盖下,SQL Server引擎创建查询执行计划,甚至是动态查询。在这种情况下,您必须尝试评估性能。此外,您可以分析执行计划并改进它。
我可以看到你对T-SQL很不错,但我觉得你使用的是错误的工具。当然,SQL Server可以处理这类任务,但我的建议是:让客户端处理排序,同时使用SQL Server作为它的主要角色 - 获取数据。
想想这一点:一旦你在内存中拥有了你的数据集,进行内存中排序比向服务器发送新请求要快得多。正确?
当然,这取决于您使用的客户端技术。例如,如果您使用的是基于Web的客户端,那么有许多基于jQuery的产品可以为您完成(例如,请参阅www.jtable.org)。此外,对于.NET,有许多表控件易于使用并针对排序进行了优化。