程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL中一些優化straight_join技能

MySQL中一些優化straight_join技能

編輯:MySQL綜合教程

MySQL中一些優化straight_join技能。本站提示廣大學習愛好者:(MySQL中一些優化straight_join技能)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中一些優化straight_join技能正文


元數據簡介

元數據 (metadata) 最多見的界說為“有關數據的構造數據”,或許再簡略一點就是“關於數據的信息”,平常生涯中的圖例、藏書樓目次卡和咭片等都可以看做是元數據。在關系型數據庫治理體系 (DBMS) 中,元數據描寫了數據的構造和意義。好比在治理、保護 SQL Server 或許是開辟數據庫運用法式的時刻,我們常常要獲得一些觸及到數據庫架構的信息:

◆某個數據庫中的表和視圖的個數和稱號;
◆某個表或許視圖中列的個數和每列的稱號、數據類型、長度、精度、描寫等;
◆某個表上界說的束縛;
◆某個表上界說的索引和主鍵/外鍵的信息。

上面我們將引見幾種獲得元數據的辦法。

獲得元數據

應用體系存儲進程與體系函數拜訪元數據

獲得元數據最經常使用的辦法是應用 SQL Server 供給的體系存儲進程與體系函數。

體系存儲進程與體系函數在體系表和元數據之間供給了一個籠統層,使得我們不消直接查詢體系表就可以取得以後數據庫對象的元數據。

經常使用的與元數據相關的體系存儲進程有以下一些:

體系存儲進程

◆sp_columns 前往指定表或視圖的列的具體信息。
◆sp_databases 前往以後辦事器上的一切數據庫的根本信息。
◆sp_fkeys 若參數為帶有主鍵的表,則前往包括指向該表的外鍵的一切表;若參數為帶有外鍵的表名,則前往一切同過主鍵/外鍵關系與該外鍵相干聯的一切表。
◆sp_pkeys 前往指定表的主鍵信息。
◆sp_server_info 前往以後辦事器的各類特征及其對應取值。
◆sp_sproc_columns 前往指定存儲進程的的輸出、輸入參數的信息。
◆sp_statistics 前往指定的表或索引視圖上的一切索引和統計的信息。
◆sp_stored_procedures 前往以後數據庫的存儲進程列表,包括體系存儲進程。
◆sp_tables 前往以後數據庫的一切表和視圖,包括體系表。

經常使用的與元數據相關的體系函數有以下一些:

體系函數

◆COLUMNPROPERTY 前往有關列或進程參數的信息,如能否許可空值,能否為盤算列等。
◆COL_LENGTH 前往指定命據庫的指定屬性值,如能否處於只讀形式等。
◆DATABASEPROPERTYEX 前往指定命據庫的指定選項或屬性確當前設置,如數據庫的狀況、恢復模子等。
◆OBJECT_ID 前往指定命據庫對象名的標識號
◆OBJECT_NAME 前往指定命據庫對象標識號的對象名。
◆OBJECTPROPERTY 前往指定命據庫對象標識號的有關信息,如能否為表,能否為束縛等。
◆fn_listextendedproperty 前往數據庫對象的擴大屬性值,如對象描寫、格局規矩、輸出掩碼等。

因為我們沒法直接應用到存儲進程與函數的前往成果,是以只要在我們關懷的只是查詢的成果,而不須要進一步應用這些成果的時刻,我們會應用體系存儲進程與體系函數來查詢元數據。

例如,假如要取得以後辦事器上一切數據庫的根本信息,我們可以在查詢剖析器外面運轉:

EXEC sp_databases
GO

在前往成果中我們可以看到數據庫的稱號、年夜小及備注等信息。

然則假如要援用這部門信息,或許存儲這部門信息以供前面應用,那末我們必需借助中央表來完成這個操作:

CREATE TABLE #sp_result
(
DATABASE_NAME sysname,
DATABASE_SIZE int,
REMARKS varchar(254) NULL
)
GO
INSERT INTO #sp_result
EXEC ('sp_databases')
GO

應用信息架構視圖拜訪元數據

信息架構視圖基於 SQL-92 尺度中針對架構視圖的界說,這些視圖自力於體系表,供給了關於 SQL Server 元數據的外部視圖。信息架構視圖的最年夜長處是,即便我們對體系表停止了主要的修正,運用法式也能夠正常地應用這些視圖停止拜訪。是以關於運用法式來講,只需是相符 SQL-92 尺度的數據庫體系,應用信息架構視圖老是可以正常任務的。

信息架構視圖

◆INFORMATION_SCHEMA.CHECK_CONSTRAINTS:前往有關列或進程參數的信息,如能否許可空值,能否為盤算列等。
◆INFORMATION_SCHEMA.COLUMNS:前往以後數據庫中以後用戶可以拜訪的一切列及其根本信息。
◆INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE:前往以後數據庫中界說了束縛的一切列及其束縛名。
◆INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE:前往以後數據庫中界說了束縛的一切表及其束縛名。
◆INFORMATION_SCHEMA.KEY_COLUMN_USAGE:前往以後數據庫中作為主鍵/外鍵束縛的一切列。
◆INFORMATION_SCHEMA.SCHEMATA:前往以後用戶具有權限的一切數據庫及其根本信息。
◆INFORMATION_SCHEMA.TABLES:前往以後用戶具有權限確當前數據庫中的一切表或許視圖及其根本信息。
◆INFORMATION_SCHEMA.VIEWS:前往以後數據庫中確當前用戶可以拜訪的視圖及其一切者、界說等信息。

因為這些信息架構都是以視圖的方法存在的,是以我們可以很便利地取得並應用須要的信息。

例如,我們要獲得某個表有若干列,可使用以下語句:

SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS

WHERE TABLE_NAME='mytable'

應用體系表拜訪元數據

固然應用體系存儲進程、體系函數與信息架構視圖曾經可認為我們供給了相當豐碩的元數據信息,然則關於某些特別的元數據信息,我們依然須要直接對體系表停止查詢。由於SQL Server 將一切數據庫對象的信息均寄存在體系表中,作為 SQL Server 的治理、開辟人員,懂得各個體系表的感化將有助於我們懂得 SQL Server 的內涵任務道理。

SQL Server 的體系表異常多,個中最經常使用的與元數據查詢有關的表有以下一些:
syscolumns 存儲每一個表和視圖中的每列的信息和存儲進程中的每一個參數的信息。
syscomments 存儲包括每一個視圖、規矩、默許值、觸發器、CHECK 束縛、DEFAULT 束縛和存儲進程的原始 SQL 文本語句。
sysconstraints 存儲以後數據庫中每個束縛的根本信息。
sysdatabases 存儲以後辦事器上每個數據庫的根本信息。
sysindexes 存儲以後數據庫中的每一個索引的信息。
sysobjects 存儲數據庫內的每一個對象(束縛、默許值、日記、規矩、存儲進程等)的根本信息。
sysreferences 存儲一切包含 FOREIGN KEY 束縛的列。
systypes 存儲體系供給的每種數據類型和用戶界說數據類型的具體信息。

將體系存儲進程、體系函數、信息架構視圖與體系表聯合應用,可以便利地讓我們取得一切須要的元數據信息。

示例:

1、 取得以後數據庫一切用戶表的稱號。

SELECT OBJECT_NAME (id)
FROM sysobjects
WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0

個中重要用到了體系表 sysobjects和其屬性 xtype,還有就是用到了 OBJECTPROPERTY 體系函數來斷定是否是裝置 SQL Server 的進程中創立的對象。

2、取得指定表上一切的索引稱號。

SELECT name FROM sysindexes
WHERE id = OBJECT_ID ('mytable') AND indid > 0

綜合實例

上面給出了一個存儲進程,它的感化是主動將以後數據庫的用戶存儲進程加密。

DECLARE @sp_name nvarchar(400)
DECLARE @sp_content nvarchar(2000)
DECLARE @asbegin int
declare @now datetime
select @now = getdate()
DECLARE sp_cursor CURSOR FOR
SELECT object_name(id)
FROM sysobjects
WHERE xtype = 'P'
AND type = 'P'
AND crdate < @now
AND OBJECTPROPERTY(id, 'IsMSShipped')=0

OPEN sp_cursor

FETCH NEXT FROM sp_cursor
INTO @sp_name

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sp_content = text FROM
syscomments WHERE id = OBJECT_ID(@sp_name)
SELECT @asbegin =
PATINDEX ( '%AS' + char(13) + '%', @sp_content)
SELECT @sp_content =
SUBSTRING(@sp_content, 1, @asbegin - 1)
+ ' WITH ENCRYPTION AS'
+ SUBSTRING (@sp_content, @asbegin+2, LEN(@sp_content))
SELECT @sp_name = 'DROP PROCEDURE [' + @sp_name + ']'
EXEC sp_executesql @sp_name
EXEC sp_executesql @sp_content
FETCH NEXT FROM sp_cursor
INTO @sp_name
END

CLOSE sp_cursor
DEALLOCATE sp_cursor

該存儲進程應用了 sysobjects 和 syscomments 表,並奇妙地修正了原存儲進程的 SQL 界說語句,將 AS 修正為了 WITH ENCRYPTION AS,從而到達了加密存儲進程的目標。本存儲進程在 SQL Server 2000 上經由過程。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved