問題: 兩張表 數據都非常多 A表中A1欄位 需要關聯B表主鍵 查詢 A1 欄位 存儲多個B表主鍵 格式為: 格式1:b1,b2,b3 格式2:b4 格式3:b5,b6 逗號分隔的占少數 這樣就導致在做關聯查詢時,必須使用 like '%...%', charindex ,又或者replace(A1 ...
問題:
兩張表 數據都非常多
A表中A1欄位 需要關聯B表主鍵 查詢
A1 欄位 存儲多個B表主鍵
格式為:
格式1:b1,b2,b3
格式2:b4
格式3:b5,b6
逗號分隔的占少數
這樣就導致在做關聯查詢時,必須使用 like '%...%', charindex ,又或者replace(A1,b1,'') <> A1 等手段,而在SqlServer中使用這些方法來查詢,會觸發全表檢索,導致欄位對應的索引失效,效率極低;
解決方案:
前提:在逗號分隔的數據 與 直接關聯的數據量有差異的情況下,如 總共100條數據,其中99 條都是A1 直接存儲B表主鍵,有一條存儲了多個B表主鍵,並用逗號分隔
那麼可以 採用分開查詢,單個存儲於多個存儲值 的記錄分開查詢結果用 union 關鍵字做合併 如:
select AA.* from A AA
where exists(
select A.pk from A,B where A.A1 like '%,%' and charindex(B.pk,A.A1) > 0 and AA.pk = A.pk
union all
select A.pk from A,B where A.A1 =B.pk and AA.pk = A.pk
)
其實就是根據數據量大小 將 需要使用全表檢索的數據分開,而不影響其他不需要全表檢索的數據查詢速度,從而解決查詢卡頓的問題