Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 143
  • Last Modified:

create index to c1, c2 and c3

hi have this dinamic query

depending on the parameters selected the query could be
--query 1
select .. from .. where c1=1

--query 2
select .. from .. where c1=1 and c2='lop'

--query 3
select .. from .. where c1=1 and c3=10

--query 4
select .. from .. where c2='pol' and c3=90

as I create the index? to column c1, c2 and c3
0
enrique_aeo
Asked:
enrique_aeo
3 Solutions
 
Ryan ChongCommented:
is that your question asking whether or not should we create the indexes for column c1, c2 and c3?

if this is the question, then the answer probably is yes. you can do that.

or if this is not the question you asking for, pls elaborate further for your question.
0
 
Pawan KumarDatabase ExpertCommented:
Well in this case you will have to create NON Clustered Index on all the three columns as you are searching at least on 2 parameters.

You can also create combination of 2 - 2 Nonclustered indexes but too many indexes will hamper the performance of the system.

Also, When you write this of kind query consider parameter sniffing in mind. Always use below approach.


IF @CustomerID IS NOT NULL
BEGIN
 SELECT @spexecutesqlStr = @spexecutesqlStr
 + N' AND [C].[CustomerID] = @CustID';
 SELECT @ExecStr = @ExecStr
 + N' AND [C].[CustomerID] = CONVERT(BIGINT, ' + CONVERT(NVARCHAR(30),@CustomerID) + N')';
END

http://www.sqlskills.com/blogs/kimberly/high-performance-procedures/

Enjoy !

Pawan Kumar Khowal
0
 
Guy Hengel [angelIII / a3]Billing EngineerCommented:
queries 1,2 and 3 may all 3 profit from an index on c1, but it mainly depends on the cardinality of the values of c1 if it's really profitable.

from what you wrote, c1 actually does not "look" like a good candidate, so I would create (at least9 the following indexes:
index1: C3  + C2
index2: C1  + C2
that will support with a minimal number of indexes most cases.

note: the order of the fields in the index is important!
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
Vitor MontalvãoMSSQL Senior EngineerCommented:
Since your query is very dynamic I would create 3 indexes, each one for each field.
So:
Index on C1
Index on C2
Index on C3

NOTE: By your sample C1 might be a bit field? If so, then don't create any index for C1 but for C2 and C3 only.
0
 
Scott PletcherSenior DBACommented:
In general terms:

What percentage of the time do you query on c1?  If you query on c1 most of the time, then cluster the table first on c1, assuming it is at all reasonably selective.

If you do that, then you can create a nonclustered index on:
(c2, c3) or
(c3, c2)
Index first on whichever one you search on most often.

Of course to be sure about clustering you'd need to look at index stats, including index missing, index usage and index operational stats.
0
 
enrique_aeoAuthor Commented:
c1, c2 and c3 are nonclustered index

the user enters the search parameters from webform.
The parameter are: firstname, lastname, nationalidnumber are varchar
0
 
Guy Hengel [angelIII / a3]Billing EngineerCommented:
what then is c1, c2 and c3?
0
 
enrique_aeoAuthor Commented:
c1= firstname
c2= lastname
c3= nationalidnumber
0
 
enrique_aeoAuthor Commented:
ok
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now