KE@custname + '%'
?
但是分别加上IS NOT NULL是有目的的,加上之后,优化器可以把三个条件上的索引通过索引连接的方式来生成执行计划。由于IS NOT NULL条件,SQL Server可以在运行时添加一个名为“启动表达式(startup expression)”的筛选操作符,这个操作符可以根据实际情况仅访问所需的索引,而不会像代码中的那样。
不过这种策略需要所有的查询条件都作用在一个表上,并且有相对合理的索引。如果查询条件涉及不同的表,那么性能上并不一定满足你的期望。
?
小结:
很多编码和优化资料上显示不要过多使用OR,因为会导致非SARG的出现。从而影响性能。但是在上面情况中,OR表现得还可以,所以我们不要因为某些“铁律”、“军规”而不去考虑和尝试其他方式。最后还要强调一下,不要盲目使用这种策略,你需要验证每种策略的执行计划和性能是否满足期望。
全文检索:
除了上面两种方式之外,当你需要查找一个表或者一个固定集合(也就是说不会根据条件动态添加移除数据表)进行不同条件的查询时,使用大量的索引来支持各种查询往往不能得到什么好处。
从SQL 2005开始引入了全文检索(Fulltext),从一定程度上解决了这种问题。但是从应用经验上来说,由于计算机和SQL Server这类RDBMS是老外开发的,所以对中文的支持并不如人意。所以这里只是提一下,对于英文环境的系统,这种方式是可以考虑的。
总结:
本文演示了对于一些简单的关键字查询的处理方案。主要使用了IF/OR两种方式,正如文中多处写到的,任何一种方式都应该做充分的验证和测试,特别是在一定数据量下,否则你在小数据库上运行得很好,说不定到正式环境下就奔溃了。