Query για Indexes σε Foreign Keys
Σε πολλές (αν όχι σε όλες) τις περιπτώσεις είναι απαραίτητο να έχουμε secondary indexes σε columns που κάνουν reference σε ξένα κλειδιά. Αν για παράδειγμα έχουμε δύο πίνακες (Employees και Departments) και ο πίνακας Employees έχει ένα Foreign Key constraint στο DepartmentID (δηλαδή η κάθε εγγραφή του πίνακα Employees έχει ένα reference στο ID του department που ανήκει), τότε κατά πάσα πιθανότητα θα υπάρχουν queries στα οποία οι δύο αυτοί πίνακες κάνουν JOIN (πιθανότατα INNER JOIN) στο πεδίο αυτό.
Θα ήταν λοιπόν καλό (για να μην πώ απαραίτητο) να έχουμε μια λίστα με τα ξένα κλειδιά που ΔΕΝ ΕΙΝΑΙ INDEXED.
Τρέξτε αυτό το query (μόνο σε SQL 2005) και θα πάρετε αυτή τη λίστα...
-- Check that ALL FK columns are indeed indexed in the child table
select ' FK without Index : Create Secondary index on table ' + o.name + ' for column ' + c.name as IndexesNeeded,
fc.referenced_object_id, fc.referenced_column_id, f.name, f.type, f.type_desc, f.parent_object_id, fc.parent_column_id
from sys.foreign_keys as f, sys.foreign_key_columns as fc, sys.objects as o, sys.columns as c
where c.object_id = o.object_id and c.column_id = fc.parent_column_id and o.object_id = fc.parent_object_id and
fc.constraint_object_id = f.object_id and fc.parent_object_id = f.parent_object_id
and
(
Select count(*) --Parent_object_id, Parent_column_id
from sys.foreign_key_columns fkc,
sys.index_columns ic
where fc.parent_object_id = fkc.Parent_object_id and
fkc.Parent_object_id = ic.object_id and
fkc.Parent_column_id = ic.column_id and
fkc.Parent_column_id = fc.parent_column_id ) = 0
Order by o.Name