当前位置: 首页 > 面试题库 >

当使用不确定数量的参数时,如何避免使用动态SQL?

史英睿
2023-03-14
问题内容

我有一个正在使用的数据库的类似于StackOverflow的标记系统。我正在编写一个存储过程,该存储过程基于WHERE子句中未确定数量的标签来寻找结果。可能有0到10个标签之间的任意位置来过滤结果。因此,例如,用户可能正在搜索带有“
apple”,“ orange”和“ banana”标签的商品,并且 每个
结果都必须包含所有3个标签。我的查询变得更加复杂,因为我还要处理一个用于标记的交叉引用表,但是出于这个问题的目的,我将不再赘述。

我知道我可以做一些字符串操作,并为exec()函数提供查询以解决此问题,但我宁愿不要解决与动态SQL相关的性能问题。我认为最好是SQL为存储的proc缓存查询计划。

在这种情况下,您使用了哪些技术来避免动态SQL?

根据大众的需求,这是我正在使用的查询:

SELECT ft.[RANK], s.shader_id, s.page_name, s.name, s.description, s.download_count, s.rating, s.price FROM shader s 
INNER JOIN FREETEXTTABLE(shader, *, @search_term) AS ft ON s.shader_id = ft.[KEY]
WHERE EXISTS(SELECT tsx.shader_id FROM tag_shader_xref tsx INNER JOIN tag t ON tsx.tag_id = t.tag_id WHERE tsx.shader_id = s.shader_id AND t.tag_name = 'color')
AND EXISTS(SELECT tsx.shader_id FROM tag_shader_xref tsx INNER JOIN tag t ON tsx.tag_id = t.tag_id WHERE tsx.shader_id = s.shader_id AND t.tag_name = 'saturation')
ORDER BY ft.[RANK] DESC

这是功能性但硬编码的。您会看到我已设置它来查找’color’和’saturation’标签。


问题答案:

有关此问题和类似问题的详细概述,请参见:http :
//www.sommarskog.se/dyn-search-2005.html

特定于您的问题的部分在这里:http : //www.sommarskog.se/dyn-
search-2005.html#AND_ISNOTNULL

还应考虑到(直接)动态解决方案不一定比(可能是复杂的)静态解决方案慢,因为查询计划仍然可以缓存:请参阅http://www.sommarskog.se/dyn-
search-2005.html #dynsql

因此,您必须考虑实际查询,针对实际数据量仔细测试/衡量您的选项(例如,使用一个或两个参数进行搜索可能比使用十个参数进行搜索等更为常见)。

编辑:发问者给出了在注释中优化此内容的充分理由,因此将“过早”警告移开了一点:

警告(标准;)字眼仍然适用: 这闻起来很像过早的优化! -您确定经常会调用此sproc吗,因为使用动态SQL的速度会 大大
降低(也就是说,与应用程序中发生的其他事情相比)?



 类似资料:
  • 我正在使用SQLALchemy对Teradata执行查询。我执行的查询之一是替换存储过程的DDL语句: 此SQL语句被分配给变量,并由SQLALchemy使用会话执行方法执行: 问题是SQLAlchemy假设变量是一个应该随字典一起提供的参数。请参阅以下文档:http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.o

  • 问题内容: 我正在寻找一个窍门。我知道如何在JavaScript中调用动态的任意函数,并传递特定的参数,如下所示: 我知道如何使用内部的集合传递可选的,无限制的参数,但是,我不知道如何发送任意数量的参数以动态发送给它;我该如何完成这样的工作,但是要有任意数量的可选参数(不要使用丑陋的– )? 问题答案: 使用函数的apply方法:- 编辑 :在我看来,这将是一个稍微的调整会更有用: 这将在浏览器之

  • this.$refs.XX,XX部分希望是不确定的,根据传入参数确定,这个怎么实现? 使用模板语法this.$refs.${XX},报错

  • 我这里有一个WAV文件:http://uppit.com/slpmuzpywxhs/202.wav 我需要使用以下参数基于声音文件的属性构造Java AudioFormat对象: 浮动样本速率,int sampleSizeInBits,int 通道,布尔符号,布尔大端。 所以我的问题是:如何分析WAV文件以确定这些值? 编辑:多亏了杰克特找到解决方案!

  • 问题内容: 现在,我正在尝试对汇编程序进行编码,但我不断收到此错误: 我目前有以下代码: 感谢帮助。 问题答案: 您通常使用默认值 如果key在字典中,则返回key的值,否则返回默认值。如果未提供default,则默认为None,因此此方法永远不会引发KeyError。 因此,当您使用循环时,将如下所示: 打印: 如果要显式检查键是否在字典中,则必须检查键是否在字典中(无索引!)。 例如: 但是该

  • 问题内容: 我有一个客户端库,在该客户端库中对我的REST服务进行http远程调用,然后返回给客户,该客户正在调用我的库,其中包含从REST服务获得的响应以及所有错误(如果包装了任何错误)围绕对象。 这是我的枚举类: 这是我的枚举类: 如您所见,在我的课堂上我有很多领域,因此我有一个很长的构造器,每次当我做一个对象的时候都会有很大的联系。将来我可能会有更多的字段,但目前只有这些字段。 有什么更好的