如何对于几百行SQL语句进行优化?
1.最近在开发中遇到的一些关于几百行SQL语句做查询的问题,需要如何的解决优化SQL这确实是个问题,对于当下的ORM 框架 EF 以及其他的一些的开源的框架例如Drapper ,以及Sqlite-Sugar 等等,对于查询的速度以及性能确实还不错,但是对于几百条的SQL语句那么可能就不行了这些轻量级的框架扛不住。当在写SQL语句需要注意的规则都无法提高速率的时候,个人认为还是需要传统的ADO.NET 参数化的SQL来进行解决问题。
下面是我最近开发当中遇到的一些复杂的SQL的语句如何处理以及优化查询我还在找确切的办法来进行解决。还在进行中,当然对于数据库确实我进行一定的处理,还是有一定的效果的。下面就进入正题吧!
2.花了2天时间写的SQL查询月结算历史的数据
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.如果此时的方法不行那么创建分区,以及建立临时表倒是一个不错的选择。
7.尽量的避免表与表之间过多的交差,此时宁愿数据库中的表格的字段冗余一些,也不要太多的交差,JOIN ,LEFT JOIN 真的影响查询的效率。
8.通过上面描述的方法,优化后数据库的表的结构以及数据库几百行的SQL语句查询的效率确实变快了。只不过折磨多的SQL语句只能通过
创建存储过程了。然后在应用ADO.NET 参数化SQL 进行访问了。
9.如果您有好的方法可以随时的交流,毕竟我对于数据库方面的经验还不足。
以上内容,全部都是原创,如需转载,请标明!谢谢!