仓酷云
标题:
MYSQL网页设计SELECT 赋值与ORDER BY抵触的成绩
[打印本页]
作者:
第二个灵魂
时间:
2015-1-16 22:19
标题:
MYSQL网页设计SELECT 赋值与ORDER BY抵触的成绩
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部分,有乐趣的读者在本人的电脑上测试的时分,能够往懂得其他部分的信息)
StmtText
Step
DECLARE@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在这一点上还做得很不够。
作者:
乐观
时间:
2015-1-19 05:53
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
作者:
蒙在股里
时间:
2015-1-24 07:48
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
作者:
变相怪杰
时间:
2015-2-7 00:34
比如日志传送、比如集群。。。
作者:
第二个灵魂
时间:
2015-3-6 13:19
也可谈一下你是怎么优化存储过程的?
作者:
若相依
时间:
2015-3-13 01:09
连做梦都在想页面结构是怎么样的,绝非虚言
作者:
精灵巫婆
时间:
2015-3-20 09:10
varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2