PDA

View Full Version : سوال: Index



MaryamMarz
چهارشنبه 28 بهمن 1388, 15:18 عصر
سلام دوستان
من یک View دارم و در صورتی که بدون شرط Where اجرا شود 3 ثانیه طول می کشد که Result set برگرداند و اگر Where داشته باشد این زمان 50 ثانیه می شود. خودم فکر می کنم که Index های table هام به هم ریخته شده است. چطور می شود Index ها را regenerate کرد؟

مشکل همون Index بود. حالا می خواهم یه script بنویسم که تمام Index ها را Rebuild کند. کسی دستورش رو بلده؟
قبلا از راهنمایی تون تشکر می کنم.

saied_genius
چهارشنبه 28 بهمن 1388, 16:44 عصر
اين script رو يه تست بزن.

من تستش نکردم.


DECLARE @Database VARCHAR(255)
DECLARE @Table VARCHAR(255)
DECLARE @cmd NVARCHAR(500)
DECLARE @fillfactor INT

SET @fillfactor = 90

DECLARE DatabaseCursor CURSOR FOR
SELECT name FROM master.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb','distrbution')
ORDER BY 1

OPEN DatabaseCursor

FETCH NEXT FROM DatabaseCursor INTO @Database
WHILE @@FETCH_STATUS = 0
BEGIN

SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT table_catalog + ''.'' + table_schema + ''.'' + table_name as tableName
FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE'''

-- create table cursor
EXEC (@cmd)
OPEN TableCursor

FETCH NEXT FROM TableCursor INTO @Table
WHILE @@FETCH_STATUS = 0
BEGIN

-- SQL 2000 command
--DBCC DBREINDEX(@Table,' ',@fillfactor)

-- SQL 2005 command
SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
EXEC (@cmd)

FETCH NEXT FROM TableCursor INTO @Table
END

CLOSE TableCursor
DEALLOCATE TableCursor

FETCH NEXT FROM DatabaseCursor INTO @Database
END
CLOSE DatabaseCursor
DEALLOCATE DatabaseCursor

اگر sql server 2000 است اين خط کد را از comment در بيار.

DBCC DBREINDEX(@Table,' ',@fillfactor)

موفق باشيد.