SELECT with OPTIMIZE FOR Hints


1. Sales Report with OPTIMIZE FOR a narrow date range (Using Input Values)

SQL Server Query 1

            
 -- Advanced Query: Sales Report with OPTIMIZE FOR a narrow date range  
DECLARE @ReportStartDate DATETIME;
DECLARE @ReportEndDate DATETIME;
SET @ReportStartDate = '1997-08-01';
SET @ReportEndDate = '1997-08-07'; -- A 7-day window
SELECT
O.OrderID,
O.OrderDate,
C.CompanyName,
E.FirstName + ' ' + E.LastName AS EmployeeName,
SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)) AS OrderTotalValue
FROM Orders AS O
JOIN Customers AS C ON O.CustomerID = C.CustomerID
JOIN Employees AS E ON O.EmployeeID = E.EmployeeID
JOIN [Order Details] AS OD ON O.OrderID = OD.OrderID
WHERE O.OrderDate >= @ReportStartDate AND O.OrderDate <= @ReportEndDate
GROUP BY O.OrderID, O.OrderDate, C.CompanyName, E.FirstName, E.LastName
ORDER BY O.OrderDate DESC
OPTION (
OPTIMIZE FOR (
@ReportStartDate = '1997-08-01', -- Optimize for a specific 7-day range
@ReportEndDate = '1997-08-07'
)
);

Create SQL query with SqlQueryBuilder 1

            
 var (sql1, parameters1) = new SqlQueryBuilder()  
.Select()
.Columns("O.OrderID","O.OrderDate","C.CompanyName")
.Column(new CONCAT(new Column("E.FirstName"), " ", new Column("E.LastName")), "EmployeeName")
.Column(new SUM(new ColumnArithmatic("OD.Quantity").MULTIPLY("OD.UnitPrice")
.MULTIPLY().StartBracket(1).SUBTRACT("OD.Discount").EndBracket()), "OrderTotalValue")
.From("Orders", "O")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Customers", "C")
.On(new Column("O.CustomerID").Equale(new Column("C.CustomerID"))),
new INNERJOIN().TableName("Employees", "E")
.On(new Column("O.EmployeeID").Equale(new Column("E.EmployeeID"))),
new INNERJOIN().TableName("[Order Details]", "OD")
.On(new Column("O.OrderID").Equale(new Column("OD.OrderID")))
})
.Where(new Where(new Column("O.OrderDate").GreaterThanOrEqualeTo("1997-08-01"))
.AND(new Column("O.OrderDate").LessThanOrEqualeTo("1997-08-07")))
.GroupBy(new GroupBy("O.OrderID","O.OrderDate","C.CompanyName","E.FirstName","E.LastName"))
.OrderBy(new OrderBy().SetColumnDescending("O.OrderDate"))
.Option(new List<IOption>()
{
new OPTIMIZE_FOR("1997-08-01","1997-08-07")
})
.Build();

Query build by SqlQueryBuilder 1

            
SELECT O.OrderID,
       O.OrderDate,
       C.CompanyName,
       CONCAT(E.FirstName, @pMAIN_2507192011455124090, E.LastName) AS EmployeeName,
       SUM(OD.Quantity * OD.UnitPrice * (@pMAIN_2507192011455124091 - OD.Discount)) AS OrderTotalValue
FROM Orders AS O
     INNER JOIN
     Customers AS C
     ON O.CustomerID = C.CustomerID
     INNER JOIN
     Employees AS E
     ON O.EmployeeID = E.EmployeeID
     INNER JOIN
     [Order Details] AS OD
     ON O.OrderID = OD.OrderID
WHERE O.OrderDate >= @pMAIN_2507192011455124092
      AND O.OrderDate <= @pMAIN_2507192011455124093
GROUP BY O.OrderID, O.OrderDate, C.CompanyName, E.FirstName, E.LastName
ORDER BY O.OrderDate DESC
OPTION (OPTIMIZE FOR (@pMAIN_2507192011455124092 = '1997-08-01', @pMAIN_2507192011455124093 = '1997-08-07'));


            
        

Parameters (If used)

Name Value
@pMAIN_2507192011455124090
@pMAIN_2507192011455124091 1
@pMAIN_2507192011455124092 1997-08-01
@pMAIN_2507192011455124093 1997-08-07

Query Results 1:

  OrderID OrderDate CompanyName EmployeeName OrderTotalValue
1 10623 8/7/1997 12:00:00 AM Frankenversand Laura Callahan 1336.94999694824
2 10624 8/7/1997 12:00:00 AM The Cracker Box Margaret Peacock 1393.23999023438
3 10622 8/6/1997 12:00:00 AM Ricardo Adocicados Margaret Peacock 560
4 10620 8/5/1997 12:00:00 AM Laughing Bacchus Wine Cellars Andrew Fuller 57.5
5 10621 8/5/1997 12:00:00 AM Island Trading Margaret Peacock 758.5
6 10619 8/4/1997 12:00:00 AM Mère Paillarde Janet Leverling 1260
7 10618 8/1/1997 12:00:00 AM Mère Paillarde Nancy Davolio 2697.5


2. Sales Report with OPTIMIZE FOR a narrow date range (Using Input Sequence)

SQL Server Query 2

            
 -- Advanced Query: Sales Report with OPTIMIZE FOR a narrow date range  
DECLARE @ReportStartDate DATETIME;
DECLARE @ReportEndDate DATETIME;
SET @ReportStartDate = '1997-08-01';
SET @ReportEndDate = '1997-08-07'; -- A 7-day window
SELECT
O.OrderID,
O.OrderDate,
C.CompanyName,
E.FirstName + ' ' + E.LastName AS EmployeeName,
SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)) AS OrderTotalValue
FROM Orders AS O
JOIN Customers AS C ON O.CustomerID = C.CustomerID
JOIN Employees AS E ON O.EmployeeID = E.EmployeeID
JOIN [Order Details] AS OD ON O.OrderID = OD.OrderID
WHERE O.OrderDate >= @ReportStartDate AND O.OrderDate <= @ReportEndDate
GROUP BY O.OrderID, O.OrderDate, C.CompanyName, E.FirstName, E.LastName
ORDER BY O.OrderDate DESC
OPTION (
OPTIMIZE FOR (
@ReportStartDate = '1997-08-01', -- Optimize for a specific 7-day range
@ReportEndDate = '1997-08-07'
)
);

Create SQL query with SqlQueryBuilder 2

            
 var (sql2, parameters2) = new SqlQueryBuilder()  
.Select()
.Columns("O.OrderID","O.OrderDate","C.CompanyName")
.Column(new CONCAT(new Column("E.FirstName"), " ", new Column("E.LastName")), "EmployeeName")
.Column(new SUM(new ColumnArithmatic("OD.Quantity").MULTIPLY("OD.UnitPrice")
.MULTIPLY().StartBracket(1).SUBTRACT("OD.Discount").EndBracket()), "OrderTotalValue")
.From("Orders", "O")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Customers", "C")
.On(new Column("O.CustomerID").Equale(new Column("C.CustomerID"))),
new INNERJOIN().TableName("Employees", "E")
.On(new Column("O.EmployeeID").Equale(new Column("E.EmployeeID"))),
new INNERJOIN().TableName("[Order Details]", "OD")
.On(new Column("O.OrderID").Equale(new Column("OD.OrderID")))
})
.Where(new Where(new Column("O.OrderDate").GreaterThanOrEqualeTo("1997-08-01"))
.AND(new Column("O.OrderDate").LessThanOrEqualeTo("1997-08-07")))
.GroupBy(new GroupBy("O.OrderID","O.OrderDate","C.CompanyName","E.FirstName","E.LastName"))
.OrderBy(new OrderBy().SetColumnDescending("O.OrderDate"))
.Option(new List<IOption>()
{
new OPTIMIZE_FOR(3, 4)
})
.Build();

Query build by SqlQueryBuilder 2

            
SELECT O.OrderID,
       O.OrderDate,
       C.CompanyName,
       CONCAT(E.FirstName, @pMAIN_2507192011455395350, E.LastName) AS EmployeeName,
       SUM(OD.Quantity * OD.UnitPrice * (@pMAIN_2507192011455395351 - OD.Discount)) AS OrderTotalValue
FROM Orders AS O
     INNER JOIN
     Customers AS C
     ON O.CustomerID = C.CustomerID
     INNER JOIN
     Employees AS E
     ON O.EmployeeID = E.EmployeeID
     INNER JOIN
     [Order Details] AS OD
     ON O.OrderID = OD.OrderID
WHERE O.OrderDate >= @pMAIN_2507192011455395352
      AND O.OrderDate <= @pMAIN_2507192011455395353
GROUP BY O.OrderID, O.OrderDate, C.CompanyName, E.FirstName, E.LastName
ORDER BY O.OrderDate DESC
OPTION (OPTIMIZE FOR (@pMAIN_2507192011455395352 = '1997-08-01', @pMAIN_2507192011455395353 = '1997-08-07'));


            
        

Parameters (If used)

Name Value
@pMAIN_2507192011455395350
@pMAIN_2507192011455395351 1
@pMAIN_2507192011455395352 1997-08-01
@pMAIN_2507192011455395353 1997-08-07

Query Results 2:

  OrderID OrderDate CompanyName EmployeeName OrderTotalValue
1 10623 8/7/1997 12:00:00 AM Frankenversand Laura Callahan 1336.94999694824
2 10624 8/7/1997 12:00:00 AM The Cracker Box Margaret Peacock 1393.23999023438
3 10622 8/6/1997 12:00:00 AM Ricardo Adocicados Margaret Peacock 560
4 10620 8/5/1997 12:00:00 AM Laughing Bacchus Wine Cellars Andrew Fuller 57.5
5 10621 8/5/1997 12:00:00 AM Island Trading Margaret Peacock 758.5
6 10619 8/4/1997 12:00:00 AM Mère Paillarde Janet Leverling 1260
7 10618 8/1/1997 12:00:00 AM Mère Paillarde Nancy Davolio 2697.5


3. Sales Report with OPTIMIZE FOR UNKNOWN on multiple parameters (Using Input Values)

SQL Server Query 3

            
 -- Advanced Query: Sales Report with OPTIMIZE FOR UNKNOWN on multiple parameters  
DECLARE @TargetCustomerID NCHAR(5);
DECLARE @ReportStartDate DATETIME;
DECLARE @ReportEndDate DATETIME;
SET @TargetCustomerID = 'SAVEA';
SET @ReportStartDate = '1996-01-01';
SET @ReportEndDate = '1997-12-31';
SELECT
O.OrderID,
O.OrderDate,
C.CompanyName,
E.FirstName + ' ' + E.LastName AS EmployeeName,
SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)) AS OrderTotalValue
FROM Orders AS O
JOIN Customers AS C ON O.CustomerID = C.CustomerID
JOIN Employees AS E ON O.EmployeeID = E.EmployeeID
JOIN [Order Details] AS OD ON O.OrderID = OD.OrderID
WHERE O.CustomerID = @TargetCustomerID
AND O.OrderDate >= @ReportStartDate AND O.OrderDate <= @ReportEndDate
GROUP BY O.OrderID, O.OrderDate, C.CompanyName, E.FirstName, E.LastName
ORDER BY O.OrderDate DESC
OPTION (OPTIMIZE FOR (@TargetCustomerID UNKNOWN, @ReportStartDate UNKNOWN, @ReportEndDate UNKNOWN));

Create SQL query with SqlQueryBuilder 3

            
 var (sql3, parameters3) = new SqlQueryBuilder()  
.Select()
.Columns("O.OrderID","O.OrderDate","C.CompanyName")
.Column(new CONCAT(new Column("E.FirstName"), " ", new Column("E.LastName")), "EmployeeName")
.Column(new SUM(new ColumnArithmatic("OD.Quantity").MULTIPLY("OD.UnitPrice")
.MULTIPLY().StartBracket(1).SUBTRACT("OD.Discount").EndBracket()), "OrderTotalValue")
.From("Orders", "O")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Customers", "C")
.On(new Column("O.CustomerID").Equale(new Column("C.CustomerID"))),
new INNERJOIN().TableName("Employees", "E")
.On(new Column("O.EmployeeID").Equale(new Column("E.EmployeeID"))),
new INNERJOIN().TableName("[Order Details]", "OD")
.On(new Column("O.OrderID").Equale(new Column("OD.OrderID")))
})
.Where(new Where(new Column("O.CustomerID").Equale("SAVEA"))
.AND(new Column("O.OrderDate").GreaterThanOrEqualeTo("1996-01-01"))
.AND(new Column("O.OrderDate").LessThanOrEqualeTo("1997-12-31")))
.GroupBy(new GroupBy("O.OrderID","O.OrderDate","C.CompanyName","E.FirstName","E.LastName"))
.OrderBy(new OrderBy().SetColumnDescending("O.OrderDate"))
.Option(new List<IOption>()
{
new OPTIMIZE_FOR_UNKNOWN("SAVEA", "1996-01-01","1997-12-31")
})
.Build();

Query build by SqlQueryBuilder 3

            
SELECT O.OrderID,
       O.OrderDate,
       C.CompanyName,
       CONCAT(E.FirstName, @pMAIN_2507192011455537180, E.LastName) AS EmployeeName,
       SUM(OD.Quantity * OD.UnitPrice * (@pMAIN_2507192011455537181 - OD.Discount)) AS OrderTotalValue
FROM Orders AS O
     INNER JOIN
     Customers AS C
     ON O.CustomerID = C.CustomerID
     INNER JOIN
     Employees AS E
     ON O.EmployeeID = E.EmployeeID
     INNER JOIN
     [Order Details] AS OD
     ON O.OrderID = OD.OrderID
WHERE O.CustomerID = @pMAIN_2507192011455537182
      AND O.OrderDate >= @pMAIN_2507192011455537183
      AND O.OrderDate <= @pMAIN_2507192011455537184
GROUP BY O.OrderID, O.OrderDate, C.CompanyName, E.FirstName, E.LastName
ORDER BY O.OrderDate DESC
OPTION (OPTIMIZE FOR (@pMAIN_2507192011455537182 UNKNOWN, @pMAIN_2507192011455537183 UNKNOWN, @pMAIN_2507192011455537184 UNKNOWN));


            
        

Parameters (If used)

Name Value
@pMAIN_2507192011455537180
@pMAIN_2507192011455537181 1
@pMAIN_2507192011455537182 SAVEA
@pMAIN_2507192011455537183 1996-01-01
@pMAIN_2507192011455537184 1997-12-31

Query Results 3:

  OrderID OrderDate CompanyName EmployeeName OrderTotalValue
1 10757 11/27/1997 12:00:00 AM Save-a-lot Markets Michael Suyama 3082
2 10748 11/20/1997 12:00:00 AM Save-a-lot Markets Janet Leverling 2196
3 10722 10/29/1997 12:00:00 AM Save-a-lot Markets Laura Callahan 1570
4 10713 10/22/1997 12:00:00 AM Save-a-lot Markets Nancy Davolio 2827.90002441406
5 10714 10/22/1997 12:00:00 AM Save-a-lot Markets Steven Buchanan 2205.75
6 10711 10/21/1997 12:00:00 AM Save-a-lot Markets Steven Buchanan 4451.69998931885
7 10700 10/10/1997 12:00:00 AM Save-a-lot Markets Janet Leverling 1638.40000915527
8 10678 9/23/1997 12:00:00 AM Save-a-lot Markets Robert King 5256.5
9 10657 9/4/1997 12:00:00 AM Save-a-lot Markets Andrew Fuller 4371.60000610352
10 10627 8/11/1997 12:00:00 AM Save-a-lot Markets Laura Callahan 1185.75
11 10612 7/28/1997 12:00:00 AM Save-a-lot Markets Nancy Davolio 6375
12 10607 7/22/1997 12:00:00 AM Save-a-lot Markets Steven Buchanan 6475.39999389648
13 10603 7/18/1997 12:00:00 AM Save-a-lot Markets Laura Callahan 1483
14 10555 6/2/1997 12:00:00 AM Save-a-lot Markets Michael Suyama 2944.40000915527
15 10510 4/18/1997 12:00:00 AM Save-a-lot Markets Michael Suyama 4707.53993225098
16 10452 2/20/1997 12:00:00 AM Save-a-lot Markets Laura Callahan 2018.5
17 10440 2/10/1997 12:00:00 AM Save-a-lot Markets Margaret Peacock 4924.13519287109
18 10398 12/30/1996 12:00:00 AM Save-a-lot Markets Andrew Fuller 2505.59985351562
19 10393 12/25/1996 12:00:00 AM Save-a-lot Markets Nancy Davolio 2556.95002746582
20 10324 10/8/1996 12:00:00 AM Save-a-lot Markets Anne Dodsworth 5275.71510314941


4. Sales Report with OPTIMIZE FOR UNKNOWN on multiple parameters (Using Input Sequence)

SQL Server Query 4

            
 -- Advanced Query: Sales Report with OPTIMIZE FOR UNKNOWN on multiple parameters  
DECLARE @TargetCustomerID NCHAR(5);
DECLARE @ReportStartDate DATETIME;
DECLARE @ReportEndDate DATETIME;
SET @TargetCustomerID = 'SAVEA';
SET @ReportStartDate = '1996-01-01';
SET @ReportEndDate = '1997-12-31';
SELECT
O.OrderID,
O.OrderDate,
C.CompanyName,
E.FirstName + ' ' + E.LastName AS EmployeeName,
SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)) AS OrderTotalValue
FROM Orders AS O
JOIN Customers AS C ON O.CustomerID = C.CustomerID
JOIN Employees AS E ON O.EmployeeID = E.EmployeeID
JOIN [Order Details] AS OD ON O.OrderID = OD.OrderID
WHERE O.CustomerID = @TargetCustomerID
AND O.OrderDate >= @ReportStartDate AND O.OrderDate <= @ReportEndDate
GROUP BY O.OrderID, O.OrderDate, C.CompanyName, E.FirstName, E.LastName
ORDER BY O.OrderDate DESC
OPTION (OPTIMIZE FOR (@TargetCustomerID UNKNOWN, @ReportStartDate UNKNOWN, @ReportEndDate UNKNOWN));

Create SQL query with SqlQueryBuilder 4

            
 var (sql4, parameters4) = new SqlQueryBuilder()  
.Select()
.Columns("O.OrderID","O.OrderDate","C.CompanyName")
.Column(new CONCAT(new Column("E.FirstName"), " ", new Column("E.LastName")), "EmployeeName")
.Column(new SUM(new ColumnArithmatic("OD.Quantity").MULTIPLY("OD.UnitPrice")
.MULTIPLY().StartBracket(1).SUBTRACT("OD.Discount").EndBracket()), "OrderTotalValue")
.From("Orders", "O")
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Customers", "C")
.On(new Column("O.CustomerID").Equale(new Column("C.CustomerID"))),
new INNERJOIN().TableName("Employees", "E")
.On(new Column("O.EmployeeID").Equale(new Column("E.EmployeeID"))),
new INNERJOIN().TableName("[Order Details]", "OD")
.On(new Column("O.OrderID").Equale(new Column("OD.OrderID")))
})
.Where(new Where(new Column("O.CustomerID").Equale("SAVEA"))
.AND(new Column("O.OrderDate").GreaterThanOrEqualeTo("1996-01-01"))
.AND(new Column("O.OrderDate").LessThanOrEqualeTo("1997-12-31")))
.GroupBy(new GroupBy("O.OrderID","O.OrderDate","C.CompanyName","E.FirstName","E.LastName"))
.OrderBy(new OrderBy().SetColumnDescending("O.OrderDate"))
.Option(new List<IOption>()
{
new OPTIMIZE_FOR_UNKNOWN(3, 4, 5)
})
.Build();

Query build by SqlQueryBuilder 4

            
SELECT O.OrderID,
       O.OrderDate,
       C.CompanyName,
       CONCAT(E.FirstName, @pMAIN_2507192011455678420, E.LastName) AS EmployeeName,
       SUM(OD.Quantity * OD.UnitPrice * (@pMAIN_2507192011455678421 - OD.Discount)) AS OrderTotalValue
FROM Orders AS O
     INNER JOIN
     Customers AS C
     ON O.CustomerID = C.CustomerID
     INNER JOIN
     Employees AS E
     ON O.EmployeeID = E.EmployeeID
     INNER JOIN
     [Order Details] AS OD
     ON O.OrderID = OD.OrderID
WHERE O.CustomerID = @pMAIN_2507192011455678422
      AND O.OrderDate >= @pMAIN_2507192011455678423
      AND O.OrderDate <= @pMAIN_2507192011455678424
GROUP BY O.OrderID, O.OrderDate, C.CompanyName, E.FirstName, E.LastName
ORDER BY O.OrderDate DESC
OPTION (OPTIMIZE FOR (@pMAIN_2507192011455678422 UNKNOWN, @pMAIN_2507192011455678423 UNKNOWN, @pMAIN_2507192011455678424 UNKNOWN));


            
        

Parameters (If used)

Name Value
@pMAIN_2507192011455678420
@pMAIN_2507192011455678421 1
@pMAIN_2507192011455678422 SAVEA
@pMAIN_2507192011455678423 1996-01-01
@pMAIN_2507192011455678424 1997-12-31

Query Results 4:

  OrderID OrderDate CompanyName EmployeeName OrderTotalValue
1 10757 11/27/1997 12:00:00 AM Save-a-lot Markets Michael Suyama 3082
2 10748 11/20/1997 12:00:00 AM Save-a-lot Markets Janet Leverling 2196
3 10722 10/29/1997 12:00:00 AM Save-a-lot Markets Laura Callahan 1570
4 10713 10/22/1997 12:00:00 AM Save-a-lot Markets Nancy Davolio 2827.90002441406
5 10714 10/22/1997 12:00:00 AM Save-a-lot Markets Steven Buchanan 2205.75
6 10711 10/21/1997 12:00:00 AM Save-a-lot Markets Steven Buchanan 4451.69998931885
7 10700 10/10/1997 12:00:00 AM Save-a-lot Markets Janet Leverling 1638.40000915527
8 10678 9/23/1997 12:00:00 AM Save-a-lot Markets Robert King 5256.5
9 10657 9/4/1997 12:00:00 AM Save-a-lot Markets Andrew Fuller 4371.60000610352
10 10627 8/11/1997 12:00:00 AM Save-a-lot Markets Laura Callahan 1185.75
11 10612 7/28/1997 12:00:00 AM Save-a-lot Markets Nancy Davolio 6375
12 10607 7/22/1997 12:00:00 AM Save-a-lot Markets Steven Buchanan 6475.39999389648
13 10603 7/18/1997 12:00:00 AM Save-a-lot Markets Laura Callahan 1483
14 10555 6/2/1997 12:00:00 AM Save-a-lot Markets Michael Suyama 2944.40000915527
15 10510 4/18/1997 12:00:00 AM Save-a-lot Markets Michael Suyama 4707.53993225098
16 10452 2/20/1997 12:00:00 AM Save-a-lot Markets Laura Callahan 2018.5
17 10440 2/10/1997 12:00:00 AM Save-a-lot Markets Margaret Peacock 4924.13519287109
18 10398 12/30/1996 12:00:00 AM Save-a-lot Markets Andrew Fuller 2505.59985351562
19 10393 12/25/1996 12:00:00 AM Save-a-lot Markets Nancy Davolio 2556.95002746582
20 10324 10/8/1996 12:00:00 AM Save-a-lot Markets Anne Dodsworth 5275.71510314941