Queries for FORCESEEK Table Hint


1. ForceSeek Indexes (Appropraite Indexes are required)

SQL Server Query 1

            
 SELECT  
O.OrderID,
O.OrderDate,
O.Freight,
O.CustomerID
FROM Orders AS O WITH (FORCESEEK)
WHERE O.CustomerID = 'VINET'
AND O.OrderDate BETWEEN '1996-07-01' AND '1996-07-31'
ORDER BY O.OrderDate;

Create SQL query with SqlQueryBuilder 1

            
 var (sql1, parameters1) = new SqlQueryBuilder()  
.Select()
.Columns("O.OrderID","O.OrderDate","O.Freight","O.CustomerID")
.From("Orders", "O", new List<IHint>() { new FORCESEEK() })
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Customers","C")
.On(new Column("O.CustomerID").Equale(new Column("C.CustomerID")))
})
.Where(new Where(new Column("O.CustomerID").Equale("VINET"))
.AND(new BETWEEN(new Column("O.OrderDate"), "1996-07-01", "1996-07-31")))
.Build();

Query build by SqlQueryBuilder 1

            
SELECT O.OrderID,
       O.OrderDate,
       O.Freight,
       O.CustomerID
FROM Orders AS O WITH (FORCESEEK)
     INNER JOIN
     Customers AS C
     ON O.CustomerID = C.CustomerID
WHERE O.CustomerID = @pMAIN_2507192011455102070
      AND O.OrderDate BETWEEN @pMAIN_2507192011455102071 AND @pMAIN_2507192011455102072;


            
        

Parameters (If used)

Name Value
@pMAIN_2507192011455102070 VINET
@pMAIN_2507192011455102071 1996-07-01
@pMAIN_2507192011455102072 1996-07-31

Query Results 1:

  OrderID OrderDate Freight CustomerID
1 10248 7/4/1996 12:00:00 AM 32.3800 VINET


2. Forcing a FORCESEEK on a Composite Predicate (Appropraite Indexes are required)

SQL Server Query 2

            
 SELECT  
O.OrderID,
O.OrderDate,
O.Freight,
O.CustomerID
FROM Orders AS O WITH (FORCESEEK (CustomerID (CustomerID))) -- Force a seek on the CustomerID index, using the CustomerID column
WHERE O.CustomerID = 'VINET'
AND O.OrderDate BETWEEN '1996-07-01' AND '1996-07-31'
ORDER BY O.OrderDate;

Create SQL query with SqlQueryBuilder 2

            
 var (sql2, parameters2) = new SqlQueryBuilder()  
.Select()
.Columns("O.OrderID","O.OrderDate","O.Freight","O.CustomerID")
.From("Orders", "O", new List<IHint>() { new FORCESEEK("CustomerID").SetValues("CustomerID") })
.Join(new List<IJoin>()
{
new INNERJOIN().TableName("Customers","C")
.On(new Column("O.CustomerID").Equale(new Column("C.CustomerID")))
})
.Where(new Where(new Column("O.CustomerID").Equale("VINET"))
.AND(new BETWEEN(new Column("O.OrderDate"), "1996-07-01", "1996-07-31")))
.Build();

Query build by SqlQueryBuilder 2

            
SELECT O.OrderID,
       O.OrderDate,
       O.Freight,
       O.CustomerID
FROM Orders AS O WITH (FORCESEEK (CustomerID (CustomerID)))
     INNER JOIN
     Customers AS C
     ON O.CustomerID = C.CustomerID
WHERE O.CustomerID = @pMAIN_2507192011455233690
      AND O.OrderDate BETWEEN @pMAIN_2507192011455233691 AND @pMAIN_2507192011455233692;


            
        

Parameters (If used)

Name Value
@pMAIN_2507192011455233690 VINET
@pMAIN_2507192011455233691 1996-07-01
@pMAIN_2507192011455233692 1996-07-31

Query Results 2:

  OrderID OrderDate Freight CustomerID
1 10248 7/4/1996 12:00:00 AM 32.3800 VINET


3. FORCESEEK in a Subquery for Efficient Lookup (Appropraite Indexes are required)

SQL Server Query 3

            
 SELECT  
E.FirstName + ' ' + E.LastName AS EmployeeName,
E.EmployeeID
FROM Employees AS E
WHERE E.EmployeeID IN (
SELECT O.EmployeeID
FROM Orders AS O WITH (FORCESEEK (CustomerID (CustomerID))) -- Force seek on CustomerID index in subquery
WHERE O.CustomerID IN (SELECT CustomerID from Customers)
GROUP BY O.EmployeeID
HAVING SUM(O.Freight) > 500
)
ORDER BY EmployeeName;

Create SQL query with SqlQueryBuilder 3

            
 var (sql3, parameters3) = new SqlQueryBuilder()  
.Select()
.Column(new CONCAT(new Column("E.FirstName"), " ", new Column("E.LastName")), "EmployeeName")
.Column("E.EmployeeID")
.From("Employees","E")
.Where(new Where(new IN(new Column("E.EmployeeID"), new SqlQueryBuilder().Select()
.Column("O.EmployeeID")
.From("Orders","O", new List<IHint>() {new FORCESEEK("CustomerID").SetValues("CustomerID") })
.Where(new Where(new IN(new Column("O.CustomerID"), new SqlQueryBuilder().Select()
.Column("CustomerID").From("Customers")
)))
.GroupBy(new GroupBy("O.EmployeeID"))
.Having(new Having(new SUM(new Column("O.Freight")).GreaterThan(500)))
)))
.OrderBy(new OrderBy().SetColumnAscending("EmployeeName"))
.Build();

Query build by SqlQueryBuilder 3

            
SELECT CONCAT(E.FirstName, @pMAIN_2507192011455290360, E.LastName) AS EmployeeName,
       E.EmployeeID
FROM Employees AS E
WHERE E.EmployeeID IN ((SELECT O.EmployeeID
                        FROM Orders AS O WITH (FORCESEEK (CustomerID (CustomerID)))
                        WHERE O.CustomerID IN ((SELECT CustomerID
                                                FROM Customers))
                        GROUP BY O.EmployeeID
                        HAVING SUM(O.Freight) > @pMAIN_2507192011455290361))
ORDER BY EmployeeName ASC;


            
        

Parameters (If used)

Name Value
@pMAIN_2507192011455290360
@pMAIN_2507192011455290361 500

Query Results 3:

  EmployeeName EmployeeID
1 Andrew Fuller 2
2 Anne Dodsworth 9
3 Janet Leverling 3
4 Laura Callahan 8
5 Margaret Peacock 4
6 Michael Suyama 6
7 Nancy Davolio 1
8 Robert King 7
9 Steven Buchanan 5


4. FORCESEEK for Range Scans with a Composite Index (Implicit Seek) (Appropraite Indexes are required)

SQL Server Query 4

            
 SELECT  
OD.OrderID,
OD.ProductID,
OD.Quantity,
OD.UnitPrice
FROM [Order Details] AS OD WITH (FORCESEEK (PK_Order_Details (OrderID, ProductID))) -- Force seek on composite PK
WHERE OD.OrderID = 10248
AND OD.ProductID BETWEEN 1 AND 200
ORDER BY OD.ProductID;

Create SQL query with SqlQueryBuilder 4

            
 var (sql4, parameters4) = new SqlQueryBuilder()  
.Select()
.Columns("OD.OrderID", "OD.ProductID", "OD.Quantity", "OD.UnitPrice")
.From("[Order Details]", "OD", new List<IHint>() { new FORCESEEK("PK_Order_Details").SetValues("OrderID", "ProductID") })
.Where(new Where(new Column("OD.OrderID").Equale(10248))
.AND(new BETWEEN(new Column("OD.ProductID"), 1, 200)))
.OrderBy(new OrderBy().SetColumnAscending("OD.ProductID"))
.Build();

Query build by SqlQueryBuilder 4

            
SELECT OD.OrderID,
       OD.ProductID,
       OD.Quantity,
       OD.UnitPrice
FROM [Order Details] AS OD WITH (FORCESEEK (PK_Order_Details (OrderID, ProductID)))
WHERE OD.OrderID = @pMAIN_2507192011455471880
      AND OD.ProductID BETWEEN @pMAIN_2507192011455471881 AND @pMAIN_2507192011455471882
ORDER BY OD.ProductID ASC;


            
        

Parameters (If used)

Name Value
@pMAIN_2507192011455471880 10248
@pMAIN_2507192011455471881 1
@pMAIN_2507192011455471882 200

Query Results 4:

  OrderID ProductID Quantity UnitPrice
1 10248 11 12 14.0000
2 10248 42 10 9.8000
3 10248 72 5 34.8000