SQL欄位拆分優化

2022-09-21 23:30:19 字數 1454 閱讀 3652

今天看到一條用函式處理連線的sql,是群裡某位網友的,sql語句如下:

select so_order.fdate ,

so_order.fsn

from so_order

inner join so_orderitem on charindex(so_orderitem.fid, so_order.fid) >= 1

where so_order.forderdate = '2015-09-06'

語句不算複雜,只是執行比較慢,下面是關於這sql語句的一些資訊:

--1.sql執行203條資料

--2.耗時12秒

--3.so_ordwww.cppcns.comer表的fid欄位是字串集合,

--由1-2個字串組成,用','分隔

select count(*)

from so_order

where so_order.forderdate = '2015-09-06'--24

select count(*)

from so_orderitem--414154

通過分析執行計畫,so_order和so_orderitem走巢狀迴圈是正確的,查詢的瓶頸是在so_orderitem的索引

掃瞄上。因此,我們要通過改寫sql,達到so_orderitem走索引查詢的目的。

將so_order表的fid欄位拆分成2個字段,然後union all成乙個結果集,再和so_orderitem關聯,即可讓so_orderitem錶走索引查詢。

改寫的sql如下:

;with x0

as ( select fdate ,

fsn ,

left(fid, case when charindex(',程式設計客棧', fid, 1) = 0 then 0

else charindex(',', f程式設計客棧id, 1) - 1

end) as fid

from so_order

where forderdate = '2015-09-06'

union all

select fdate ,

fsn ,

right(fid, len(fid) - charindex(',', fid, 1)) as fid

from so_order

where forderdate = '2015-09-06'

)select so_order.fdate ,

so_order.furhtolwddssn

from x0 so_order

inner join so_orderitem on so_orderitem.fid = so_order.fid

下面是sql改寫後,網友的反饋截圖

改寫後sql的執行計畫如下:

本文標題: sql欄位拆分優化

本文位址: /shujuku/mssql/130885.html

sql 陣列拆分,行轉列,字段提取

問題背景 某一列資料 格式為 需要提取出 word對應的單詞,且轉為多行.方法陣列拆分split函式 lateral view explode get json object 注意 lateral veiw explode 的列名 不能與 as 後重新命名的列名相同.po plode用途 將一行資料...

Ntext欄位拆分處理

if exists select from dbo.sysobjects where id object id n dbo p split and objectproperty id,n isprocedure 1 drop procedure dbo p split go ntext欄位拆分處理 ...

Ntext欄位拆分處理

if exists select from dbo.sysobjects where id object id n dbo p split and objectproperty id,n isprocedure 1 drop procedure dbo p split go ntext欄位拆分處理 ...