Tôi có một bảng, CustPassMaster
với 16 cột trong đó, một trong số đó CustNum varchar(8)
và tôi đã tạo một chỉ mục IX_dbo_CustPassMaster_CustNum
. Khi tôi chạy SELECT
tuyên bố của mình :
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
Nó bỏ qua chỉ số hoàn toàn. Điều này làm tôi bối rối khi tôi có một bảng khác CustDataMaster
với nhiều cột hơn (55), một trong số đó là CustNum varchar(8)
. Tôi đã tạo một chỉ mục trên cột này ( IX_dbo_CustDataMaster_CustNum
) trong bảng này và thực tế sử dụng cùng một truy vấn:
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
Và nó sử dụng chỉ mục tôi tạo ra.
Có bất kỳ lý do cụ thể đằng sau này? Tại sao nó sẽ sử dụng chỉ mục từ CustDataMaster
, nhưng không phải là từ CustPassMaster
? Có phải do số lượng cột thấp?
Truy vấn đầu tiên trả về 66 hàng. Đối với hàng thứ hai, 1 hàng được trả lại.
Ngoài ra, lưu ý bổ sung: CustPassMaster
có 4991 hồ sơ và CustDataMaster
có 5376 hồ sơ. Đây có thể là lý do đằng sau bỏ qua các chỉ số? CustPassMaster
cũng có bản ghi trùng lặp có cùng CustNum
giá trị. Đây có phải là một yếu tố khác?
Tôi đang dựa trên yêu cầu này về kết quả kế hoạch thực hiện thực tế của cả hai truy vấn.
Đây là DDL cho CustPassMaster
(cái có chỉ số không sử dụng):
CREATE TABLE dbo.CustPassMaster(
[CustNum] [varchar](8) NOT NULL,
[Username] [char](15) NOT NULL,
[Password] [char](15) NOT NULL,
/* more columns here */
[VBTerminator] [varchar](1) NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_CustPassMaster_CustNum] ON dbo.CustPassMaster
(
[CustNum] ASC
) WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Và DDL cho CustDataMaster
(Tôi đã bỏ qua rất nhiều lĩnh vực không liên quan):
CREATE TABLE dbo.CustDataMaster(
[CustNum] [varchar](8) NOT NULL,
/* more columns here */
[VBTerminator] [varchar](1) NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_CustDataMaster_CustNum] ON dbo.CustDataMaster
(
[CustNum] ASC
)WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Tôi không có một chỉ mục được nhóm trên một trong các bảng đó, chỉ có một chỉ mục không bao gồm.
Bỏ qua thực tế là các kiểu dữ liệu không hoàn toàn khớp với loại dữ liệu được lưu trữ. Các trường này là một bản sao lưu từ cơ sở dữ liệu IBM AS / 400 và đây là các kiểu dữ liệu tương thích cho nó. (Tôi phải có thể truy vấn cơ sở dữ liệu sao lưu này với cùng một truy vấn và nhận được kết quả chính xác như nhau .)
Dữ liệu này chỉ được sử dụng cho các SELECT
báo cáo. Tôi không thực hiện bất kỳ INSERT
/ UPDATE
/ DELETE
tuyên bố nào về nó, ngoại trừ khi ứng dụng sao lưu đang sao chép dữ liệu từ AS / 400.