㈠ 如何查看sqlserver執行計劃來判斷SQL語句效率
檢測mysql中sql語句的效率的方法
1、通過查詢日誌
(1)、Windows下開啟MySQL慢查詢
MySQL在Windows系統中的配置文件一般是是my.ini找到[mysqld]下面加上
代碼如下
log-slow-queries = F:/MySQL/log/mysqlslowquery。log
long_query_time = 2
(2)、Linux下啟用MySQL慢查詢
MySQL在Windows系統中的配置文件一般是是my.cnf找到[mysqld]下面加上
代碼如下
log-slow-queries=/data/mysqldata/slowquery。log
long_query_time=2
說明
log-slow-queries = F:/MySQL/log/mysqlslowquery。
為慢查詢日誌存放的位置,一般這個目錄要有MySQL的運行帳號的可寫許可權,一般都將這個目錄設置為MySQL的數據存放目錄;
long_query_time=2中的2表示查詢超過兩秒才記錄;
2.show processlist 命令
SHOW PROCESSLIST顯示哪些線程正在運行。您也可以使用mysqladmin processlist語句得到此信息。
各列的含義和用途:
ID列
一個標識,你要kill一個語句的時候很有用,用命令殺掉此查詢 /*/mysqladmin kill 進程號。
user列
顯示單前用戶,如果不是root,這個命令就只顯示你許可權范圍內的sql語句。
host列
顯示這個語句是從哪個ip的哪個埠上發出的。用於追蹤出問題語句的用戶。
db列
顯示這個進程目前連接的是哪個資料庫。
command列
顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。
time列
此這個狀態持續的時間,單位是秒。
state列
顯示使用當前連接的sql語句的狀態,很重要的列,後續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個 sql語句,以查詢為例,可能需要經過ing to tmp table,Sorting result,Sending data等狀態才可以完成
info列
顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。
這個命令中最關鍵的就是state列,mysql列出的狀態主要有以下幾種:
Checking table
正在檢查數據表(這是自動的)。
Closing tables
正在將表中修改的數據刷新到磁碟中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁碟空間是否已經滿了或者磁碟是否正處於重負中。
Connect Out
復制從伺服器正在連接主伺服器。
Copying to tmp table on disk
由於臨時結果集大於tmp_table_size,正在將臨時表從內存存儲轉為磁碟存儲以此節省內存。
Creating tmp table
正在創建臨時表以存放部分查詢結果。
deleting from main table
伺服器正在執行多表刪除中的第一部分,剛刪除第一個表。
deleting from reference tables
伺服器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。
Flushing tables
正在執行FLUSH TABLES,等待其他線程關閉數據表。
Killed
發送了一個kill請求給某線程,那麼這個線程將會檢查kill標志位,同時會放棄下一個kill請求。MySQL會在每次的主循環中檢查kill標志位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那麼kill請求會在鎖釋放時馬上生效。
Locked
被其他查詢鎖住了。
Sending data
正在處理SELECT查詢的記錄,同時正在把結果發送給客戶端。
Sorting for group
正在為GROUP BY做排序。
Sorting for order
正在為ORDER BY做排序。
Opening tables
這個過程應該會很快,除非受到其他因素的干擾。例如,在執ALTER TABLE或LOCK TABLE語句行完以前,數據表無法被其他線程打開。正嘗試打開一個表。
Removing plicates
正在執行一個SELECT DISTINCT方式的查詢,但是MySQL無法在前一個階段優化掉那些重復的記錄。因此,MySQL需要再次去掉重復的記錄,然後再把結果發送給客戶端。
Reopen table
獲得了對一個表的鎖,但是必須在表結構修改之後才能獲得這個鎖。已經釋放鎖,關閉數據表,正嘗試重新打開數據表。
Repair by sorting
修復指令正在排序以創建索引。
Repair with keycache
修復指令正在利用索引緩存一個一個地創建新索引。它會比Repair by sorting慢些。
Searching rows for update
正在講符合條件的記錄找出來以備更新。它必須在UPDATE要修改相關的記錄之前就完成了。
Sleeping
正在等待客戶端發送新請求.
System lock
正在等待取得一個外部的系統鎖。如果當前沒有運行多個mysqld伺服器同時請求同一個表,那麼可以通過增加--skip-external-locking參數來禁止外部系統鎖。
Upgrading lock
INSERT DELAYED正在嘗試取得一個鎖表以插入新記錄。
Updating
正在搜索匹配的記錄,並且修改它們。
User Lock
正在等待GET_LOCK()。
Waiting for tables
該線程得到通知,數據表結構已經被修改了,需要重新打開數據表以取得新的結構。然後,為了能的重新打開數據表,必須等到所有其他線程關閉這個表。以下幾種情況下會產生這個通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。
waiting for handler insert
INSERT DELAYED已經處理完了所有待處理的插入操作,正在等待新的請求。
大部分狀態對應很快的操作,只要有一個線程保持同一個狀態好幾秒鍾,那麼可能是有問題發生了,需要檢查一下。
還有其他的狀態沒在上面中列出來,不過它們大部分只是在查看伺服器是否有存在錯誤是才用得著。
㈡ sqlserver 怎麼判斷select 有沒有查到數據
不存在則@name為空
使用@name變數還需要聲明不如使用COUNT
使用COUNT
SELECTCOUNT(1)FROMstudentWHEREName='張三'
--如果存在,等於存在個數
--如果不存在,為0
㈢ Sqlserver查詢語句問題!高分 高手來看看
最基本的處理方法(原理):
如果表中有主鍵(記錄不重復的欄位也可以),可以用類似下面的方法,當然y,(x-1)*y要換成具體的數字,不能用變數:
select top y *
from 表
where 主鍵 not in (select top(x - 1) * y 主鍵 from 表)
如果表中無主鍵,可以用臨時表,加標識欄位解決.這里的x,y可以用變數.
select id = identity(int, 1, 1),*
into #tb
from 表
select * from #tb where id between (x - 1) * y and x * y - 1
㈣ oracle 用if sqlcode != 0 來判斷sql語句是否成功 sqlserver 存儲過程 怎樣判斷一條sql語句執行成功了沒有
返回執行的上一個 Transact-SQL 語句的錯誤號。
Transact-SQL 語法約定
語法
@@ERROR
返回類型
integer
備注
如果前一個 Transact-SQL 語句執行沒有錯誤,則返回 0。
如果前一個語句遇到錯誤,則返回錯誤號。如果錯誤是 sys.messages 目錄視圖中的錯誤之一,則 @@ERROR 將包含 sys.messages.message_id 列中表示該錯誤的值。可以在 sys.messages 中查看與 @@ERROR 錯誤號相關的文本信息。
由於 @@ERROR 在每一條語句執行後被清除並且重置,因此應在語句驗證後立即查看它,或將其保存到一個局部變數中以備以後查看。
使用 TRY...CATCH 構造來處理錯誤。TRY...CATCH 構造也支持其他返回的錯誤信息多於 @@ERROR 的系統函數(ERROR_LINE、ERROR_MESSAGE、ERROR_PROCEDURE、ERROR_SEVERITY 和 ERROR_STATE)。TRY...CATCH 也支持 ERROR_NUMBER 函數,但不限制該函數在語句產生錯誤後立即在語句中返回錯誤號。有關詳細信息,請參閱 TRY...CATCH (Transact-SQL)。
示例
A. 用 @@ERROR 檢測一個特定錯誤
以下示例用 @@ERROR 在 UPDATE 語句中檢測約束檢查沖突(錯誤 #547)。
復制代碼
USE AdventureWorks;
GO
UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 4
WHERE EmployeeID = 1;
IF @@ERROR = 547
PRINT N'A check constraint violation occurred.';
GO
B. 用 @@ERROR 有條件地退出一個過程
在此示例中,IF...ELSE 語句在存儲過程中的 INSERT 語句後檢測 @@ERROR。@@ERROR 變數的值將決定發送給調用程序的返回代碼,以指示此過程的成功與失敗。
復制代碼
USE AdventureWorks;
GO
-- Drop the procere if it already exists.
IF OBJECT_ID(N'HumanResources.usp_DeleteCandidate', N'P') IS NOT NULL
DROP PROCEDURE HumanResources.usp_DeleteCandidate;
GO
-- Create the procere.
CREATE PROCEDURE HumanResources.usp_DeleteCandidate
(
@CandidateID INT
)
AS
-- Execute the DELETE statement.
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = @CandidateID;
-- Test the error value.
IF @@ERROR <> 0
BEGIN
-- Return 99 to the calling program to indicate failure.
PRINT N'An error occurred deleting the candidate information.';
RETURN 99;
END
ELSE
BEGIN
-- Return 0 to the calling program to indicate success.
PRINT N'The job candidate has been deleted.';
RETURN 0;
END;
GO
C. 與 @@ROWCOUNT 一同使用 @@ERROR
下面的示例用 @@ERROR 和 @@ROWCOUNT 驗證一條 UPDATE 語句的操作。為任何可能出現的錯誤而檢驗 @@ERROR 的值,而用 @@ROWCOUNT 保證更新已成功應用於表中的某行。
㈤ 怎樣用sqlserver語句判斷某個欄位是否有重復
SELECT DISTINCT 欄位 FROM 表 --選出不重復值
select ID from table1 group by ID HAVING COUNT(*)>1--選出重復值
㈥ sql 語句中判斷語句過多是不是會影響到執行效率
個人感覺確實會影響一些效率 不過一般來說,這個影響是可以忽略掉的,而且SQLServer也會對查詢語句作出一定的優化來
㈦ sqlserver 判斷表中是否有數據
執行一條下面語句如果返回大於0就是有數據了,如果是0就是沒有數據
selectcount(*)from表名
㈧ SQLServer update select語句判斷列值更新到另外一張表
update 表1 set 修改欄位=修改後內容 where 條件1 in(select 條件1關聯值 from 表2 where 表1.關聯欄位=表2.關聯欄位)
㈨ 求個sqlserver查詢語句
可以用過程實現,sql恐怕不行哦,
create proc proc()
as
begin
定義變數
判斷年齡
判斷性別
最後返回
end