1.最近在開發中遇到的一些關於幾百行SQL語句作查詢的問題,須要如何的解決優化SQL這確實是個問題,對於當下的ORM 框架 EF 以及其餘的一些的開源的框架例如Drapper ,以及Sqlite-Sugar 等等,對於查詢的速度以及性能確實還不錯,可是對於幾百條的SQL語句那麼可能就不行了這些輕量級的框架扛不住。當在寫SQL語句須要注意的規則都沒法提升速率的時候,我的認爲仍是須要傳統的ADO.NET 參數化的SQL來進行解決問題。web
下面是我最近開發當中遇到的一些複雜的SQL的語句如何處理以及優化查詢我還在找確切的辦法來進行解決。還在進行中,固然對於數據庫確實我進行必定的處理,仍是有必定的效果的。下面就進入正題吧!數據庫
2.花了2天時間寫的SQL查詢月結算曆史的數據app
1 select
2 sum(case when indentdate >= '2015-11-28 00:00:00' and
3 indentdate <= '2015-11-28 23:59:59' and
4 indenttype = 0 and indent_step = '00' then 1 else 0 end) totalcount1, --本月總數量
5 convert(int,sum(case when indentdate >= '2015-11-28 00:00:00' and
6 indentdate <= '2015-11-28 23:59:59' and
7 indenttype = 0 and indent_step = '00' then
8 t1.totalpay else 0 end)) totalpay1 ,---本月總金額
9 sum(case when indentdate >='2015-11-28 00:00:00' and
10 t1.indentdate <= '2015-11-28 23:59:59' and
11 t2.modifieddate >= '2015-11-28 00:00:00' and
12 t2.modifieddate <= '2015-11-28 23:59:59' and
13 t1.indentstatus='020' and indenttype = 0 and indent_step = '00' then
14 1 else 0 end)
15 + sum(case when indentdate >='2015-11-28 00:00:00' and
16 indentdate <= '2015-11-28 23:59:59' and t1.indentstatus='050'
17 and financedate >= '2015-11-28 00:00:00' and
18 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
19 indent_step = '00' then
20 1 else 0 end)+sum(case when indentdate >='2015-11-28 00:00:00' and indentdate <= '2015-11-28 23:59:59' and financedate>='2015-11-28 00:00:00' and financedate<='2015-11-28 23:59:59' and indentstatus IN ('111','112') and indenttype=1 then 1 else 0 end) totalcount2,--本月失效數量
21 convert(int,sum(case when indentdate >='2015-11-28 00:00:00' and
22 t1.indentdate <= '2015-11-28 23:59:59' and t2.modifieddate >= '2015-11-28 00:00:00' and
23 t2.modifieddate <= '2015-11-28 23:59:59' and t1.indentstatus='020'
24 and indenttype = 0 and
25 indent_step = '00' then
26 t1.totalpay else 0 end)
27 + sum(case when indentdate >='2015-11-28 00:00:00' and
28 indentdate <= '2015-11-28 23:59:59' and t1.indentstatus='050'
29 and financedate >= '2015-11-28 00:00:00' and
30 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
31 indent_step = '00' then
32 t1.totalpay else 0 end))-sum(case when indentdate >='2015-11-28 00:00:00' and indentdate <= '2015-11-28 23:59:59' and financedate>='2015-11-28 00:00:00' and t1.financedate<='2015-11-28 23:59:59' and t1.indentstatus IN ('111','112') and indenttype=1 then t1.totalpay else 0 end ) totalpay2, ---本月失效金額
33
34 sum(case when t1.indentdate<= '2015-11-28 00:00:00' and t2.modifieddate >= '2015-11-28 00:00:00' and
35 t2.modifieddate <= '2015-11-28 23:59:59' and t1.indentstatus='020'
36 and indenttype = 0 and
37 indent_step = '00' then
38 1 else 0 end)
39 + sum(case when
40 indentdate <= '2015-11-28 00:00:00' and t1.indentstatus='050'
41 and financedate >= '2015-11-28 00:00:00' and
42 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
43 indent_step = '00' then
44 1
45 else
46 0
47 --------以上
48 end)+sum(case when indentdate <= '2015-11-28 00:00:00' and financedate>='2015-11-28 00:00:00' and financedate<='2015-11-28 23:59:59' and indentstatus IN ('111','112') and indenttype=1 then 1 else 0 end) totalcount3 ,---歷史失效數量
49 convert(int,sum(case
50 when t1.indentdate<= '2015-11-28 00:00:00' and t2.modifieddate >= '2015-11-28 00:00:00' and
51 t2.modifieddate <= '2015-11-28 23:59:59' and t1.indentstatus='020'
52 and indenttype = 0 and
53 indent_step = '00' then
54 t1.totalpay
55 else
56 0
57 end)+
58 sum(case
59 when
60 indentdate <= '2015-11-28 00:00:00' and t1.indentstatus='050'
61 and financedate >= '2015-11-28 00:00:00' and
62 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
63 indent_step = '00' then
64 t1.totalpay
65 else
66 0
67 end) -sum(case when indentdate <= '2015-11-28 00:00:00' and financedate>='2015-11-28 00:00:00' and financedate<='2015-11-28 23:59:59' and t1.indentstatus IN ('111','112') and indenttype=1 then t1.totalpay else 0 end )) totalpay3, --歷史失效金額
68 sum(case
69 when indentdate >= '2015-11-28 00:00:00' and
70 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
71 indent_step = '00' then
72 1
73 else
74 0
75 end) -
76 (sum(case
77 when indentdate >= '2015-11-28 00:00:00' and indentdate <= '2015-11-28 23:59:59'and t2.modifieddate>= '2015-11-28 00:00:00' and
78 t2.modifieddate <= '2015-11-28 23:59:59'
79 and t1.indentstatus='020' and indenttype = 0 and
80 indent_step = '00' then
81 1
82 else
83 0
84 end)
85 +sum(case
86 when
87 indentdate >= '2015-11-28 00:00:00' and indentdate <= '2015-11-28 23:59:59' and
88 t1.indentstatus='050' and financedate >= '2015-11-28 00:00:00' and
89 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
90 indent_step = '00' then
91 1
92 else
93 0
94 end)+sum(case
95 when
96 indentdate >= '2015-11-28 00:00:00' and indentdate <= '2015-11-28 23:59:59' and t1.indentstatus IN ('111','112') and financedate >= '2015-11-28 00:00:00' and
97 financedate <= '2015-11-28 23:59:59' and indenttype = 1 then
98 1
99 else
100 0
101 end)) totalcount4,---本月應結算訂單數=本月總訂單數-本月失效訂單數
102 convert(int,sum(case
103 when indentdate >= '2015-11-28 00:00:00' and
104 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
105 indent_step = '00' then
106 t1.totalpay
107 else
108 0
109 end) -
110 sum(case
111 when indentdate >= '2015-11-28 00:00:00' and indentdate <= '2015-11-28 23:59:59'and t2.modifieddate>= '2015-11-28 00:00:00' and
112 t2.modifieddate <= '2015-11-28 23:59:59'
113 and t1.indentstatus='020' and indenttype = 0 and
114 indent_step = '00' then
115 t1.totalpay
116 else
117 0
118 end)
119 -sum(case
120 when
121 indentdate >= '2015-11-28 00:00:00' and indentdate <= '2015-11-28 23:59:59' and
122 t1.indentstatus='050' and financedate >= '2015-11-28 00:00:00' and
123 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
124 indent_step = '00' then
125 t1.totalpay
126 else
127 0
128 end)+sum(case
129 when
130 indentdate >= '2015-11-28 00:00:00' and indentdate <= '2015-11-28 23:59:59' and t1.indentstatus IN ('111','112') and financedate >= '2015-11-28 00:00:00' and
131 financedate <= '2015-11-28 23:59:59' and indenttype = 1 then
132 t1.totalpay
133 else
134 0
135 end)) totalpay4, --應結算金額
136
137 sum(case
138 when indentdate >= '2015-11-28 00:00:00' and
139 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
140 indent_step = '00' and status=2 then
141 1
142 else
143 0
144 end) -
145 sum(case
146 when t2.modifieddate>= '2015-11-28 00:00:00' and
147 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
148 curstep_id = '2A9B4B' and status=2 and indenttype = 0 and
149 indent_step = '00' then
150 1
151 else
152 0
153 end)
154 -sum(case
155 when
156 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
157 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
158 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 0 and
159 indent_step = '00' then
160 1
161 else
162 0
163 end)-sum(case
164 when
165 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
166 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 1 then
167 1
168 else
169 0
170 end) totalcount5,
171
172 convert(int,sum(case
173 when indentdate >= '2015-11-28 00:00:00' and
174 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
175 indent_step = '00' and status=2 then
176 cust_partner_value
177 else
178 0
179 end) -
180 sum(case
181 when t2.modifieddate>= '2015-11-28 00:00:00' and
182 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
183 curstep_id = '2A9B4B' and status=2 and indenttype = 0 and
184 indent_step = '00' then
185 cust_partner_value
186 else
187 0
188 end)
189 -sum(case
190 when
191 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
192 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
193 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 0 and
194 indent_step = '00' then
195 cust_partner_value
196 else
197 0
198 end)-sum(case
199 when
200 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
201 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 1 then
202 cust_partner_value
203 else
204 0
205 end)) totalpay5,
206 sum(case
207 when indentdate >= '2015-11-28 00:00:00' and
208 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
209 indent_step = '00' then
210 1
211 else
212 0
213 end) -
214 sum(case
215 when t2.modifieddate>= '2015-11-28 00:00:00' and
216 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
217 curstep_id = '2A9B4B' and indenttype = 0 and
218 indent_step = '00' then
219 1
220 else
221 0
222 end)
223 -sum(case
224 when
225 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
226 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
227 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
228 indent_step = '00' then
229 1
230 else
231 0
232 end)-sum(case
233 when
234 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
235 financedate <= '2015-11-28 23:59:59' and indenttype = 1 then
236 1
237 else
238 0
239 end) - (sum(case
240 when indentdate >= '2015-11-28 00:00:00' and
241 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
242 indent_step = '00' and status=2 then
243 1
244 else
245 0
246 end) -
247 sum(case
248 when t2.modifieddate>= '2015-11-28 00:00:00' and
249 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
250 curstep_id = '2A9B4B' and status=2 and indenttype = 0 and
251 indent_step = '00' then
252 1
253 else
254 0
255 end)
256 -sum(case
257 when
258 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
259 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
260 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 0 and
261 indent_step = '00' then
262 1
263 else
264 0
265 end)-sum(case
266 when
267 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
268 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 1 then
269 1
270 else
271 0
272 end)) totalcount6,
273 convert(int,sum(case
274 when indentdate >= '2015-11-28 00:00:00' and
275 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
276 indent_step = '00' then
277 cust_partner_value
278 else
279 0
280 end) -
281 sum(case
282 when t2.modifieddate>= '2015-11-28 00:00:00' and
283 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
284 curstep_id = '2A9B4B' and indenttype = 0 and
285 indent_step = '00' then
286 cust_partner_value
287 else
288 0
289 end)
290 -sum(case
291 when
292 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
293 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
294 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
295 indent_step = '00' then
296 cust_partner_value
297 else
298 0
299 end)-sum(case
300 when
301 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
302 financedate <= '2015-11-28 23:59:59' and indenttype = 1 then
303 cust_partner_value
304 else
305 0
306 end)-(sum(case
307 when indentdate >= '2015-11-28 00:00:00' and
308 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
309 indent_step = '00' and status=2 then
310 cust_partner_value
311 else
312 0
313 end) -
314 sum(case
315 when t2.modifieddate>= '2015-11-28 00:00:00' and
316 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
317 curstep_id = '2A9B4B' and status=2 and indenttype = 0 and
318 indent_step = '00' then
319 cust_partner_value
320 else
321 0
322 end)
323 -sum(case
324 when
325 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
326 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
327 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 0 and
328 indent_step = '00' then
329 cust_partner_value
330 else
331 0
332 end)-sum(case
333 when
334 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
335 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 1 then
336 cust_partner_value
337 else
338 0
339 end))) totalpay6
340 from tabcindent t1 left join workorder2 t2 on t1.relation_id=t2.workorder_guid
341 --left join customer t4 on t1.customer_guid = t4.customer_guid
342 left join tvmedia t3 on t1.cust_media_id=t3.idkey --and t1.cust_partner_guid=t3.partner_guid
343 where t1.web_flag=1 and cust_media_id in ('67B3CB84-81F4-87AA-01EB-857EA1474223','CFC5A634-2375-1552-59B4-9A1263DCFCA4','673473E7-8079-68ED-3CB6-9A2256E34A67','E6192562-FCF8-415C-0AC4-9A22A6200706','542CF17F-374E-627D-389B-9A22F09BC4D3','A270E30B-368B-F962-F44F-AA0D76E8865E')
2.經過SQL語句進行查詢當天結算曆史的記錄框架
1 select
2 convert(int,sum(case when indentdate >= '2015-11-28 00:00:00' and
3 indentdate <= '2015-11-28 23:59:59' and
4 indenttype = 0 and indent_step = '00' then
5 t1.totalpay else 0 end)) pay1 ,
6 convert(int,sum(case when t1.indentdate>= '2015-11-28 00:00:00' and
7 t1.indentdate <= '2015-11-28 23:59:59' and t2.modifieddate >= '2015-11-28 00:00:00' and
8 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
9 curstep_id = '2A9B4B' and indenttype = 0 and
10 indent_step = '00' then
11 t1.totalpay else 0 end)
12 + sum(case when t1.indentdate>= '2015-11-28 00:00:00' and
13 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
14 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
15 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
16 indent_step = '00' then
17 t1.totalpay else 0 end)) +
18 convert(int,sum(case
19 when t1.indentdate<= '2015-11-28 00:00:00' and t2.modifieddate >= '2015-11-28 00:00:00' and
20 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
21 curstep_id = '2A9B4B' and indenttype = 0 and
22 indent_step = '00' then
23 t1.totalpay
24 else
25 0
26 end)+
27 sum(case
28 when
29 indentdate <= '2015-11-28 00:00:00' and workorderstatus = 'FAILED' and
30 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
31 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
32 indent_step = '00' then
33 t1.totalpay
34 else
35 0
36 end)-sum(case
37 when
38 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
39 financedate <= '2015-11-28 23:59:59' and indenttype = 1 then
40 t1.totalpay
41 else
42 0
43 end)) pay2, --歷史失效金額
44 convert(int,sum(case
45 when indentdate >= '2015-11-28 00:00:00' and
46 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
47 indent_step = '00' then
48 cust_partner_value
49 else
50 0
51 end) -
52 sum(case
53 when t2.modifieddate>= '2015-11-28 00:00:00' and
54 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
55 curstep_id = '2A9B4B' and indenttype = 0 and
56 indent_step = '00' then
57 cust_partner_value
58 else
59 0
60 end)
61 -sum(case
62 when
63 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
64 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
65 financedate <= '2015-11-28 23:59:59' and indenttype = 0 and
66 indent_step = '00' then
67 cust_partner_value
68 else
69 0
70 end)-sum(case
71 when
72 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
73 financedate <= '2015-11-28 23:59:59' and indenttype = 1 then
74 cust_partner_value
75 else
76 0
77 end)-(sum(case
78 when indentdate >= '2015-11-28 00:00:00' and
79 indentdate <= '2015-11-28 23:59:59' and indenttype = 0 and
80 indent_step = '00' and status=2 then
81 cust_partner_value
82 else
83 0
84 end) -
85 sum(case
86 when t2.modifieddate>= '2015-11-28 00:00:00' and
87 t2.modifieddate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
88 curstep_id = '2A9B4B' and status=2 and indenttype = 0 and
89 indent_step = '00' then
90 cust_partner_value
91 else
92 0
93 end)
94 -sum(case
95 when
96 indentdate <= '2015-11-28 23:59:59' and workorderstatus = 'FAILED' and
97 curstep_id = '5CB9E0' and financedate >= '2015-11-28 00:00:00' and
98 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 0 and
99 indent_step = '00' then
100 cust_partner_value
101 else
102 0
103 end)-sum(case
104 when
105 workorderstatus = 'CLOSE' and financedate >= '2015-11-28 00:00:00' and
106 financedate <= '2015-11-28 23:59:59' and status=2 and indenttype = 1 then
107 cust_partner_value
108 else
109 0
110 end))) pay4
111 from tabcindent t1 left join workorder2 t2 on t1.relation_id=t2.workorder_guid
112 --left join customer t4 on t1.customer_guid = t4.customer_guid
113 left join tvmedia t3 on t1.cust_media_id=t3.idkey --and t1.cust_partner_guid=t3.partner_guid
114 where t1.web_flag=1 and cust_media_id in ('CFC5A634-2375-1552-59B4-9A1263DCFCA4')
3.對於這樣的複雜的SQL進行大數據量的查詢如何優化SQL確實是一個問題,可是我一般是這樣作的,雖然沒有辦法解決根本問題可是,效果仍是有的。性能
4.一般我會創建須要的索引,來增長查詢的速度。儘可能的避免內嵌的查詢由於這真的是影響效率。大數據
5.那麼當這些工做都作完後優化的做用不大了,那麼我一般會在數據庫上面進行動手腳,創建數據庫集羣進行數據庫的讀寫的分離,而後進行創建數據庫快照進行數據庫的數據的映射。優化
6.若是此時的方法不行那麼建立分區,以及創建臨時表卻是一個不錯的選擇。ui
7.儘可能的避免表與表之間過多的交差,此時寧願數據庫中的表格的字段冗餘一些,也不要太多的交差,JOIN ,LEFT JOIN 真的影響查詢的效率。spa
8.經過上面描述的方法,優化後數據庫的表的結構以及數據庫幾百行的SQL語句查詢的效率確實變快了。只不過折磨多的SQL語句只能經過code
建立存儲過程了。而後在應用ADO.NET 參數化SQL 進行訪問了。
9.若是您有好的方法能夠隨時的交流,畢竟我對於數據庫方面的經驗還不足。
以上內容,所有都是原創,如需轉載,請標明!謝謝!