LIKE演算子の謎 ~その後~ | 野良エンジニアの足跡

LIKE演算子の謎 ~その後~

こんにちは、naginoです。


以前の記事 で書きました LIKE 演算子の挙動ですが、SQL Server 2005 SP3 で修正されました。

http://support.microsoft.com/default.aspx/kb/959019/ja


どれどれ、と思って


SET SHOWPLAN_TEXT ON
GO
select * from T WHERE CAST(P AS NCHAR(3)) LIKE '20%' COLLATE Japanese_CI_AS
GO
select * from T WHERE CAST(P AS NCHAR(3)) LIKE '20%' COLLATE Japanese_90_CI_AS
GO
SET SHOWPLAN_TEXT OFF


として見てみると、SP3 適用前も後も


|--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1011], [Expr1012], [Expr1013]))
|--Merge Interval
| |--Concatenation
| |--Compute Scalar(DEFINE:(([Expr1006],[Expr1007],[Expr1005])=GetRangeThroughConvert(N'20',NULL,(22))))
| | |--Constant Scan
| |--Compute Scalar(DEFINE:(([Expr1009],[Expr1010],[Expr1008])=GetRangeThroughConvert(NULL,N'2¼',(10))))
| |--Constant Scan
|--Index Seek(OBJECT:([like_test].[dbo].[T].[I]), SEEK:([like_test].[dbo].[T].[P] > [Expr1011] AND [like_test].[dbo].[T].[P] < [Expr1012]), WHERE:(CONVERT(nchar(3),[like_test].[dbo].[T].[P],0) like N'20%') ORDERED FORWARD)


|--Index Scan(OBJECT:([like_test].[dbo].[T].[I]), WHERE:(CONVERT_IMPLICIT(nchar(3),CONVERT(nchar(3),[like_test].[dbo].[T].[P],0),0) like N'20%'))


でした。

つまり、GetRangeThroughConvert の引数ではなく、挙動自体がおかしかったようです。


まあ、いずれにせよ直ったのは良いのですが、この現象に直面していた環境では、かなり影響が大きいのではないでしょうか。