sqlnotin索引
1. 在sql Server中為什麼不建議使用Not In子查詢
因為sql的條件篩選不走索引情況下 是循環遍歷 而子查詢 的出現 會使子查詢的查詢次數=子查詢個數乘以數據行數 那麼多次 效率不高 所以不建議使用子查詢 非要用 子查詢最好給子查詢的表建立索引
譬如:
Select * From feeData Where FeeID Not in (Select ID From FeeInfo)
FeeInfo 表最好有索引
優化語句:Select * From feeData as d Left Join FeeInfo f on d.FeeID =f.ID Where f.Id is null
2. sql server 怎麼查看錶的索引
SELECT 索引名稱=a.name
,表名=c.name
,索引欄位名=d.name
,索引欄位位置=d.colid
FROM sysindexes a
JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid
JOIN sysobjects c ON b.id=c.id
JOIN syscolumns d ON b.id=d.id AND b.colid=d.colid
WHERE a.indid NOT IN(0,255)
-- and c.xtype='U' and c.status>0 --查所有用戶表
AND c.name='message' --查指定表
ORDER BY c.name,a.name,d.name
需創建索引 例如:
根據某列判斷是否有重復記錄,如果該列為非主鍵,則創建索引
根據經常查詢的列,創建索引
無須創建索引
欄位內容大部分一樣,例如:男,女
不要給所有的列都創建索引,這樣在創建新記錄時,增加維護開銷時間。
3. 這條sql語句 如何能避免全表掃描,增快查詢速度,下面4個欄位都建立了索引
避免用not in ,not like, <>等等操作
如果是4個欄位的組合索引那麼要注意使用時候的欄位順序
另外提醒下索引使用不當反而會導致查詢效率低下
一句兩句講不清楚的,看你自己的經驗了
4. 如何一條sql語句查找表中第二大值
select max(value) from customer 返回的是包括最大值的表 ,是不能與一個值比較的,應該用 in 或 not in操作符,即:
select max(value) from customer where value not in (select max(value) from customer)
在查詢中,in 或 not in操作符是索引失效,速度變慢,可以用以下表連接的方法,
select max(value) from (select value from customer) as a left join (select max(value) as c from customer) as b on b.c=a.value where b.c is null
一般來說,以上兩種方法的執行速度 表連接的方法好些,但也應該進行測試,我認為,採用兩次查詢的方法比較合適,select max(value) from customer 得到最大值,
select max(value) from customer where value <6003
得到次大值。
5. 在sql語句多表連接中,in、exists、join哪個效率更高一點
EXISTS、IN與JOIN,都可以用來實現形如「查詢A表中在(或不在)B表中的記錄」的查詢邏輯。
在查詢的兩個表大小相當的情況下,3種查詢方式的執行時間通常是:
EXISTS <= IN <= JOIN
NOT EXISTS <= NOT IN <= LEFT JOIN
只有當表中欄位允許NULL時,NOT IN的方式最慢:
NOT EXISTS <= LEFT JOIN <= NOT IN
但是如果兩個表中一個較小,一個較大,則子查詢表大的用exists,子查詢表小的用in,因為in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。而無論那個表大,用not exists都比not in要快。這是因為如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。
IN的好處是邏輯直觀簡單(通常是獨立子查詢);缺點是只能判斷單欄位,並且當NOT IN時效率較低,而且NULL會導致不想要的結果。
EXISTS的好處是效率高,可以判斷單欄位和組合欄位,並不受NULL的影響;缺點是邏輯稍微復雜(通常是相關子查詢)。
JOIN用在這種場合,往往是吃力不討好。JOIN的用途是聯接兩個表,而不是判斷一個表的記錄是否在另一個表。
6. SQL中IN和EXISTS用法的區別
1.exist,not exist一般都是與子查詢一起使用. In可以與子查詢一起使用,也可以直接in (a,b.....)
2.exist會針對子查詢的表使用索引. not exist會對主子查詢都會使用索引. in與子查詢一起使用的時候,只能針對主查詢使用索引. not in則不會使用任何索引. 注意,一直以來認為exists比in效率高的說法是不準確的。
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。
如果查詢的兩個表大小相當,那麼用in和exists差別不大。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。
3.exist與in都可以實現一個目的.二者都可以用來過濾數據.
7. mssql2000中select in要用什麼索引來優化怎樣排序
1:使用select in 的話不會使用任何索引,全表掃描,所以數據量大的話較慢
2:in裡面的數據轉換為表變數或者臨時表的話,可以使用排序
3:如果是使用in的話,2008不會比2000快到哪裡,都是全表掃描
8. sql語句執行效率低,有上千萬條數據,耗時3分鍾
not in內外表都進行全表掃描,沒有用到索引,所以很慢not extsts 的子查詢能用到表上的索引。 改成:
select convert(varchar(10),scanTime,20) as 'DList' from T_SCAN
where not extsts
(
select 1 from T_Scan_image ts,T_SCAN t
where ts.scanTime = t.scanTime
)
group by convert (varchar(10),scanTime,20)
9. 查詢 連續N條符合條件的數據該怎麼寫sql
首先在ID上創建聚集索引是必須的。
如果ID是連續的,樓上的的用id來限定語句范圍是很快的。
如果id不是連續的,樓主的語句使用了not in,一般這樣效率是很低的。
可以把語句改成
select top M *
from table
where id> (select max(id) from (select top N id from table order by id) a)
order by id
這樣可以一定程度上提高一些性能。
比如我的表中有300多萬條記錄,使用樓主的語句執行時間需要9秒多,而用我的語句3秒多。