|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL采用双重授权(DualLicensed),它们是GPL和MySQLAB制定的商业许可协议。 成绩形貌:
利用SELECT语句,轮询表中的数据,而且处置变量数据时,假如有ORDERBY语句,则得不到想要的了局,但往失落ORDERBY,了局一般。
详细的成绩体现参考上面的成绩重古代码
成绩重古代码
--测试数据
DECLARE@TTABLE(idint,valuenvarchar(16))
INSERTINTO@TSELECT
1,N坏人UNIONALLSELECT
2,N好人UNIONALLSELECT
3,N用饭UNIONALLSELECT
4,N渣滓
--赋值处置
DECLARE@strnvarchar(4000)
SET@str=N我不是一个坏人,也不是渣滓
SELECT@str=REPLACE(@str,value,N<u>+value+N</u>)
FROM@T
WHERECHARINDEX(value,@str)>0
--ORDERBYCHARINDEX(value,@str)DESC
SELECT@str
/*--了局(当赋值处置语句正文失落ORDERBY时)
我不是一个<u>坏人</u>,也不是<u>渣滓</u>
--*/
/*--了局(当赋值处置语句加上ORDERBY时)
我不是一个<u>坏人</u>,也不是渣滓
--*/
成绩剖析:
两个处置语句的了局分歧,经由过程检察它们的实行企图应当能够看出缘故原由地点,为此,经由过程
SETSHOWPLAN_ALLON
输入了两种实行语句的实行企图(仅StmtText部分,有乐趣的读者在本人的电脑上测试的时分,能够往懂得其他部分的信息)
StmtTextStepDECLARE@strnvarchar(4000)SET@str=N我不是一个坏人,也不是渣滓 SELECT@str=REPLACE(@str,value,N<u>+value+N</u>)FROM@TWHERECHARINDEX(value,@str)>04|--ComputeScalar(DEFINE:([Expr1002]=replace([@str],@T.[value],<u>+@T.[value]+</u>)))3|--Filter(WHERE:(charindex(@T.[value],[@str],NULL)>0))2|--TableScan(OBJECT:(@T))1DECLARE@strnvarchar(4000)SET@str=N我不是一个坏人,也不是渣滓 SELECT@str=REPLACE(@str,value,N<u>+value+N</u>)FROM@TWHERECHARINDEX(value,@str)>0ORDERBYCHARINDEX(value,@str)DESC5|--Sort(ORDERBY:([Expr1003]DESC))4|--ComputeScalar(DEFINE:([Expr1002]=replace([@str],@T.[value],<u>+@T.[value]+</u>),[Expr1003]=charindex(@T.[value],[@str],NULL)))3|--Filter(WHERE:(charindex(@T.[value],[@str],NULL)>0))2|--TableScan(OBJECT:(@T))1
从下面的列表能够看出,两种处置的最年夜差别,在于赋值前,是不是有ORDERBY子句,从一样平常的了解上,大概会以为是不是排序其实不主要,但换个角度来看成绩,就对照简单了解为何有ORDERBY子句后得不到我们想要的了局了:
当有ORDERBY子句时,关于SELECT@str=这类赋值处置,SQLServer以为赋值处置一定只会保存最初一笔记录的处置了局,而ORDERBY子句断定了数据按次,也就晓得最初一笔记录是谁人,因而只会处置ORDERBY的最初一笔记录。(读者能够自行往测试一下,调剂ORDERBY按次,看看了局是不是与我的推论符合)
当没有ORDERBY子句时,由于没法断定数据按次,以是SQLServer必需扫描满意前提的每条数据来失掉了局,如许每扫描一笔记录城市处置一次,以是了局是我们所预知的
成绩办理办法:
修正处置语句,使查询优化器利用与我们必要了局分歧的实行办法,能够办理这个成绩。
关于示例中的处置语句,能够调剂以下:
DECLARE@strnvarchar(4000)
SET@str=N我不是一个坏人,也不是渣滓
SELECT@str=REPLACE(@str,value,N<u>+value+N</u>)
FROM(
SELECTTOP100PERCENT
value
FROM@T
WHERECHARINDEX(value,@str)>0
ORDERBYCHARINDEX(value,@str)DESC
)A
SELECT@str
增补:
此成绩的结论只是笔者关于查询剖析的一个推论,并没有响应的官方文档能够证实,以是接待人人宣布本人的意见
无疑希望员工得到系统、有深度的培训,显然MySQL在这一点上还做得很不够。 |
|