第二个灵魂 发表于 2015-1-16 22:19:30

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部分,有乐趣的读者在本人的电脑上测试的时分,能够往懂得其他部分的信息)
StmtTextStepDECLARE@strnvarchar(4000)SET@str=N我不是一个坏人,也不是渣滓 SELECT@str=REPLACE(@str,value,N<u>+value+N</u>)FROM@TWHERECHARINDEX(value,@str)>04|--ComputeScalar(DEFINE:(=replace([@str],@T.,<u>+@T.+</u>)))3|--Filter(WHERE:(charindex(@T.,[@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:(DESC))4|--ComputeScalar(DEFINE:(=replace([@str],@T.,<u>+@T.+</u>),=charindex(@T.,[@str],NULL)))3|--Filter(WHERE:(charindex(@T.,[@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

比如日志传送、比如集群。。。

第二个灵魂 发表于 2015-3-6 13:19:47

也可谈一下你是怎么优化存储过程的?

若相依 发表于 2015-3-13 01:09:30

连做梦都在想页面结构是怎么样的,绝非虚言

精灵巫婆 发表于 2015-3-20 09:10:56

varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
页: [1]
查看完整版本: MYSQL网页设计SELECT 赋值与ORDER BY抵触的成绩