Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server and performance for dynamic searches

I was wondering what were the best practices for making a query in sql with a dynamic value, lets say i have a Value(nvarchar(max))

value: "912345678"

select * from AllData
where Number like '%912345678%' 

value: "Michael"

select * from AllData
where Name like '%Michael%' 

value: "Street number 10"

select * from AllData
where Address like '%Street number 10%' 

This approuches are a bit slow since searching for a number that has 9 digits would be faster without % like this

select * from AllData
where Number like '912345678' 

I use a EDMX to make a connection to an external database in C#, like this:

var Result = EDMXEntity.Entities.Where(x => 
(SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Name.ToString().ToLower()) > 0) 
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Number.ToString().ToLower()) > 0)
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Address.ToString().ToLower()) > 0)).Take(50).ToList();

How can i increase performance?

like image 671
BrunoMartinsPro Avatar asked Jun 19 '15 11:06

BrunoMartinsPro


People also ask

Is static or dynamic SQL faster?

In some cases, static SQL is faster because of the resource use required to prepare the dynamic statement. In other cases, the same statement prepared dynamically issues faster, because the optimizer can make use of current database statistics, rather than the database statistics available at an earlier bind time.

Why is dynamic SQL faster?

Dynamic SQL has the advantage that a query is recompiled every time it is run. This has the advantage that the execution plan can take advantage of the most recent statistics on the table and the values of any parameters.

Can I use CTE in dynamic SQL?

Using CTEs, for instance, you can use SELECT from <subquery> in Open SQL. In my case I needed to execute dynamic SELECT count( DISTINCT col1, col2, …) which is not possible in the regular OpenSQL.


2 Answers

Wildcard searches like these on varchar/nvarchar fields are going to to iterate over every character, more or less, for records that meet the critieria.

A great (and fast!) option for these kinds of searches is to:

  1. Make a fulltext catalog to store fulltext indexes.
  2. Put a fulltext index on the columns in each table you need to search.
  3. Use the CONTAINS keyword when you search rather than wildcards.

You mentioned looking for credible sources, here is a good read.

like image 191
Chris Schubert Avatar answered Sep 29 '22 08:09

Chris Schubert


If using LIKE and PATINDEX didn't get you needed performance then you probably should write sp which will use FTS.

like image 22
Max Avatar answered Sep 29 '22 09:09

Max