仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 759|回复: 6
打印 上一主题 下一主题

[学习教程] MYSQL网页设计SELECT 赋值与ORDER BY抵触的成绩

[复制链接]
第二个灵魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:19:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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在这一点上还做得很不够。
乐观 该用户已被删除
沙发
发表于 2015-1-19 05:53:11 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
蒙在股里 该用户已被删除
板凳
发表于 2015-1-24 07:48:15 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
变相怪杰 该用户已被删除
地板
发表于 2015-2-7 00:34:31 | 只看该作者
比如日志传送、比如集群。。。
第二个灵魂 该用户已被删除
5#
 楼主| 发表于 2015-3-6 13:19:47 | 只看该作者
也可谈一下你是怎么优化存储过程的?
若相依 该用户已被删除
6#
发表于 2015-3-13 01:09:30 | 只看该作者
连做梦都在想页面结构是怎么样的,绝非虚言
精灵巫婆 该用户已被删除
7#
发表于 2015-3-20 09:10:56 | 只看该作者
varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 07:05

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表