[Solved] Searching thousands of records with SQL Server

How to optimize this SQL query?

In case you have your own slow SQL query, you can optimize it automatically here.

For the query above, the following recommendations will be helpful as part of the SQL tuning process.
You'll find 3 sections below:

  1. Description of the steps you can take to speed up the query.
  2. The optimal indexes for this query, which you can copy and create in your database.
  3. An automatically re-written query you can copy and execute in your database.
The optimization process and recommendations:
  1. Avoid Selecting Unnecessary Columns (query line: 55): Avoid selecting all columns with the '*' wildcard, unless you intend to use them all. Selecting redundant columns may result in unnecessary performance degradation.
  2. Avoid Subqueries (query line: 29): We advise against using subqueries as they are not optimized well by the optimizer. Therefore, it's recommended to join a newly created temporary table that holds the data, which also includes the relevant search index.
  3. Avoid Subqueries (query line: 39): We advise against using subqueries as they are not optimized well by the optimizer. Therefore, it's recommended to join a newly created temporary table that holds the data, which also includes the relevant search index.
  4. Avoid Subqueries (query line: 49): We advise against using subqueries as they are not optimized well by the optimizer. Therefore, it's recommended to join a newly created temporary table that holds the data, which also includes the relevant search index.
  5. Create Optimal Indexes (modified query below): The recommended indexes are an integral part of this optimization effort and should be created before testing the execution duration of the optimized query.
Optimal indexes for this query:
CREATE INDEX searchbrain_idx_imageid ON SearchBrain (ImageId);
CREATE INDEX searchdetails_idx_imageid ON SearchDetails (Imageid);
CREATE INDEX p2_kwdmgmt_idx_all_kwd ON p2_kwdmgmt (all_kwd);
CREATE INDEX searchcolors_idx_imageid ON searchcolors (Imageid);
The optimized query:
WITH cte AS (SELECT
        ROW_NUMBER() OVER (ORDER 
    BY
        sb.nbofviews DESC) AS ROW,
        sb.ImageId,
        sb.LicenceType,
        sb.ImgCollection,
        sb.nbofviews,
        sb.orientation,
        sb.shootdate,
        sd.ImgName,
        sd.Caption,
        sd.ImgPath,
        sd.ImageType,
        sd.ImgHoverPath,
        sc.image_color 
    FROM
        SearchBrain sb,
        SearchDetails sd,
        searchcolors sc 
    WHERE
        sc.Imageid = sd.Imageid 
        AND sb.ImageId = sd.ImageId 
        AND sd.imageid IN (SELECT
            SearchInitial.ImageId 
        FROM
            SearchInitial 
        WHERE
            SearchInitial.Primarykeyword = (SELECT
                TOP 1 p2_kwdmgmt.Primary_kwd 
            FROM
                p2_kwdmgmt 
            WHERE
                p2_kwdmgmt.all_kwd = 'man') INTERSECT SELECT
                SearchInitial.ImageId 
            FROM
                SearchInitial 
            WHERE
                SearchInitial.Primarykeyword = (SELECT
                    TOP 1 p2_kwdmgmt.Primary_kwd 
                FROM
                    p2_kwdmgmt 
                WHERE
                    p2_kwdmgmt.all_kwd = 'jumping') INTERSECT SELECT
                    SearchInitial.ImageId 
                FROM
                    SearchInitial 
                WHERE
                    SearchInitial.Primarykeyword = (SELECT
                        TOP 1 p2_kwdmgmt.Primary_kwd 
                    FROM
                        p2_kwdmgmt 
                    WHERE
                        p2_kwdmgmt.all_kwd = 'beach'))) SELECT
                    * 
                FROM
                    cte 
                WHERE
                    cte.ROW BETWEEN 0 AND 31

Related Articles



* original question posted on StackOverflow here.