游标、临时表、触发器、COLLATE等等...
好了废话不多说开始进入正题吧 场景: 需要通过用户输入的姓名关键字来搜索用户。用户输入关键字'x'来搜索用户(数据来源于表[Name字段中]或内存[List<UserInfo>]中) 要求: 得到的结果排序应为: x xia xiao yx 即:
各位大侠能否给出一套c#与sql server(2008)的解决方案? 补充: 如果能一起解决中文问题最好,如搜索'x' 得到的结果排序应为: x xiani 夏荣 肖小笑 杨星 即将汉字的拼音首字母纳入在内,不知sqlserver是否支持这一特性的搜索?
感谢[学习的脚步]这位网友提出来的问题 其实要解决这个问题不难,无非就是汉字转拼音首字母 --------------------------------------------------------------------------------------------- 先给出解决方案一
代码
这个解决方案已经满足查询要求 其它都不管 我们重点来看看这次写的这个函数 象这样的汉字转拼音函数在网上一搜一大把 今天我就要举例几个方案让大家对优化及开销有个清楚的概念
解决方案一写的函数实在是太糟糕了(以上及接下来举出的案例并无冒犯任何雷同及原创代码之意,还请多多包涵)
为什么这么说呢
这是它的执行计划 它用了临时表并且排序 表插入开销0.01 表扫描开销0.003 表排序0.011 估计总开销0.0246 实际执行:我拿1万行数据调用此函数花了我20几秒、一个查询操作你愿意等20多秒吗 所以看到这样的执行计划实在很抱歉
解决方案二
代码
这是很聪明的一个解决方案,它巧妙的运用了排序使其利用序号位置int ASCII 代码转换为字母 这个方案能很漂亮的将汉字转为拼音 那么我们来看看它的执行计划是怎样的
看完之后也不得不为这个漂亮之举感到惋惜 排序开销0.01156 总估计开销大概0.01159 实际执行:我拿1万行数据调用此函数花了10几秒 当然它比解决方案一效率要高出一倍之多
解决方案三 既然解决方案一大部分开销花在表插入及排序上面那么我们把里面的临时表拿出来新建一个物理表并且建上主键让它聚集索引会怎样呢
代码
物理建表代码我就没有提供了 直接参考解决方案一临时表
果然,此方案总开销只花了0.003 实际执行:我拿1万行数据调用此函数花了4~5秒左右 没有了临时表,没有了插入,没有了排序这个简单的方法比漂亮的解决方案二效率更高 --------------------------------------------------------------------------------------------------------------- 现在仔细想想 有没有什么方法能让它连聚集索引都不需要呢 这样岂不连0.003的开销都没有了? 刚才写出了解决方案四就实现了这一点
代码
估计运算开销 0 实际执行:1万行数据调用此函数只花了1~2秒
这样就满足了? 其实解决方案四还有优化的空间、不过这次仅仅只是代码及逻辑上的优化 解决方案五
代码
估计运算开销 0 实际执行:1万行数据调用此函数0~1秒 ----------------------------------------------------------------------------------------------------------
好了,这些方案我都写完了、简单的总结一下 其实不管你写了多少年的SQL 有的时候不要养成一种先入为主、自作聪明的观念 一个优秀的解决方案也许只需最简单的代码就能达到理想的效果。 所以谨以此篇文章来希望让更多的人看到,其实我们生活当中经常所遇到的问题往往都是我们无限的把它复杂化,严重化了 退一步海阔天空、换个角度想想吧 |
|
来自: goldbomb > 《Database》