Solved

Help improve query execution time

Posted on 2014-10-30
9
148 Views
Last Modified: 2014-10-30
Hi All,

Execution of the query below takes roughly 20 mins. qry1 has nearly 3 million records. The other table sizes are about 30k each. The problem is certainly at the 'NOT IN' point, but I'm not familiar enough with 'EXISTS' or other methods to speed this up.

	SELECT				 CASE 
				 
						WHEN 
							J1.Provider_Type_Description = 'C' 
							OR 
							J1.Provider_Type_Description = 'H' 
						THEN 
							J1.Provider_Type_Description 
							
						WHEN J1.Provider_Id NOT IN (SELECT T1.Provider_ID FROM qry1 T1

											INNER JOIN qry2 J1
														ON J1.Provider_Id = T1.Provider_Id
														
													INNER JOIN qry3 J2
														ON J1.Specialisation_Description = J2.Specs)
																	
						 
						THEN							
							'T'
						ELSE
							'O' 				
						END as Type_1 
			
				
FROM qry0 T1

LEFT JOIN
	(SELECT DISTINCT Provider_Id, Provider_Name, Provider_Type_Description, provider_owner_name FROM qry4) AS J1
	ON
		T1.provider_id  = J1.provider_id

Open in new window

0
Comment
Question by:James Elliott
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 4
9 Comments
 
LVL 143

Accepted Solution

by:
Guy Hengel [angelIII / a3] earned 500 total points
ID: 40413115
what would be helpful is the explain plan.

in short, the translation of the syntax goes like this:
WHERE ...
AND field NOT IN ( SELECT column FROM ...  WHERE ... )
translates into:
WHERE ...
AND NOT EXISTS ( SELECT NULL FROM ... WHERE ... AND field = column )

usually, some index is missing, likely on "field" of the outer table...
0
 
LVL 12

Author Comment

by:James Elliott
ID: 40413150
Great, I'm now using not exists and have indexed on both provider_id columns, resulting in an execution time of 1min45secs which is more than I had hoped.

Thanks
0
 
LVL 34

Expert Comment

by:ste5an
ID: 40413185
Still much too slow.. post your actual execution plan.
0
Forrester Webinar: xMatters Delivers 261% ROI

Guest speaker Dean Davison, Forrester Principal Consultant, explains how a Fortune 500 communication company using xMatters found these results: Achieved a 261% ROI, Experienced $753,280 in net present value benefits over 3 years and Reduced MTTR by 91% for tier 1 incidents.

 
LVL 12

Author Comment

by:James Elliott
ID: 40413363
I've tried taking out all commercially sensitive column/field/table names but it's taking way too long.

Thanks anyway.
0
 
LVL 34

Expert Comment

by:ste5an
ID: 40413376
Well, when it's okay for you.. But 3M rows is not much and testing against 30k also.
0
 
LVL 12

Author Comment

by:James Elliott
ID: 40413415
EE.jpg
Think my problem lies here, if that's any use to you?

Rgds
0
 
LVL 34

Expert Comment

by:ste5an
ID: 40413441
I don't think so. Imho you have not indexed all queries properly which are part of the actual problem (qry0-qry1).
SELECT  CASE WHEN J1.Provider_Type_Description = 'C'
                  OR J1.Provider_Type_Description = 'H' THEN J1.Provider_Type_Description
             WHEN NOT EXISTS ( SELECT   *
                               FROM     qry1 IT1
                                        INNER JOIN qry2 IJ1 ON IJ1.Provider_Id = IT1.Provider_Id
                                        INNER JOIN qry3 IJ2 ON IJ1.Specialisation_Description = IJ2.Specs
                               WHERE    J1.Provider_Id = IT1.Provider_ID ) THEN 'T'
             ELSE 'O'
        END AS Type_1
FROM    qry0 T1
        LEFT JOIN ( SELECT DISTINCT
                            Provider_Id ,                            
                            Provider_Type_Description                            
                    FROM    qry4
                  ) AS J1 ON T1.provider_id = J1.provider_id;

Open in new window

0
 
LVL 12

Author Comment

by:James Elliott
ID: 40413448
should I be adding a non-clustered index on all PK fields?
0
 
LVL 34

Expert Comment

by:ste5an
ID: 40413472
When you're interested in further optimizing your query, then we need the actual exection plan XML. Otherwise it's not really possible to help.

The only general approach: You need covering indices in the tables used by your views qry0-qry4.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Http Post send by Store Procedure Help 5 20
Replace statements HTML with HTML IF 8 46
What is needed to become a DBA? 7 46
HIghlights of SSIS? 3 40
This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
A Stored Procedure in Microsoft SQL Server is a powerful feature that it can be used to execute the Data Manipulation Language (DML) or Data Definition Language (DDL). Depending on business requirements, a single Stored Procedure can return differe…
Via a live example, show how to extract insert data into a SQL Server database table using the Import/Export option and Bulk Insert.
Viewers will learn how to use the UPDATE and DELETE statements to change or remove existing data from their tables. Make a table: Update a specific column given a specific row using the UPDATE statement: Remove a set of values using the DELETE s…

736 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question