2017-01-30 4 views
0

Ich habe 2 Tabellen:Bessere Indizes für die Abfragen

oders(order_id, customer_id, order_date, product_id, order_quantity)

Kunden(customer_id, last_name, first_name, favorite_website)

Auch ich habe eine Anwendung, die häufigen Fragen in den Tabellen mit den folgenden Befehlen macht:

SELECT * FROM orders where customer_id = @id 

    SELECT * FROM orders where customer_id = @id and order_date > @date 

    SELECT * FROM orders where order_date > @date1 and order_date < @date2 

    SELECT first_name, last_name, favorite_website FROM customers where last_name = @last_name 

    SELECT customer_id, first_name, last_name,favorite_website 
FROM customers where last_name = @last_name and favorite_website = @site 

Ich möchte einige Indizes zu diesen Tabellen finden, deren Erstellung die Umsetzung der obigen Fragen beschleunigen würde.

Die einzigen Indizes gefunden sind:

1.`create index indexorders on orders (order_id, customer_id, order_date, product_id, order_quantity);` 

2.`create index indexcust on customers (customer_id, last_name, first_name, favorite_website);` 

Sind alle anderen Indizes, die als diese besser sind? Können Sie mir etwas vorschlagen?

+1

Wollen Sie wirklich '*' in 'select' für alle Abfragen? Da der Index auch auf der Grundlage der Auswahl von Ionensäulen optimiert werden kann, ist –

+0

das Platzieren der Spalte order_id in einem beliebigen Index unbrauchbar, da Ihr Beispiel-Workload niemals danach sucht. Da Sie BETWEEN und> und

Antwort

0

Auf Befehl Tisch ..

erstellen Primärschlüssel (customerid,orderdate) (falls eindeutig) auf Auftragstabelle oder unter Kombination verwenden. Dieser Index in der Frage

vorgesehen nur für die Kombinationen von Abfragen arbeiten
create index nci_custid_ordt on dbo.orders 
(
customerid, 
orderdate) 
include 
(
order_id, product_id, order_quantity) 

für Kunden Tabelle

einen nicht gruppierten Index unter Kombination mit create

create index nci_lstname_fw on dbo.customers 
(
last_name,favorite_website) 
include 
(customer_id, first_name) 

Sie customerid erstellen können als Primärschlüssel und Bestell-ID als Primärschlüssel in ihren jeweiligen Tabellen, aber ich sehe keinen Vorteil, wenn Sie sie nicht in Ihren Abfragen verwenden ..

+0

Ich schlage vor, die Spalten sind Bestelldatum, customerid, da gibt es zwei Bereich Abfragen auf orderdate –

+0

@ Nick.McDermaid: das wird ein Residuum auf customerid, der Index ich schlug nicht – TheGameiswar

+0

hmmmm Ich denke, vielleicht bin ich aus meinem Tiefe, aber warum sollte ein Residuum erforderlich sein, wenn es sich um einen Deckungsindex handelt? Spalten in jeder Reihenfolge erfüllen zwei der ersten drei Abfragen, außer dass das führende Bestelldatum sich für Bereichsabfragen eignet. –

Verwandte Themen