Xquery Speedup/Optimization
This is another example that demonstrates how Relational Databases are really good at finding lots of small bits of data and putting them together, but quite rubbish at taking large slabs of data and pulling them apart again.
Xml querying functions go some way towards improving this but by far the best way is to move the data that you'll be filtering by (i.e. that appears in where clauses in your queries) into old-fashion table fields and properly index them.  You already have a separate Phone Number field - make sure that your application code updates that when storing this data.  You might also consider triggers if you're worried about people and/or other applications changing the data by &quot;other means&quot;.
Casting the field from XML into text completely defeats the point of holding this data as XML at all.  If that sequence of character were to appear anywhere in the entire XML structure then that record would be returned - potentially lots of &quot;false positives&quot;.
Why is it faster with the cast?  The DBMS doesn't have to go through all the [relatively slow] XML processing and can &quot;just&quot; scan through the entire table, doing a [relatively quick] &quot;string&quot; search on the cast'ed field.
Why a table scan?  Well, you have a leading wildcard on that criteria, which will effectively prevent the DBMS from using any indexing on that field.  Expect your query performance to degrade horribly as the table grows in size.