自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server如何找出數(shù)據(jù)庫中沒有索引的表

數(shù)據(jù)庫 MySQL
在SQL Server數(shù)據(jù)庫的維護中,我們經(jīng)常需要巡檢,找出一些沒有索引的表,然后根據(jù)實際情況判斷是否需要增加索引。

 [[398124]]

本文轉(zhuǎn)載自微信公眾號「DBA閑思雜想錄」,作者瀟湘隱者。轉(zhuǎn)載本文請聯(lián)系DBA閑思雜想錄公眾號。

在SQL Server數(shù)據(jù)庫的維護中,我們經(jīng)常需要巡檢,找出一些沒有索引的表,然后根據(jù)實際情況判斷是否需要增加索引。下面分享一個腳本,如何找出當前數(shù)據(jù)庫中沒有索引的表信息。

  1. /************************************************************************************************************** 
  2.     --腳本名稱  :      find_without_index_tables.sql 
  3.     --腳本作者  :       瀟湘隱者 
  4.     --創(chuàng)建日期  :       2016‎-10‎-‎27‎ 
  5. *************************************************************************************************************** 
  6.     腳本功能    :      查找數(shù)據(jù)庫中沒有任何索引的表,并計算表的行數(shù),用作是否創(chuàng)建索引的一個依據(jù) 
  7. *************************************************************************************************************** 
  8.     注意事項    :       需要切換到具體的用戶數(shù)據(jù)庫后執(zhí)行腳本 
  9. *************************************************************************************************************** 
  10.     參考資料    :        
  11. *************************************************************************************************************** 
  12.     更新記錄    :      2016‎-10‎-‎27‎:創(chuàng)建此腳本 
  13.                       2020-03-14: 修改腳本,新增SERVER_NAME,DB_NAME 
  14. ***************************************************************************************************************/ 
  15. SELECT DISTINCT 
  16.         @@SERVERNAME              AS [SERVER_NAME] 
  17.        ,DB_NAME()                 AS [DB_NAME] 
  18.        ,so.object_id              AS [OBJECT_ID]  
  19.        ,SCHEMA_NAME(so.schema_id) +'.' +OBJECT_NAME(so.object_id)  
  20.                                   AS [TABLE_NAME]  
  21.        ,MAX(dmv.rows)             AS [APPROXIMATE_ROWS]  
  22.        ,MAX(d.ColumnCount)        AS [COLUMN_COUNT] 
  23. FROM    sys.objects so ( NOLOCK ) 
  24.         JOIN sys.indexes si ( NOLOCK ) ON so.object_id = si.object_id 
  25.                                           AND so.type IN ( N'U', N'V' ) 
  26.         JOIN sysindexes dmv ( NOLOCK ) ON so.object_id = dmv.id 
  27.                                           AND si.index_id = dmv.indid 
  28.         FULL OUTER JOIN ( SELECT    object_id , 
  29.                                     COUNT(1) AS ColumnCount 
  30.                           FROM      sys.columns (NOLOCK) 
  31.                           GROUP BY  object_id 
  32.                         ) d ON d.object_id = so.object_id 
  33. WHERE   so.is_ms_shipped = 0 
  34.         AND so.object_id NOT IN ( 
  35.         SELECT  major_id 
  36.         FROM    sys.extended_properties (NOLOCK) 
  37.         WHERE   name = N'microsoft_database_tools_support' ) 
  38.         AND INDEXPROPERTY(so.object_id, si.name'IsStatistics') = 0 
  39. GROUP BY so.schema_id , 
  40.         so.object_id 
  41. HAVING  ( CASE OBJECTPROPERTY(MAX(so.object_id), 'TableHasClustIndex'
  42.             WHEN 0 THEN COUNT(si.index_id) - 1 
  43.             ELSE COUNT(si.index_id) 
  44.           END = 0 ) 
  45. ORDER BY [APPROXIMATE_ROWS] DESC

上面腳本只能查詢當前數(shù)據(jù)庫中沒有索引的表,我們知道,生產(chǎn)環(huán)境中,一個實例下面往往有多個用戶數(shù)據(jù)庫,我們需要采集每個數(shù)據(jù)庫中沒有索引的表信息,那么上面腳本明顯有點硬傷,所以,重寫了這個腳本。

  1. /************************************************************************************************************** 
  2.     --腳本名稱  :      find_without_index_tables.sql 
  3.     --腳本作者  :       瀟湘隱者 
  4.     --創(chuàng)建日期  :       2016‎-10‎-‎27‎ 
  5. *************************************************************************************************************** 
  6.     腳本功能    :      批量查找實例下面的每個數(shù)據(jù)庫,找出沒有任何索引的表 
  7. *************************************************************************************************************** 
  8.     注意事項    :       暫無 
  9. *************************************************************************************************************** 
  10.     參考資料    :        
  11. *************************************************************************************************************** 
  12.     更新記錄    :      2016‎-10‎-‎27‎:創(chuàng)建此腳本 
  13.                       2020-03-14: 修改腳本,新增SERVER_NAME,DB_NAME 
  14. ***************************************************************************************************************/ 
  15.  
  16.  
  17. IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID('tempdb.dbo.#Database')) 
  18. BEGIN 
  19.     DROP TABLE #Database
  20. END 
  21.  
  22. CREATE TABLE #Database (database_id INT  ,database_name NVARCHAR(128) ); 
  23.  
  24.  INSERT INTO #Database 
  25.  SELECT database_id, name FROM sys.databases WHERE state_desc='ONLINE'  
  26.  AND name NOT IN ('master','msdb','tempdb','model''distribution'
  27.  
  28.  
  29. DECLARE @database_name    NVARCHAR(128); 
  30. DECLARE @database_id      INT
  31. DECLARE @cmdText          NVARCHAR(MAX); 
  32.  
  33. SET @database_name =''
  34. SET @database_id =1; 
  35.  
  36. IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID('tempdb.dbo.#TAB_NO_INDEX_INFO')) 
  37. BEGIN 
  38.     DROP TABLE #TAB_NO_INDEX_INFO; 
  39. END 
  40.  
  41. CREATE TABLE #TAB_NO_INDEX_INFO( 
  42.     [SERVER_NAME] [NVARCHAR](32) NULL
  43.     [INSTANCE_NAME] [NVARCHAR](64) NULL
  44.     [DATABASE_NAME] [NVARCHAR](32) NULL
  45.     [TABLE_NAME] [NVARCHAR](128) NULL
  46.     [OBJECT_ID] [INTNULL
  47.     [APPROXIMATE_ROWS] [INTNULL
  48.     [COLUMN_COUNT] [INTNULL 
  49.     ); 
  50.  
  51. WHILE(1=1) 
  52.   
  53. BEGIN 
  54.     SELECT TOP 1 
  55.             @database_id = database_id , 
  56.             @database_name = database_name 
  57.     FROM    #Database 
  58.     WHERE   database_id > @database_id -- next database_name greater than @database_id 
  59.     ORDER BY database_id -- database_id order  
  60.   
  61.      -- exit loop if no more name greater than the last one used 
  62.     If @@rowcount = 0 Break  
  63.  
  64.     SET @cmdText='USE ' + @database_name  +'; 
  65.          --GO 
  66.          INSERT  INTO #TAB_NO_INDEX_INFO 
  67.         ( SERVER_NAME , 
  68.           INSTANCE_NAME , 
  69.           DATABASE_NAME , 
  70.           TABLE_NAME , 
  71.           OBJECT_ID , 
  72.           APPROXIMATE_ROWS , 
  73.           COLUMN_COUNT 
  74.         ) 
  75.         SELECT  DISTINCT 
  76.                CAST(SERVERPROPERTY(''MachineName''AS NVARCHAR(32)) 
  77.                                                     AS [SERVER_NAME]   , 
  78.                 @@SERVICENAME                       AS [INSTANCE_NAME] , 
  79.                 DB_NAME()                           AS [DATABASE_NAME] , 
  80.                 SCHEMA_NAME(so.schema_id)+ ''.'' +   
  81.                 OBJECT_NAME(so.object_id)           AS [TABLE_NAME]    , 
  82.                 so.object_id                        AS [OBJECT_ID]     , 
  83.                 MAX(dmv.rows)                       AS [APPROXIMATE_ROWS] , 
  84.                 MAX(d.ColumnCount)                  AS [COLUMN_COUNT] 
  85.         FROM    sys.objects so ( NOLOCK ) 
  86.                 JOIN sys.indexes si ( NOLOCK ) ON so.object_id = si.object_id 
  87.                                                   AND so.type IN ( N''U'', N''V'' ) 
  88.                 JOIN sysindexes dmv ( NOLOCK ) ON so.object_id = dmv.id 
  89.                                                   AND si.index_id = dmv.indid 
  90.                 FULL OUTER JOIN ( SELECT    object_id , 
  91.                                             COUNT(1) AS ColumnCount 
  92.                                   FROM      sys.columns (NOLOCK) 
  93.                                   GROUP BY  object_id 
  94.                                 ) d ON d.object_id = so.object_id 
  95.         WHERE   so.is_ms_shipped = 0 
  96.                 AND so.object_id NOT IN ( 
  97.                 SELECT  major_id 
  98.                 FROM    sys.extended_properties (NOLOCK) 
  99.                 WHERE   name = N''microsoft_database_tools_support'' ) 
  100.                 AND INDEXPROPERTY(so.object_id, si.name''IsStatistics'') = 0 
  101.         GROUP BY so.schema_id , 
  102.                 so.object_id 
  103.         HAVING  ( CASE OBJECTPROPERTY(MAX(so.object_id), ''TableHasClustIndex''
  104.                     WHEN 0 THEN COUNT(si.index_id) - 1 
  105.                     ELSE COUNT(si.index_id) 
  106.                   END = 0 ) 
  107.         ORDER BY [APPROXIMATE_ROWS] DESC; '  
  108.         PRINT @cmdText; 
  109.  
  110.  
  111.         EXEC ( @cmdText); 
  112.         --EXEC SP_EXECUTESQL @cmdText, N'@database_name NVARCHAR(32)',@database_name 
  113.  
  114.   
  115.  Delete Db 
  116.   From #Database Db WHERE database_id=@database_id; 
  117.   
  118. END 
  119.  
  120. SELECT  * 
  121. FROM    #TAB_NO_INDEX_INFO 
  122. ORDER BY APPROXIMATE_ROWS DESC
  123.  
  124.  
  125. --找出數(shù)據(jù)量超過1000行沒有索引信息的表 
  126. SELECT * FROM #TAB_NO_INDEX_INFO 
  127. WHERE APPROXIMATE_ROWS > 1000 
  128. ORDER BY APPROXIMATE_ROWS DESC 

當你維護了很多SQL Server數(shù)據(jù)庫時,使用上面腳本到每臺SQL Server實例上跑一次,也是一件非常麻煩耗時的事情,所以還是需要自動化作業(yè)處理,定時使用Python腳本去每臺SQL Server實例上采集數(shù)據(jù)存儲下來,然后DBA只需做好兩件事情:監(jiān)控采集數(shù)據(jù)和分析處理數(shù)據(jù)。這里就不貼Python腳本了,其實就是循環(huán)所有SQL Server實例,運行上面腳本,將采集到的相關(guān)數(shù)據(jù)存儲起來。

 

責任編輯:武曉燕 來源: DBA閑思雜想錄
相關(guān)推薦

2010-07-09 11:28:12

SQL Server數(shù)

2010-07-01 14:18:09

SQL Server數(shù)

2010-07-15 17:28:50

SQL Server

2010-07-09 12:30:14

Sql Server數(shù)

2011-08-04 15:55:25

SQL Server數(shù)

2011-08-03 10:04:57

SQL Server數(shù)沒有主鍵的表

2011-04-02 13:21:34

SQL Server數(shù)據(jù)庫全文索引

2011-07-28 11:44:46

SQL Server數(shù)合并表格數(shù)據(jù)

2010-05-10 18:54:12

Oracle數(shù)據(jù)庫索引

2010-09-25 15:37:38

SQL語句

2011-08-16 09:05:21

SQL Server數(shù)測試索引空間換時間

2011-03-11 13:26:23

SQL Server數(shù)導入數(shù)據(jù)

2011-03-22 13:49:20

SQL Server數(shù)維度表事實表

2010-07-07 10:31:43

SQL Server數(shù)

2010-07-08 15:55:25

SQL Server

2010-09-08 16:03:57

SQL臨時表數(shù)據(jù)庫

2011-07-20 16:03:06

SQL Server數(shù)分區(qū)表

2011-04-07 13:53:04

SQL Server數(shù)

2010-09-10 13:37:30

表分區(qū)SQL Server

2010-07-08 11:05:14

SQL Server數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號