回答

收藏

最好怎么写?SQL查询

技术问答 技术问答 303 人阅读 | 0 人回复 | 2023-09-14

我搜索了stackoverflow,但每个人都要求优化他们已经完成的查询。
0 q" t! ~4 p- d* l" F- f+ V我想知道创建查询时应该避免的基本知识。
5 [9 Q. F5 f$ e8 F. n$ H3 h例如,SELECT * FROM鉴于sql众所周知,引擎必须进行不可见查询,才能知道应该显示哪些列,编写是众所周知的事实。
9 W2 ~! E' p$ W: A& r/ w也知道between @min_number AND @max_number比它更好,Id >= @min_number AND Id
2 \; c7 n, X, a5 s. K1 {; N有些人可以验证这些内容并列出最常见的 操作,避免操作    吗?+ K5 l! c/ g- |8 n0 u
                                                               
3 d  W  P) M8 V. P/ W) T/ R    解决方案:                                                               
8 a9 b- Q+ T6 |& C# ~- P& m# y                                                                我的列表是特定的SQL Server(我相信还有很多):: Y; Y6 v/ G- i, M- Z7 m0 r
使用可参数化where子句-这意味着在where子句中没有函数,尤其是标量UDF
+ T$ z4 ^- A6 o1 `7 O4 l当你找到与第二张表不匹配的行时,WHERE NOT EXISTS往往比其中where id为null左连接结构的选择更快。+ f' ?; s# o3 m" N" Z; D6 ]* q
相关子查询往往是逐行运行的,速度很慢。( k6 @( B7 c  A. f
调用其它视图的视图无法建立索引,而且变得非常慢,特别是如果你在大表上获得多个级别。
4 b6 |4 M1 x+ z  j+ p, l' _# g( T特别是如果有连接,请避免选择*,这将浪费服务器、数据库和网络资源。
! s$ C" O  m  P8 M通常,基于集合逻辑的性能可以更快地取代游标。如果数据以正确的方式存储,则可以避免大量的即时转换。0 g1 ~1 l+ q" k% q: M$ Q. Y
更新时,请确保添加where以免更新新值与旧值相同的行。这可能是更新1000000行和更新15行的区别。(Tsql
2 q+ y4 a, V5 }" }: V* j. p8 e9 }Update结构,如果你使用其他数据库,你可能必须找到正确的语法,但你应该能够理解这一点。& E7 p6 c* \8 l, J  w. P. p
Update tset field1 = t2.field2from table1 tjoin table2 t2 on t.tid = t2.tidWhere t.field1  t2.field2或者
; _3 P  A8 z2 O% \Update tset field1 = @variablefrom table1 tWhere t.field1  @variable检查索引。SQL Seerver外键不会自动索引。如果在连接中使用,通常需要索引。8 }, W2 @4 {4 y7 r9 `# X* b! H
如果你经常在字段上使用函数,你可能无法正确存储它(或者你应该有一个持久的计算字段,每次选择该列时都不要转换)。4 ^; a( }% @$ _/ D5 f  P4 c' ^, O
最好的选择是为您选择的数据库获得一本性能良好的调优书(最好的软件特定于数据库),并阅读编写查询的章节。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则