單純的select * from a,b是笛卡爾乘積。
但是如果對兩個表進行關聯:select * from a,b where a.id = b.id 意思就變了,此時就等價於:
select * from a inner join b on a.id = b.id。即就是內連線。
原來是這樣。
但是據說這種寫法並不符合規範,可能只對某些資料庫管用,如sqlserver。推薦最好不要這樣寫。最好寫成inner join的寫法
用exists替換distinct: 當提交乙個包含一對多表資訊(比如部門表和雇員表)的查詢時,避免在select子句中使用distinct. 一般可以考慮用exist替換, exists 使查詢更為迅速,因為rdbms核心模組將在子查詢的條件一旦滿足後,立刻返回結果.盡量使用exists而不是distinct,因為distinct在禁止重複行之前要排序檢索到的行。
例子:(低效):
select distinct dept_no,dept_name from dept d , emp e where d.dept_no = e.dept_no
(高效):
select dept_no,dept_name from dept d where exists ( select 『x' from emp e where e.dept_no = d.dept_no);
用exists的確可以替代distinct,不過以上方案僅適合dept_no為唯一主鍵的情況。 如果要去掉重覆記錄,需參照以下方法:
select * from emp where dept_no exists(select max(dept_no) from dept d , emp e where e.dept_no = d.dept_no group by d.dept_no)
得到重覆記錄數
select * from emp where dept_no not exists(select max(dept_no) from dept d , emp e where e.dept_no = d.dept_no group by d.dept_no)
SQL 語句優化 OR 語句優化案例
從上海來到溫州,看了前幾天監控的sql語句和資料變化,發現有一條語句的io次數很大,達到了150萬次io,而兩個表的資料也就不到20萬,為何有如此多的io次數,下面是執行語句 select ws.nodeid,wi.laststepid,wi.curstepid from workflowinfo ...
sql語句優化!
1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 a 改為 a 4.is null 或is not null操作 判斷字段是否為空 5.及 操作符 大於或小於操作符 大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況...
SQL語句優化
explain sql 反饋sql語句執行資訊 1 優化 select min id as nid,uid pmzongfen updatetime picid gg from qd mouldu qd sell limit 1 select uid pmzongfen updatetime pic...