之前有个项目要求做最佳匹配,要求如下
输入:字符串 比如31810484
输出:表Test中A字段与31810484最佳匹配的记录
最佳匹配的概念:
比如31810484,如果数据库里有
318
3181
31810
318104
3181048
那么应该选择与31810484最匹配的3181048做为输出
Step 1. 程序处理
接到这个需求之后,马上想到的是在程序里做比较,首先查询出所有的记录,然后拿目标串去匹配,匹配算法想的很简单.
1. 首先将数据库查询出的所有记录放在一个resultSet里面
2. 以某记录R的串长度(N)截取目标串前N位,如果截取后的串等于记录串R
3. 如果下一条匹配上的记录串比上一次的匹配记录串更长,则更新,一直找到最长匹配的那个为止.
这个代码写出来之后,逻辑上是OK的,后来代码检查时,发现这个效率实在是太低了,如果数据量小,OK. 如果数据量达到上千上万,效率就十分差了.
Step 2. 数据库处理
接着想,这个是数据库层面的事,应该由数据库来处理,于是花了一段时间去想写一个sql来处理这个需求,因数据库是oracle,我在这里写oracle版本
select * from (select * from Test where '31810484' like (A || '%') group by length(A) desc) where rownum <=1
这个sql能准确定位到最佳匹配.但是用了函数做为条件,效率也并不高.
Step 3. 加索引
给函数加索引,既是function base index.
于是加上了此索引
create index IDX_A_TEST ON Test (A || '%');
但是执行sql,发现还是很慢.
执行explain plan,发现此时还是全表扫描.
上网搜索才发现,原来需要设置些参数函数索引才会生效
ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;
alter system set query_rewrite_integrity=trusted;
alter system set optimizer_mode=first_rows;
加上之后,速度提升了3-4倍,但是还是有点慢,还需要提高,继续跟进...
分享到:
- 2009-08-05 13:17
- 浏览 2541
- 评论(0)
- 论坛回复 / 浏览 (0 / 2664)
- 查看更多
相关推荐
在本实例中,我们将深入探讨如何解析SQL Server的连接字符串,这是一个编程任务,主要涉及C++和.NET框架。理解并正确处理连接字符串对于任何需要访问SQL Server数据库的应用程序都至关重要。 首先,SQL Server连接...
如果内置函数无法满足需求,可以创建自定义PL/SQL函数来实现特定的字符串拆分逻辑。 7. **示例应用** 例如,我们有一个以逗号分隔的字符串,如"apple,banana,orange",我们可以使用`instr()` 和 `substr()` 结合...
总的来说,C#中检测和过滤SQL字符串的方法是多样的,关键在于根据项目需求和安全策略选择合适的方法,并结合最佳实践,确保应用程序的健壮性和安全性。同时,定期进行安全审计和更新防护策略也是必要的,因为新的...
在SQL Server等关系型数据库中,字符串数据通常存储在`VARCHAR`或`NVARCHAR`字段中,二进制数据存储在`VARBINARY`或`BLOB`类型字段中。每个字段都有预设的最大长度,当尝试存储的数据超过这个长度时,就会触发这个...
正确地书写SQL字符串至关重要,因为它直接关系到程序的安全性和效率。以下是一些关键知识点: 1. **SQL注入防范**: SQL注入是常见的网络安全问题,攻击者通过输入恶意SQL代码,篡改原有的查询逻辑。要避免这种...
有一些JavaScript库,如jQuery、lodash等,提供了现成的字符串清理函数,可以帮助处理SQL注入。此外,一些专门的安全库,如OWASP Java Encoder或Esapi4js,提供了更全面的防御机制。 五、后端验证的重要性 尽管...
1. **声明变量**:`DECLARE`关键字用于声明变量,这里声明了两个变量,`@tssj`用于存储结果,`@Sql_Sql`用于存储动态生成的SQL字符串。 2. **设置SQL字符串**:`SET`语句用于赋值,这里将一个包含变量`@tssj`的SQL...
SQL提供了丰富的内置函数,用于处理数据,包括数值函数、字符串函数、日期函数等。 - **数值函数**:如`ROUND`、`TRUNC`、`MOD`等,用于进行数学运算。 - **字符串函数**:如`SUBSTR`、`TRIM`、`UPPER`、`LOWER`等...
7. **字符串处理的最佳实践** - 使用参数化查询避免SQL注入攻击。 - 当处理大量数据时,考虑批量操作以提高性能。 - 对于复杂的字符串处理,可能需要编写存储过程或使用用户自定义函数。 在数据库脚本中,熟练...
1. **使用LIKE运算符**:SQL的LIKE关键字是用于在WHERE子句中匹配字符串模式的。例如,假设我们有一个名为`Employees`的表,其中有一列`Name`,我们想找出所有名字包含“John”或“Jane”的员工,可以使用以下查询:...
该方法通过正则表达式与`StrKeyWord`和`StrRegex`进行匹配,如果发现输入字符串中含有SQL关键字或特殊字符,就认为可能存在SQL注入,并返回`true`。 除了`CheckRequestQuery`方法,类中还有一个未完成的`CheckForm`...
1. **字符串匹配算法**:在Android中,常见的字符串匹配算法有Levenshtein距离(编辑距离)、Jaccard相似度、BM25等。这些算法能计算字符串之间的相似度,帮助找出与查询关键词最接近的匹配项。例如,Levenshtein...
总结来说,通过C#与SQL Server 2005的集成,我们可以创建一个安全且有效的登录系统,但需要注意连接字符串的配置、SQL查询的编写以及用户认证的安全性。在实际操作中,还需要对给定的压缩包文件进行详细分析,理解其...
- **`dynamic_string`**:表示SQL语句或PL/SQL块的字符串表达式。 - **`INTO`子句**:用于指定存储查询结果的变量或记录。 - **`USING`子句**:用于绑定参数,可以指定为输入(`IN`)、输出(`OUT`)或输入输出(`INOUT`)...
除了Hive内置的字符串函数,如concat、substring、trim等,自定义字符串函数可能提供了更丰富的文本处理能力,如正则表达式匹配、字符串格式化、编码解码等。 总的来说,这个压缩包提供的资源对于Hive用户来说是一...
- **传入的SQL字符串**:必须按照"MyBatis能识别的格式"编写,如"select XXX as instanceid, XXX as instancename ....",这样才能自动将查询结果映射到Java对象。 - **#{}与${}的区别**:`#{}`用于预编译处理,...
参数值为字符串,因此在SQL语句中使用单引号括起来。 #### GetIntByInt函数 与上一个函数类似,但参数值为整数,因此在SQL语句中不使用引号。 #### GetStrByStr函数 此函数也执行类似的查询,但返回的是字符串...
22. **SQL TRIM**:用于删除字符串的前导和尾随空格。 23. **SQL CREATE TABLE**:用于创建新表。 24. **SQL CREATE VIEW**:用于创建虚拟表,即视图。 25. **SQL CREATE INDEX**:用于创建索引以提高查询速度。 ...
使用 `LIKE` 操作符时,特别是当通配符 `%` 放在查询字符串的开头时,可能导致全表扫描。 - **示例**: - 可能导致全表扫描: ```sql EXPLAIN SELECT * FROM staffs WHERE NAME LIKE '%July%'; ``` - 较高效的...
// 如果字符串为空,直接返回空 if (str == String.Empty) return String.Empty; // 替换各种可能的SQL特殊字符 str = str.Replace("'", "‘").Replace(";", ";").Replace(",", ",").Replace("?", "?").Replace...