導航:首頁 > 源碼編譯 > 視圖預編譯mssql

視圖預編譯mssql

發布時間:2022-06-01 08:04:11

『壹』 哪位大哥告訴我:MSSQL全文索引後為啥網站變慢了

SQL Server資料庫查詢速度慢的原因有很多,常見的有以下幾種:

1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設計的缺陷)

2、I/O吞吐量小,形成了瓶頸效應。

3、沒有創建計算列導致查詢不優化。

4、內存不足

5、網路速度慢

6、查詢出的數據量過大(可以採用多次查詢,其他的方法降低數據量)

7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設計的缺陷)

8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。

9、返回了不必要的行和列

10、查詢語句不好,沒有優化

●可以通過以下方法來優化查詢 :

1、把數據、日誌、索引放到不同的I/O設備上,增加讀取速度,以前可以將Tempdb應放在RAID0上,SQL2000不在支持。數據量(尺寸)越大,提高I/O越重要。

2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)

3、升級硬體

4、根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的數據量。注意填充因子要適當(最好是使用默認值0)。索引應該盡量小,使用位元組數小的列建索引好(參照索引的創建),不要對有限的幾個值的欄位建單一索引如性別欄位。

5、提高網速。

6、擴大伺服器的內存,Windows 2000和SQL server 2000能支持4-8G的內存。

配置虛擬內存:虛擬內存大小應基於計算機上並發運行的服務進行配置。運行 Microsoft SQL Server? 2000時,可考慮將虛擬內存大小設置為計算機中安裝的物理內存的1.5倍。如果另外安裝了全文檢索功能,並打算運行Microsoft搜索服務以便執行全文索引和查詢,可考慮:將虛擬內存大小配置為至少是計算機中安裝的物理內存的3倍。將SQL Server max server memory伺服器配置選項配置為物理內存的1.5倍(虛擬內存大小設置的一半)。

7、增加伺服器CPU個數;但是必須 明白並行處理串列處理更需要資源例如內存。使用並行還是串列程是MsSQL自動評估選擇的。單個任務分解成多個任務,就可以在處理器上運行。例如耽擱查詢 的排序、連接、掃描和GROUP BY字句同時執行,SQL SERVER根據系統的負載情況決定最優的並行等級,復雜的需要消耗大量的CPU的查詢最適合並行處理。但是更新操作UPDATE,INSERT, DELETE還不能並行處理。

8、如果是使用like進行查詢的話,簡單的使用index是不行的,但是全文索引,耗空間。 like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查詢時,查詢耗時和欄位值總長度成正比,所以不能用CHAR類型,而是VARCHAR。對於欄位的值很長的建全文索引。

9、DB Server 和APPLication Server 分離;OLTP和OLAP分離

10、分布式分區視圖可用於實現資料庫伺服器聯合體。

聯合體是一組分開管理的伺服器,但它們相互協作分擔系統的處理負荷。這種通過分區數據形成資料庫伺服器聯合體的機制能夠擴大一組伺服器,以支持大型的多層 Web 站點的處理需要。有關更多信息,參見設計聯合資料庫伺服器。(參照SQL幫助文件''分區視圖'')

a、在實現分區視圖之前,必須先水平分區表

b、 在創建成員表後,在每個成員伺服器上定義一個分布式分區視圖,並且每個視圖具有相同的名稱。這樣,引用分布式分區視圖名的查詢可以在任何一個成員伺服器上 運行。系統操作如同每個成員伺服器上都有一個原始表的復本一樣,但其實每個伺服器上只有一個成員表和一個分布式分區視圖。數據的位置對應用程序是透明的。

11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數據和日誌 DBCC SHRINKDB,DBCC SHRINKFILE. 設置自動收縮日誌.對於大的資料庫不要設置資料庫自動增長,它會降低伺服器的性能。

在T-sql的寫法上有很大的講究,下面列出常見的要點:首先,DBMS處理查詢計劃的過程是這樣的:

1、 查詢語句的詞法、語法檢查

2、 將語句提交給DBMS的查詢優化器

3、 優化器做代數優化和存取路徑的優化

4、 由預編譯模塊生成查詢規劃

5、 然後在合適的時間提交給系統處理執行

6、 最後將執行結果返回給用戶。

其次,看一下SQL SERVER的數據存放的結構:一個頁面的大小為8K(8060)位元組,8個頁面為一個盤區,按照B樹存放。

『貳』 為什麼MYSQL很少人用視圖,MYSQL的視圖和MSSQL的視圖有什麼本質區別。

問題一:為什麼MYSQL很少人用視圖?

答:mysql並不是很少人用,而是大部分一般直接通過sql查詢的方式來實現類似view功能,不願意 去增加這么一個過程,其實增加view還是有很多好處:

  1. 簡單性。視圖不僅可以簡化用戶對數據的理解,也可以簡化他們的操作。

  2. 安全性。通過視圖用戶只能查詢和修改他們所能見到的數據。

  3. 邏輯數據獨立性。視圖可以使應用程序和資料庫表在一定程度上獨立。

問題二:MySQL和MSSQL有哪些本質區別?

答:MySQL可以說是MSSQL的簡化版本。理念相同,但MySQL的實現比MSSQL的需求低。MySQL是一個免費的、開放源代碼的SQL資料庫,所以免費的MYSQL很受歡迎,

『叄』 關於MSSQL資料庫視圖的修改

把ACCESS轉成SQL資料庫

很多朋友想用SQL2000資料庫的編程方法,但是卻又苦於自己是學ACCESS的,對SQL只是一點點的了解而已,這里我給大家提供以下參考---將ACCESS轉化成SQL2000的方法和注意事項
一,首先,我說的是在ACCESS2000,SQL2000之間轉換,其他的我也還沒有嘗試過,希望大家多多試驗,肯定是有辦法的;
二,轉換的方法
1,打開」控制面板「下」管理工具「中的」資料庫源「;
2,按」添加「添加一個新的數據源,在選擇欄里選」Driver do microsoft Access
(*.mdb)」,完成後將出現一個框,

在」資料庫源「裡面輸入你想寫的名稱,我取名叫「ABC」,說明不需要填,接著,按下面的選擇,尋找你的資料庫地址和選中(注意,請先備份自己的ACCESS資料庫),然後確定。
數據源在這里建好了,剩下轉換了。

3,打開SQL2000企業管理器,進入資料庫,新建一個空的資料庫「ABC」;
4,選擇新建立的資料庫,按滑鼠右鍵,選擇「所有任務」下「導入數據」,按「下一步」繼續;
5,在資料庫源下拉但中選擇」Driver do microsoft Access(*.mdb)「,在」用戶/系統DSN「中,選種你剛才添加的」ABC「,按 」下一步「;
6,「目的」不需要修改,選擇伺服器(一般下為自己的本機「local「,也可以選擇伺服器地址或者區域網地址,確定你的許可權是否可以操作,),「使用WINDOWS 身份驗證「指用自己的系統管理員身份操作,「使用SQL身份操作驗證「可以用於網站的操作,推薦用後者;
7,選上「使用SQL身份操作驗證「後,填寫你的用戶名和密碼,我自己選擇的是系統默認號碼「sa「,「****「,資料庫選擇剛新建的「ABC「,按「下一步「;
8,這一步的兩個單項選擇,「從數據源復製表和視圖「與「用一條查詢指令指定要傳輸的數據「,選擇前者,按「下一步「繼續;
9,這里將出現你自己ACCESS資料庫的表,按「全選「後,下一步;
10,「DTS導入/導出向導「,看「立即運行「被選中按「下一步「,
11,按「完成「繼續;
12,這個步驟你將看到你的數據被導入SQL2000裡面,當出現「已經成功把XXX個表導入到資料庫「的字樣,而且所有的表前面都有綠色的勾,就表示成功導入所有數據,如果中途出現問題或者表前面有紅色的叉的話,說明該表沒有成功導入,這時就要回去查看自己的操作是否正確了.

三,數據修改
1,由於SQL2000裡面沒有「自動編號「,所以你的以「自動編號「設置的欄位都會變成非空的欄位,這就必須手工修改這些欄位,並把他的「標示「選擇「是「,種子為「1「,增量為「1「,
2,另外,ACCESS2000轉換成SQL2000後,原來屬性為「是/否「的欄位將被轉換成非空的「bit「,這時候你必須修改成自己想要的屬性了;
3,另外,大家要注意對時間函數的把握.ACCESS與SQL是有很多不同的.

ACCESS改為SQL需要注意哪幾個地方

資料庫導入以後,自動增加欄位需要重寫,所有的數字類型需要增加長度,最好用decimal。

所有的默認值都丟失了。主要是數字類型和日期類型。

所有now(),time(),date()要改成getdate()。

所有datediff(『d『, time1, time2)要改成datediff(day, time1, time2)

有可能一些true/false類型不能使用,要變為1/0。

備注類型要通過cast(column as varchar)來使用。

CursorType要改成1,也就是打開資料庫時要給出第一個數字參數為1,否則記錄可能顯示不完整。

isnull(rowname)要改成rowname = null

ACCESS的資料庫中的自動編號類型在轉化時,sql server並沒有將它設為自動編號型,我們需在SQL創建語句中加上identity,表示自動編號!

轉化時,跟日期有關的欄位,SQL SERVER默認為smalldatetime型,我們最好將它變為datetime型,因為datetime型的范圍比smalldatetime型大。有時用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功。

對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行刪除紀錄時用:「delete * from user where id=10「,而對SQL SERVER資料庫進行刪除是用:「delete user where id=10「.

日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對SQL SERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time()等函數。

在對ACCESS資料庫處理中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQL SERVER資料庫處理中,卻不能用。

ACCESS轉SQL SERVER的資料庫的幾點經驗

1.ACCESS的資料庫中的自動編號類型在轉化時,sql server並沒有將它設為自動編號型,我們需在SQL創建語句中加上identity,表示自動編號!
2.轉化時,跟日期有關的欄位,SQL SERVER默認為smalldatetime型,我們最好將它變為datetime型,因為datetime型的范圍比smalldatetime型大。我遇見這種情況,用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功。
3.對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行刪除紀錄時用:「delete * from user where id=10「,而對SQL SERVER資料庫進行刪除是用:「delete user where id=10「.
4.日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對SQL SERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time()等函數。
5.在對ACCESS資料庫處理中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQL SERVER資料庫處理中,卻不能用。

access轉mssql需要注意的問題
自動增加欄位需要重寫。在access中經常使用的自動編號欄位,導入到mssql後,他並不是自增型的int,需要手工設置,把導入後的自動編號欄位的標識的「否」改為「是」,「種子」和「遞增量」都為「1」,才能成為自動編號

所有的默認值都丟失了。主要是數字類型和日期類型

所有now(),time(),date()要改成getdate()

所有datediff('d', time1, time2)要改成datediff(day, time1, time2)

所有datediff('ww', time1, time2)要改成datediff(week, time1, time2)

所有datediff('d', time1, time2)要改成datediff(day, time1, time2)

在mssql server中,有許多保留字,在access中是沒有的,當你把數據導入到mssql的時候,問題就出來了。mssql在導入的時候,會自動給這些欄位(包括資料庫中的表名)加上「[欄位名]」,因此,你必須修改你的腳本,把相應的欄位名字(或者表名字)加上中括弧,或改變欄位名字為不是mssql的保留字

在用access關於時間的使用,大家喜歡使用「select * from aaaa while time="&now()」這樣的sql語句,然而,在mssql中沒有「now()」這個函數,而是使用「getdate()」,所以,所有的sql語句中的「now()」必須換成「getdate()」。

日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對
SQL SERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time()等函數。

轉化時,跟日期有關的欄位,SQL SERVER默認為smalldatetime型,我們最好將它變為datetime型,因為datetime型的范圍比smalldatetime型大。有時用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功
isnull(rowname)要改成rowname = null
CursorType要改成1,也就是打開資料庫時要給出第一個數字參數為1,否則記錄可能
顯示不完整
備注類型要通過cast(column as varchar)來使用
true/false類型不能使用,要變為1/0
對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行刪除紀錄時用:"delete * from user where id=10",而對SQL SERVER資料庫進行刪除是用:"delete user where id=10".
在對ACCESS資料庫處理中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQL SERVER資料庫處理中,卻不能用
在access的sql語句中的時間使用變數查詢的時候,大家一般使用"select * from aaaa while time=#"&變數名&"#",在mssql中是不行的,他的語法是「select * from aaaa while time='"&變數名&"'"」。(意思是讓你把日期時間變數當成字元串來使用,呵呵~~~)

原來ASP里的「DELETE * FROM ……」要改為「DELETE FROM ……」

有可能rs.update失敗,修改成update 表名 set 欄位=『值』 這樣通過(遇到的情況,提示為:
Microsoft OLE DB Provider for SQL Server 錯誤 '80040e38'

樂觀並發檢查失敗。已在此游標之外修改了該行。

/Admin_ClassOrder.asp,行 164 )
access裡面除法可以使用"\"或者"/",MSSQL裡面只能使用"/"

1、自動增加欄位需要重寫。在access中經常使用的自動編號欄位,導入到mssql後,他並不是自增型的int,需要手工設置,把導入後的自動編號欄位的標識的「否」改為「是」,「種子」和「遞增量」都為「1」,才能成為自動編號。
2、所有的默認值都丟失了。主要是數字類型和日期類型
3、所有now(),time(),date()要改成getdate()
4、所有datediff('d', time1, time2)要改成datediff(day, time1, time2)
5、所有datediff('ww', time1, time2)要改成datediff(week, time1, time2)
6、所有datediff('d', time1, time2)要改成datediff(day, time1, time2)
7、在mssql server中,有許多保留字,在access中是沒有的,當你把數據導入到mssql的時候,問題就出來了。mssql在導入的時候,會自動給這些欄位(包括資料庫中的表名)加上「[欄位名]」,因此,你必須修改你的腳本,把相應的欄位名字(或者表名字)加上中括弧,或改變欄位名字為不是mssql的保留字

8、在用access關於時間的使用,大家喜歡使用「select * from aaaa while time="&now()」這樣的sql語句,然而,在mssql中沒有「now()」這個函數,而是使用「getdate()」,所以,所有的sql語句中的「now()」必須換成「getdate()」。
9、日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對
SQL SERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time()等函數。
10、轉化時,跟日期有關的欄位,SQL SERVER默認為smalldatetime型,我們最好將它變為datetime型,因為datetime型的范圍比smalldatetime型大。有時用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功
11、isnull(rowname)要改成rowname = null
12、CursorType要改成1,也就是打開資料庫時要給出第一個數字參數為1,否則記錄可能顯示不完整
13、備注類型要通過cast(column as varchar)來使用
14、true/false類型不能使用,要變為1/0
15、對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行刪除紀錄時用:"delete * from user where id=10",而對SQL SERVER資料庫進行刪除是用:"delete user where id=10".
16、在對ACCESS資料庫處理中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQL SERVER資料庫處理中,卻不能用
17、在access的sql語句中的時間使用變數查詢的時候,大家一般使用"select * from aaaa while time=#"&變數名&"#",在mssql中是不行的,他的語法是「select * from aaaa while time='"&變數名&"'"」。(意思是讓你把日期時間變數當成字元串來使用)
18、原來ASP里的「DELETE * FROM ……」要改為「DELETE FROM ……」
19、有可能rs.update失敗,修改成update 表名 set 欄位=『值』 這樣通過
20、access裡面除法可以使用"\"或者"/",MSSQL裡面只能使用"/"
21、在SqlServer中建立主鍵
22、如果還有問題用:rs.open sql,conn,3,2試試

『肆』 MSSQL 怎麼判斷存儲過程和試圖是否有效

sql判斷存儲過程是否有效
1 判斷資料庫教程是否存在
Sql代碼
if exists (select * from sys.databases where name = 』資料庫名』)
drop database [資料庫名] if exists (select * from sys.databases where name = 』資料庫名』)
drop database [資料庫名]
2 判斷表是否存在
Sql代碼
if exists (select * from sysobjects where id = object_id(N』[表名]』) and OBJECTPROPERTY(id, N』IsUserTable』) = 1)
drop table [表名] if exists (select * from sysobjects where id = object_id(N』[表名]』) and OBJECTPROPERTY(id, N』IsUserTable』) = 1)
drop table [表名]
3 判斷存儲過程是否存在
Sql代碼
if exists (select * from sysobjects where id = object_id(N』[存儲過程名]』) and OBJECTPROPERTY(id, N』IsProcere』) = 1)
drop procere [存儲過程名] if exists (select * from sysobjects where id = object_id(N』[存儲過程名]』) and OBJECTPROPERTY(id, N』IsProcere』) = 1)
drop procere [存儲過程名]
4 判斷臨時表是否存在
Sql代碼
if object_id(』tempdb..#臨時表名』) is not null
drop table #臨時表名 if object_id(』tempdb..#臨時表名』) is not null
drop table #臨時表名
5 判斷視圖是否存在
Sql代碼
--SQL Server 2000
IF EXISTS (SELECT * FROM sysviews WHERE object_id = 』[dbo].[視圖名]』
--SQL Server 2005
IF EXISTS (SELECT * FROM sys.views WHERE object_id = 』[dbo].[視圖名]』 --SQL Server 2000
IF EXISTS (SELECT * FROM sysviews WHERE object_id = 』[dbo].[視圖名]』
--SQL Server 2005
IF EXISTS (SELECT * FROM sys.views WHERE object_id = 』[dbo].[視圖名]』
6 判斷函數是否存在
Sql代碼
-- 判斷要創建的函數名是否存在
if exists (select * from dbo.sysobjects where id = object_id(N』[dbo].[函數名]』) and xtype in (N』FN』, N』IF』, N』TF』))
drop function [dbo].[函數名] -- 判斷要創建的函數名是否存在
if exists (select * from dbo.sysobjects where id = object_id(N』[dbo].[函數名]』) and xtype in (N』FN』, N』IF』, N』TF』))
drop function [dbo].[函數名]
7 獲取用戶創建的對象信息
Sql代碼
SELECT [name],[id],crdate FROM sysobjects where xtype=』U』

/*
xtype 的表示參數類型,通常包括如下這些
C = CHECK 約束
D = 默認值或 DEFAULT 約束
F = FOREIGN KEY 約束
L = 日誌
FN = 標量函數
IF = 內嵌表函數
P = 存儲過程
PK = PRIMARY KEY 約束(類型是 K)
RF = 復制篩選存儲過程
S = 系統表
TF = 表函數
TR = 觸發器
U = 用戶表
UQ = UNIQUE 約束(類型是 K)
V = 視圖
X = 擴展存儲過程
*/ SELECT [name],[id],crdate FROM sysobjects where xtype=』U』
/*
xtype 的表示參數類型,通常包括如下這些
C = CHECK 約束
D = 默認值或 DEFAULT 約束
F = FOREIGN KEY 約束
L = 日誌
FN = 標量函數
IF = 內嵌表函數
P = 存儲過程
PK = PRIMARY KEY 約束(類型是 K)
RF = 復制篩選存儲過程
S = 系統表
TF = 表函數
TR = 觸發器
U = 用戶表
UQ = UNIQUE 約束(類型是 K)
V = 視圖
X = 擴展存儲過程
*/
8 判斷列是否存在
Sql代碼
if exists(select * from syscolumns where id=object_id(』表名』) and name=』列名』)
alter table 表名 drop column 列名 if exists(select * from syscolumns where id=object_id(』表名』) and name=』列名』)
alter table 表名 drop column 列名
9 判斷列是否自增列
Sql代碼
if columnproperty(object_id(』table』),』col』,』IsIdentity』)=1
print 』自增列』
else
print 』不是自增列』

SELECT * FROM sys.columns WHERE object_id=OBJECT_ID(』表名』)
AND is_identity=1 if columnproperty(object_id(』table』),』col』,』IsIdentity』)=1
print 』自增列』
else
print 』不是自增列』
SELECT * FROM sys.columns WHERE object_id=OBJECT_ID(』表名』)
AND is_identity=1
10 判斷表中是否存在索引
Sql代碼
if exists(select * from sysindexes where id=object_id(』表名』) and name=』索引名』)
print 』存在』
else
print 』不存在 if exists(select * from sysindexes where id=object_id(』表名』) and name=』索引名』)
print 』存在』
else
print 』不存在
11 查看資料庫中對象
Sql代碼
SELECT * FROM sys.sysobjects WHERE name=』對象名』 SELECT * FROM sys.sysobjects WHERE name=』對象名』

『伍』 mssql 視圖能不能創建索引,帶子查詢的視圖能不能創建索引,如何創建

消息提示已經給你答案了,你可以考慮用表連接代替子查詢。

以下是在視圖上建索引的規則,無法改變的:
定義索引視圖的SELECT語句不得包含TOP、DISTINCT、COMPUTE、HAVING和UNION關鍵字。也不能包含子查詢。

SELECT列表中不得包含星號(*)、'table.*'通配符列表、DISTINCT、COUNT(*)、COUNT(<expression>)、基表中的計算列和標量聚合。

非聚合SELECT列表中不能包含表達式。聚合SELECT列表(包含GROUPBY的查詢)中可能包含SUM和COUNT_BIG(<expression>);它一定包含COUNT_BIG(*)。不允許有其它聚合函數(MIN、MAX、STDEV,...)。

使用AVG的復雜聚合無法參與索引視圖的SELECT列表。不過,如果查詢使用這樣的聚合,則優化程序將能使用該索引視圖,用SUM和COUNT_BIG的簡單聚合組合代替AVG。

若某列是從取值為float數據類型或使用float表達式進行取值的表達式得到的,則不能作為索引視圖或表中計算列的索引鍵。這樣的列被視為是不精確的。使用COLUMNPROPERTY函數決定特定計算列或視圖中的列是否精確。

索引視圖受限於以下的附加限制:

索引的創建者必須擁有表。所有表、視圖和索引必須在同一資料庫中創建。

定義索引視圖的SELECT語句不得包含視圖、行集函數、行內函數或派生表。同一物理表在該語句中只能出現一次。

在任何聯接表中,均不允許進行OUTERJOIN操作。

搜索條件中不允許使用子查詢或者CONTAINS或FREETEXT謂詞。

『陸』 sql 中在什麼情況下使用視圖,有什麼好處

您好:(通俗解釋,純手打。)
一般的關系型資料庫都支持視圖;視圖僅支持查詢,不支持增刪改等數據操作。您可以將視圖當作是一種臨時表。其存在的意義就是方便進行查詢,例如你需要在一起查詢中查詢多個關聯表的內容,那麼可以將查詢關系先建立好一個視圖;如此你在程序中直接可以針對於視圖進行查詢,方便地直接得到你想要的查詢結果。
使用情況:例如使用到字典表的時候,我們需要多次關聯字典表中的內容;
好處:方便查詢(主要),在一定程度上提高效率(不絕對,視具體情況。)

『柒』 Mssql 如何創建物化視圖 比如: select * FROM u_sale_m left join u_sale_c 這個語句如何創建

create or replace view 視圖名 as
select * FROM u_sale_m left join u_sale_c
運行完
你再查詢select * from 視圖名 就可以

『捌』 MS-SQL中,視圖和查詢的區別有哪些

將經常要使用的不帶參數的查詢保存起來,就是一個視圖。

視圖在查詢時可以當成一張表來用,但是實際上數據還是從各自的表裡面取的。 任何東西在海量時都會慢,所以樓上說的「海量數據時會慢一些」等於沒說。 視圖創建得不合理就會慢了。本質上只是存儲了了一段查詢的SQL ,由於,這段SQL是已經編譯完的(即,不是以語句的形式來執行)所以執行時不需要一個驗證語法是否正確的過程(保存視圖的時候驗證好了),因此理論上會快一小點,不過只是理論上,你幾乎不可能測量出來。

『玖』 mssql中什麼叫視圖

視圖可以被看成是虛擬表或存儲查詢。可通過視圖訪問的數據不作為獨特的對象存儲在資料庫內。資料庫內存儲的是 SELECT 語句。SELECT 語句的結果集構成視圖所返回的虛擬表。用戶可以用引用表時所使用的方法,在 Transact-SQL 語句中通過引用視圖名稱來使用虛擬表。

『拾』 資料庫中的視圖又什麼用

SQL視圖

視圖可以被看成是虛擬表或存儲查詢。可通過視圖訪問的數據不作為獨特的對象存儲在資料庫內。資料庫內存儲的是 SELECT 語句。SELECT 語句的結果集構成視圖所返回的虛擬表。用戶可以用引用表時所使用的方法,在 Transact-SQL 語句中通過引用視圖名稱來使用虛擬表。使用視圖可以實現下列任一或所有功能:

將用戶限定在表中的特定行上。
例如,只允許雇員看見工作跟蹤表內記錄其工作的行。

將用戶限定在特定列上。
例如,對於那些不負責處理工資單的雇員,只允許他們看見雇員表中的姓名列、辦公室列、工作電話列和部門列,而不能看見任何包含工資信息或個人信息的列。

將多個表中的列聯接起來,使它們看起來象一個表。

聚合信息而非提供詳細信息。
例如,顯示一個列的和,或列的最大值和最小值。

通過定義 SELECT 語句以檢索將在視圖中顯示的數據來創建視圖。SELECT 語句引用的數據表稱為視圖的基表。在下例中,pubs 資料庫中的 titleview 是一個視圖,該視圖選擇三個基表中的數據來顯示包含常用數據的虛擬表:

CREATE VIEW titleview
AS
SELECT title, au_ord, au_lname, price, ytd_sales, pub_id
FROM authors AS a
JOIN titleauthor AS ta ON (a.au_id = ta.au_id)
JOIN titles AS t ON (t.title_id = ta.title_id)

之後,可以用引用表時所使用的方法在語句中引用 titleview。

SELECT *
FROM titleview

一個視圖可以引用另一個視圖。例如,titleview 顯示的信息對管理人員很有用,但公司通常只在季度或年度財務報表中才公布本年度截止到現在的財政數字。可以建立一個視圖,在其中包含除 au_ord 和 ytd_sales 外的所有 titleview 列。使用這個新視圖,客戶可以獲得已上市的書籍列表而不會看到財務信息:

CREATE VIEW Cust_titleview
AS
SELECT title, au_lname, price, pub_id
FROM titleview

視圖可用於在多個資料庫或 Microsoft? SQL Server? 2000 實例間對數據進行分區。分區視圖可用於在整個伺服器組內分布資料庫處理。伺服器組具有與伺服器聚集相同的性能優點,並可用於支持最大的 Web 站點或公司數據中心的處理需求。原始表被細分為多個成員表,每個成員表包含原始表的行子集。每個成員表可放置在不同伺服器的資料庫中。每個伺服器也可得到分區視圖。分區視圖使用 Transact-SQL UNION 運算符,將在所有成員表上選擇的結果合並為單個結果集,該結果集的行為與整個原始表的復本完全一樣。例如在三個伺服器間進行表分區。在第一個伺服器上定義如下的分區視圖:

CREATE VIEW PartitionedView AS
SELECT *
FROM MyDatabase.dbo.PartitionTable1
UNION ALL
SELECT *
FROM Server2.MyDatabase.dbo.PartitionTable2
UNION ALL
SELECT *
FROM Server3.MyDatabase.dbo.PartitionTable3

在其它兩個伺服器上定義類似的分區視圖。利用這三個視圖,三個伺服器上任何引用 PartitionedView 的 Transact-SQL 語句都將看到與原始表中相同的行為。似乎每個伺服器上都存在原始表的復本一樣,而實際上每個表只有一個成員表和分區視圖。有關更多信息,請參見視圖使用方案。

只要所做的修改隻影響視圖所引用的其中一個基表,就可以更新所有 SQL Server 版本內的視圖(可以對其執行 UPDATE、DELETE 或 INSERT 語句)。

-- Increase the prices for publisher 』0736』 by 10%.
UPDATE titleview
SET price = price * 1.10
WHERE pub_id = 』0736』
GO

SQL Server 2000 支持可引用視圖的更復雜的 INSERT、UPDATE 和 DELETE 語句。可在視圖上定義 INSTEAD OF 觸發器,指定必須對基表執行的個別更新以支持 INSERT、UPDATE 或 DELETE 語句。另外,分區視圖還支持 INSERT、UDPATE 和 DELETE 語句修改視圖所引用的多個成員表。

索引視圖是 SQL Server 2000 具有的功能,可顯著提高復雜視圖類型的性能,這些視圖類型通常在數據倉庫或其它決策支持系統中出現。

視圖的結果集通常不保存在資料庫中,因此視圖也稱為虛擬表。視圖的結果集動態包含在語句邏輯中並在運行時動態生成。有關更多信息,請參見視圖解析。

復雜的查詢(如決策支持系統中的查詢)可引用基表中的大量行,並將大量信息聚積在相對較簡潔的聚合中,如總和或平均值。SQL Server 2000 支持在執行此類復雜查詢的視圖上創建聚集索引。當執行 CREATE INDEX 語句時,視圖 SELECT 的結果集將永久存儲在資料庫中。SQL 語句此後若引用該視圖,響應時間將會顯著縮短。對基本數據的修改將自動反映在視圖中。

SQL Server 2000 CREATE VIEW 語句支持 SCHEMABINDING 選項,以防止視圖所引用的表在視圖未被調整的情況下發生改變。必須為任何創建索引的視圖指定 SCHEMABINDING。

例:創建視圖
Create View TitleView
AS
Select ID,Title,PostTime,Hits From [List]
然後引用Select Top 100 * From TitleView
用循環輸出數據與直接Select Top 100 * From [List]相比速度提高將近30毫秒!
當然我這里只是舉例子,一般情況下對單個表沒必要去用視圖

閱讀全文

與視圖預編譯mssql相關的資料

熱點內容
程序員那麼可愛小說結局 瀏覽:862
zenity命令 瀏覽:564
監禁風暴哪個app有 瀏覽:865
程序員的愛心是什麼 瀏覽:591
java中對字元串排序 瀏覽:290
單片機用數模轉換生成三角波 瀏覽:634
外網怎麼登陸伺服器地址 瀏覽:133
什麼人要懂編譯原理 瀏覽:150
源碼改單 瀏覽:712
pdfzip 瀏覽:875
壓縮空氣25兆帕會變成液體嗎 瀏覽:50
linux測試伺服器性能 瀏覽:950
dlp硬碟加密 瀏覽:361
應用加密裡面打不開 瀏覽:857
基於單片機的超聲波測距儀的設計 瀏覽:741
xp自動備份指定文件夾 瀏覽:662
我的世界伺服器如何讓世界平坦 瀏覽:170
伺服器和電腦如何共享 瀏覽:689
程序員早期症狀 瀏覽:573
學小學生編程哪裡學 瀏覽:951