Bỏ chỉ số giả thuyết


8

Trước đây, tôi nghĩ rằng tôi đã xóa các chỉ mục giả thuyết bằng cách sử dụng câu lệnh DROP INDEX cho các chỉ mục được nhóm và câu lệnh DROP STATISTICS cho các chỉ mục không được nhóm.

Tôi có một cơ sở dữ liệu chứa đầy tàn dư DTA mà tôi muốn dọn dẹp; tuy nhiên, khi tôi cố gắng thả đối tượng, tôi luôn nhận được một lỗi cho tôi biết rằng tôi không thể làm rơi đối tượng "vì nó không tồn tại hoặc bạn không có quyền". Tôi là một sysadmin đầy đủ trên máy chủ vì vậy sẽ có quyền làm bất cứ điều gì.

Tôi đã thử điều này với cả hai câu lệnh DROP STATS và DROP INDEX nhưng cả hai đều cho tôi cùng một lỗi.

Có ai đã xóa những cái này trước đây và có một mẹo tôi đang thiếu không?


Phụ lục

Trêu chọc trong này, tôi chỉ nhận thấy rằng nếu tôi nhấp chuột vào đối tượng, cả hai tùy chọn 'Script As' và 'DELETE' đều bị mờ đi.


Làm thế nào về một ảnh chụp màn hình của một giả thuyết trông như thế nào?
Jason Cumberland

Chào Jason. Chạy CHỌN * TỪ sys.indexes WHERE is_hypothory = 1
PseudoToad

DROP INDEX yêu cầu sự cho phép ALTER trên bàn. Bạn có thể đưa ra câu lệnh ALTER TABLE lành tính để kiểm tra quyền của mình không? (Tôi biết. Tôi biết. Bạn là một sysadmin. Dù sao đi nữa.)
Mike Sherrill 'Cat Recall'

1
Tôi cho rằng bạn đang thấy các chỉ mục này trong SSMS chính xác? Nếu vậy hãy thử làm mới kết nối của bạn và xem các chỉ mục có còn ở đó không. Họ có thể đã bị xóa. Ngoài ra, DROP INDEXcú pháp đúng cho cả hai chỉ mục được phân cụm và không phân cụm. DROP STATISTICSđặc biệt cho các số liệu thống kê khác nhau.
Kenneth Fisher

Phải ... Tôi đang ở SSMS và tôi đã thử tất cả các lần trên. CheckDB sạch sẽ. Tôi thậm chí đã thử thực hiện nó thông qua o-SQL và SQLCMD với hy vọng rằng việc sử dụng ngăn xếp kết nối khác sẽ phá vỡ nó miễn phí. Tôi đang ném vào khăn và sống với nó. Tại một số điểm tôi sẽ thả và tạo lại các bảng. Điều đó chắc chắn sẽ sửa chữa nó!
PseudoToad

Câu trả lời:


5

Các chỉ mục giả thuyết được tạo bởi Trình hướng dẫn điều chỉnh chỉ mục bắt đầu bằng tên "hind_%" và không tồn tại sau khi điều chỉnh kết thúc; tất cả chúng nên được loại bỏ. Bạn có thể chạy tập lệnh sau từ Trình phân tích truy vấn SQL Server để xóa mọi chỉ mục như vậy có thể tồn tại. Bạn phải đăng nhập bằng cách sử dụng tài khoản có quyền sysadmin hoặc db_owner hoặc là chủ sở hữu của đối tượng mà các thống kê này được tạo.

Ví dụ

KHAI THÁC @strSQL nvarchar (1024) 
KHAI THÁC @objid int 
KHAI THÁC @indid tinyint 
KHAI THÁC ITW_Stats HIỆN TẠI CHO id CHỌN, trong khi TỪ sysindexes Tên ở đâu THÍCH 'hind_%' ĐẶT HÀNG theo tên 
MỞ ITW_Stats 
FETCH TIẾP THEO TỪ ITW_Stats VÀO @objid, @indid 
WHILE (@@ FETCH_STATUS -1) 
BẮT ĐẦU 
Chọn + i.name + ']' 
TỪ sysindexes tôi tham gia sysobjects o trên i.id = o.id 
Ở đâu i.id = @objid và i.indid = @indid VÀ 
(INDEXPROPERTY (i.id, i.name, 'IsHypothory') = 1 HOẶC
(INDEXPROPERTY (i.id, i.name, 'IsStatistic') = 1 VÀ 
INDEXPROPERTY (i.id, i.name, 'IsAutoStatistic') = 0))) 
EXEC (@strQuery) 
FETCH TIẾP THEO TỪ ITW_Stats VÀO @objid, @indid
KẾT THÚC
ĐÓNG ITW_Stats 
DEALLOCATE ITW_Stats

Kịch bản trên được Microsoft cung cấp để biết thêm chi tiết, bạn có thể truy cập liên kết sau. http://support.microsoft.com/kb/q293177


Chào Sam. Thật không may điều này đưa tôi trở lại bắt đầu. Kịch bản cho tôi thấy các chỉ mục giả thuyết và đưa cho tôi tuyên bố thả chính xác mà tôi đã sử dụng tất cả cùng. Vấn đề là câu lệnh drop đơn giản là không hoạt động. Tôi tin rằng đây là một lỗi trong động cơ và đã từ bỏ nó khá nhiều. Tại một số điểm, tôi sẽ đưa các bảng ra khỏi sản xuất sau đó thả / tạo lại mọi thứ từ đầu. Tôi biết rằng sẽ sửa chữa nó!
PseudoToad

2

Sách trực tuyến bao gồm một số lý do bạn có thể không thể bỏ chỉ mục.

  • Chỉ mục được liên kết với một ràng buộc khóa chính.
  • Filegroup là ngoại tuyến hoặc chỉ đọc.
  • "Bạn không thể thả chỉ mục được phân cụm trực tuyến nếu chỉ mục bị vô hiệu hóa trên chế độ xem hoặc chứa văn bản, ntext, hình ảnh, varchar (max), nvarchar (max), varbinary (max) hoặc xml trong các hàng dữ liệu ở cấp độ lá . "
  • Bạn không có quyền: "Để thực thi DROP INDEX, tối thiểu, phải có quyền ALTER trên bảng hoặc chế độ xem. Quyền này được cấp theo mặc định cho vai trò máy chủ cố định sysadmin và vai trò cơ sở dữ liệu cố định db_ddladmin và db_owner. "

Có thể có những lý do khác nữa.


Cảm ơn Mike. Tất cả những điều này là giả thuyết vì vậy sẽ không rơi vào bất kỳ loại nào trong số này. Ngoài ra, đây là tất cả các chỉ số giả thuyết không được nhóm lại được coi là một số liệu thống kê để giảm. Cuối cùng, họ không phải là "chỉ số thực".
PseudoToad

Bạn có nghĩ rằng chạy dbcc checktableđược gọi là cho?
Mike Sherrill 'Nhớ lại mèo'

Trình kiểm tra đầy đủ sạch sẽ
PseudoToad

1

Điều này hơi đơn giản, nhưng nếu bạn đã kết thúc với các đề xuất DTA, hãy thử xóa các phiên điều chỉnh khỏi máy chủ đó thông qua giao diện DTA.


Chỉ cần thử điều này - mở DTA, kết nối với máy chủ, xóa tất cả các phiên trước đó. vẫn có chỉ số dta và số liệu thống kê trong cơ sở dữ liệu.
Razvan Zoitanu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.