SELECT
*
FROM TABLE
WHERE col.exist('*') = 0
假设我们有一个简单的表,包括两列,一列为ID IDENTITY型,一列为COL XML数据类型,里面的数据如下:
ID COL
------------------------------
1 <root/>
2 --col列为空
3 <root>test</root>
4
我们要查询其中COL为空的数据,一般的做法如下:
SELECT
*
FROM TABLE
WHERE CONVERT(VARCHAR(MAX),col) = ''
但实际上,我们不需要对这个列进行转换,利用XQUERY一样可以达到目的,实现如下:
SELECT
*
FROM TABLE
WHERE col.exist('*') = 0
对于这两种写法,其效率如何呢,经过我的测试,创建了一个测试表,结构如此表,我分别利用了AdventuresWorks的两个表
的XML列数据,构造了10万级的数据做为测试:
--AdventureWorks.Person.Contact
SQL Server Execution Times:
CPU time = 110 ms, elapsed time = 213 ms.
SQL Server Execution Times:
CPU time = 93 ms, elapsed time = 110 ms.
----Sales.Individual
SQL Server Execution Times:
CPU time = 6516 ms, elapsed time = 7023 ms.
SQL Server Execution Times:
CPU time = 1172 ms, elapsed time = 3438 ms.
测试过程中,其实发现IO是相等,而执行时间上,使用XQUERY的方法稍微要比列转换的方法快一些,由于Person.Contact
的XML列数据包含了太多的NULL值,因此,会看到时间上有比较大的差异,相信百万级的数据,应该更能体现差别,感兴趣
的朋友可以自己去测试.