|
我有一个查询,使用带通配符的“ like”来搜索客户端。例如:
. f7 |$ P/ X( a ^SELECT TOP (10) + F: H! a9 l+ a! n( p
[t0].[CLIENTNUMBER],
! U5 U; w: R; E/ u! M7 B( p [t0].[FIRSTNAME], 4 a/ y$ P9 t" W6 T: ~" \6 M W- {
[t0].[LASTNAME], $ h+ e- V0 _, N ]3 o. x2 M7 y
[t0].[MI],
/ m& \5 j7 z F! r8 n; y6 p [t0].[MDOCNUMBER]
* a# X% d- Q) d/ p5 ?; |) ^+ K# o FROM [dbo].[CLIENT] AS [t0]8 @/ u T6 E- Y, z
WHERE (LTRIM(RTRIM([t0].[DOCREVNO])) = '0')
6 h" D: M1 O- q3 d2 } AND ([t0].[FIRSTNAME] LIKE '%John%')
( o9 B. d! h7 f$ f0 L AND ([t0].[LASTNAME] LIKE '%Smith%')
2 i% W2 A p- n/ b AND ([t0].[SSN] LIKE '%123%') 1 m0 ^% D) c5 ?
AND ([t0].[CLIENTNUMBER] LIKE '%123%') , D& H( P* g2 d8 E3 w: l
AND ([t0].[MDOCNUMBER] LIKE '%123%')
5 P3 {6 m$ P7 z7 L; A AND ([t0].[CLIENTINDICATOR] = 'ON')% @5 b# F$ X. v; B0 V
它还可以在“ where”子句中使用较少的参数,例如:
4 c! M ^5 {" W8 |SELECT TOP (10)
4 I6 r3 h7 V' s3 o% q [t0].[CLIENTNUMBER],
( [$ o0 {9 d$ t/ h) S1 M9 C$ | [t0].[FIRSTNAME], * G4 L5 j2 E# z# y
[t0].[LASTNAME],
/ P7 O, J2 Y: m6 e3 p& G2 ] [t0].[MI],
5 `) N2 h% l& q$ S% I% ^2 p- h) w [t0].[MDOCNUMBER]2 v5 \% p& r* L& z f1 {
FROM [dbo].[CLIENT] AS [t0], k: c1 n" o# S0 R
WHERE (LTRIM(RTRIM([t0].[DOCREVNO])) = '0')
2 V0 x$ F# m" N1 e AND ([t0].[FIRSTNAME] LIKE '%John%')
. |% u6 J( A* @* Y AND ([t0].[CLIENTINDICATOR] = 'ON')& ]6 y9 L* E* x3 x% o! U
谁能说出优化这种查询性能的最佳方法是什么?也许我需要创建一个索引?该表在生产中最多可以有1000K条记录。2 ^6 p9 M5 i, v# X+ |( g! H
7 `- D) P1 f4 _: j, H; I1 k
解决方案:
: h: C5 N( n o( l : b7 J: D8 y+ |. q! P1 ?9 p) N w
* U6 j/ Z; g; E0 { A A1 M: S6 I1 F, X/ S+ x6 A
要LIKE在模式具有表单的位置上做很多事情'%XXX%',您需要查找SQL
7 s7 C0 Z' k4 p. J/ UServer的全文本索引功能,并使用CONTAINS代替LIKE。照原样,您正在执行全表扫描,因为普通索引对搜索以通配符开头的项目没有帮助-) o. N. F0 E8 _7 R3 q* `
但全文索引会帮助您。
# M# v& D2 l% q# c, A; C3 j$ \/* ... */
% V3 ]% I+ D. U$ A. o! b! P WHERE (LTRIM(RTRIM([t0].[DOCREVNO])) = '0')
+ \& D$ B% {0 ^: q2 Z AND (contains([t0].[FIRSTNAME], 'John')) & ~! _" S% x/ l
AND (contains([t0].[LASTNAME], 'Smith'))
6 }0 r3 `2 j+ q- s AND (contains([t0].[SSN], '123'))
6 w; S: E" o4 I5 S AND (contains([t0].[CLIENTNUMBER],'123'))
7 D1 S; U! o9 J2 V) R. L7 i AND (contains([t0].[MDOCNUMBER], '123'))
/ h( i+ |7 M4 I! t AND ([t0].[CLIENTINDICATOR] = 'ON') |
|