Menjatuhkan Indeks Hipotetis


8

Di masa lalu saya pikir saya telah menghapus indeks hipotetis menggunakan pernyataan DROP INDEX untuk indeks cluster dan pernyataan STATISTIK DROP untuk indeks non-cluster.

Saya memiliki database yang penuh dengan sisa-sisa DTA yang ingin saya bersihkan; Namun, ketika saya mencoba untuk menjatuhkan objek, saya selalu menerima pesan kesalahan yang mengatakan bahwa saya tidak dapat menjatuhkan objek "karena tidak ada atau Anda tidak memiliki izin". Saya sysadmin penuh di server jadi saya berharap memiliki hak untuk melakukan apa pun.

Saya sudah mencoba ini dengan kedua pernyataan DROP STATS dan DROP INDEX tetapi keduanya memberi saya kesalahan yang sama.

Adakah yang menghapus ini sebelumnya dan adakah tipuan yang saya lewatkan?


Tambahan

Menyodok dalam hal ini, saya hanya melihat bahwa jika saya R-Klik pada objek, baik opsi 'Script As' dan 'DELETE' diklik.


Bagaimana dengan tangkapan layar seperti apa hipotesisnya?
Jason Cumberland

Hai Jason. Jalankan SELECT * FROM sys.indexes WHERE is_hypothetical = 1
PseudoToad

DROP INDEX memerlukan izin ALTER di atas meja. Bisakah Anda mengeluarkan pernyataan ALTER TABLE jinak untuk menguji izin Anda? (Saya tahu. Saya tahu. Anda seorang sysadmin. Tetap melakukannya.)
Mike Sherrill 'Cat Recall'

1
Saya berasumsi Anda melihat indeks ini di SSMS benar? Jika demikian, coba segarkan koneksi Anda dan lihat apakah indeksnya masih ada. Mereka mungkin sudah dihapus. Juga DROP INDEXadalah sintaks yang benar untuk kedua indeks berkerumun dan tidak berkerumun. DROP STATISTICSkhusus untuk statistik yang berbeda.
Kenneth Fisher

Ya ... Saya di SSMS dan saya sudah mencoba semua hal di atas beberapa kali. CheckDB bersih. Saya bahkan mencoba melakukannya melalui o-SQL dan SQLCMD berharap bahwa menggunakan tumpukan koneksi yang berbeda akan membebaskannya. Saya melempar handuk dan hidup dengannya. Pada titik tertentu saya akan menjatuhkan dan membuat ulang tabel. Itu pasti akan memperbaikinya!
PseudoToad

Jawaban:


5

Indeks hipotetis yang dibuat oleh Index Tuning Wizard dimulai dengan nama "hind_%" dan seharusnya tidak ada setelah penyetelan selesai; mereka semua harus dihapus. Anda bisa menjalankan skrip berikut dari SQL Server Query Analyzer untuk menghapus indeks apa pun yang mungkin ada. Anda harus masuk dengan menggunakan akun yang memiliki izin sysadmin atau db_owner, atau pemilik objek tempat statistik ini dibuat.

Sebagai contoh

DECLARE @strSQL nvarchar (1024) 
DECLARE @objid int 
DECLARE @intid tinyint 
DECLARE ITW_Stats CURSOR UNTUK SELECT id, indid FROM sysindexes WHERE name LIKE 'hind_%' ORDER BY name 
BUKA ITW_Stats 
FETCH BERIKUTNYA DARI ITW_Stats KE @objid, @indid 
WHILE (@@ FETCH_STATUS -1) 
MULAI 
SELECT @strSQL = (SELECT case ketika INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 lalu 'drop statistik [' lain 'indeks penurunan [' akhir + OBJECT_NAME (i.id) + ']. [' + i.name + ']' 
DARI sysindexes saya gabung sysobjects o di i.id = o.id 
WHERE i.id = @objid dan i.indid = @indid DAN 
(INDEXPROPERTY (i.id, i.name, 'IsHypothetical') = 1 ATAU
(INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 DAN 
INDEXPROPERTY (i.id, i.name, 'IsAutoStatistics') = 0))) 
EXEC (@strSQL) 
FETCH BERIKUTNYA DARI ITW_Stats KE @objid, @indid
AKHIR
TUTUP ITW_Stats 
DEALLOCATE ITW_Stats

Skrip di atas disediakan oleh Microsoft untuk perincian lebih lanjut Anda dapat mengunjungi tautan berikut. http://support.microsoft.com/kb/q293177


Hai Sam. Sayangnya ini membawa saya kembali ke awal. Script menunjukkan indeks hipotetis dan memberi saya pernyataan drop yang benar yang telah saya gunakan selama ini. Masalahnya adalah bahwa pernyataan drop tidak berfungsi. Saya berkeyakinan bahwa ini adalah bug di mesin dan sudah cukup banyak menyerah. Pada titik tertentu, saya akan mengambil tabel dari produksi kemudian drop / buat ulang semuanya dari awal. Saya tahu itu akan memperbaikinya!
PseudoToad

2

Buku daring mencakup beberapa alasan Anda mungkin tidak dapat menjatuhkan indeks.

  • Indeks dikaitkan dengan batasan kunci primer.
  • Filegroup sedang offline atau hanya baca.
  • "Anda tidak dapat menjatuhkan indeks kluster online jika indeks dinonaktifkan pada tampilan, atau berisi teks, nteks, gambar, varchar (maks), nvarchar (maks), varbinary (maks), atau kolom xml di baris data level daun . "
  • Anda tidak memiliki izin yang tepat: "Untuk menjalankan DROP INDEX, minimal, izin ALTER pada tabel atau tampilan diperlukan. Izin ini diberikan secara default ke peran server tetap sysadmin dan peran basis data tetap db_ddladmin dan db_owner. "

Mungkin ada alasan lain juga.


Terima kasih Mike. Semua ini hipotetis sehingga tidak akan jatuh ke dalam salah satu kategori ini. Selain ini, ini semua indeks hipotetis non-cluster yang diperlakukan sebagai statistik untuk menjatuhkan. Akhirnya mereka bukan "indeks nyata".
PseudoToad

Apakah Anda pikir berlari diperlukan dbcc checktable?
Mike Sherrill 'Cat Recall'

Pemeriksa penuh bersih
PseudoToad

1

Ini sedikit simplistis, tetapi jika Anda selesai dengan saran DTA, coba hapus sesi tuning dari server itu melalui antarmuka DTA.


Baru saja mencoba ini - buka DTA, sambungkan ke server, hapus semua sesi sebelumnya. masih memiliki indeks dta dan statistik dalam database.
Razvan Zoitanu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.