SQL2008一个字段的查询问题,非常奇怪。

iou3344 2016-03-03 10:29:26
数据库:SQL2008R2
字段:isnew nchar(10) (允许NULL值) 其中的数据要么是NULL , 要么是1
数据量:30万
语言:asp
sql查询语句:
sql="1=1"时,列表和分页速度都很快

而以下这三种的列表速度非常非常非常慢,直到出现超时。。。。(符合条件的数据是3万多条)
sql="1=1 and isnew='1'" (耗时58,969毫秒 查询到34435条记录 每页60个记录)
sql="1=1 and isnew=1" (耗时50,031毫秒 查询到34435条记录 每页60个记录)
sql="1=1 and isnew IS NOT NULL" (耗时61,484毫秒毫秒 查询到34435条记录 每页60个记录)

但是,更为复杂的查询语句,速度却很快。
sql="1=1 and CONTAINS(name,'"张"') and CONTAINS(sex,'"男"')"

于是我吧isnew字段也做了全文索引,按照全文索引的语句写:
sql="1=1 and CONTAINS(isnew,'1')" 结果查询结果为:暂无记录!!!!

这个isnew字段的查询为什么这么难,这么慢呢?该怎么写呢?是索引的问题吗?
...全文
164 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoppo0505 2016-03-05
  • 打赏
  • 举报
回复
引用 6 楼 iou3344 的回复:
[quote=引用 5 楼 shoppo0505 的回复:] [quote=引用 3 楼 szx1999 的回复:] LZ, 全文索引不是这么用滴…… 把全文索引全部去掉,换成普通索引。把所有CONTAINS都去掉,换成普通写法。 IsNew用bit类型。 Sex,IsNew这种区分度小的字段,不要建任何索引。
+1 源表如果比较大建议添加索引+include列[/quote] @shoppo0505 添加索引+include列 没听懂啊~ 我是初学 大哥~[/quote] 先把IsNew字段改为bit,然后给isnew添加索引,如果表格列很多,那么把其他要显示的字段include到索引中
iou3344 2016-03-04
  • 打赏
  • 举报
回复
引用 5 楼 shoppo0505 的回复:
[quote=引用 3 楼 szx1999 的回复:] LZ, 全文索引不是这么用滴…… 把全文索引全部去掉,换成普通索引。把所有CONTAINS都去掉,换成普通写法。 IsNew用bit类型。 Sex,IsNew这种区分度小的字段,不要建任何索引。
+1 源表如果比较大建议添加索引+include列[/quote] @shoppo0505 添加索引+include列 没听懂啊~ 我是初学 大哥~
等不到来世 2016-03-04
  • 打赏
  • 举报
回复
LZ, 全文索引不是这么用滴…… 把全文索引全部去掉,换成普通索引。把所有CONTAINS都去掉,换成普通写法。 IsNew用bit类型。 Sex,IsNew这种区分度小的字段,不要建任何索引。
吉普赛的歌 2016-03-04
  • 打赏
  • 举报
回复
当然, 创建bit字段的索引, 也许不会有效(根据数据分布情况而定) 但改 bit 字段, 对数据的存储空间的节省还有查询效率肯定是比你原来要好的
吉普赛的歌 2016-03-04
  • 打赏
  • 举报
回复
一个逻辑只有两种状态的字段, 为什么要用NCHAR(10)? isNew 建议改下类型: isNew BIT NOT NULL DEFAULT(0) 然后在 isNew 上创建普通索引 create index IX_表名_isNew on 表名 (isNew ASC)
--但是,更为复杂的查询语句,速度却很快。
sql="1=1 and CONTAINS(name,'"张"') and CONTAINS(sex,'"男"')"
这个, 只不过是用到了你建立好的全文索引, 所以更快。
shoppo0505 2016-03-04
  • 打赏
  • 举报
回复
引用 3 楼 szx1999 的回复:
LZ, 全文索引不是这么用滴…… 把全文索引全部去掉,换成普通索引。把所有CONTAINS都去掉,换成普通写法。 IsNew用bit类型。 Sex,IsNew这种区分度小的字段,不要建任何索引。
+1 源表如果比较大建议添加索引+include列
iou3344 2016-03-04
  • 打赏
  • 举报
回复
引用 1 楼 yenange的回复:
一个逻辑只有两种状态的字段, 为什么要用NCHAR(10)? isNew 建议改下类型: isNew BIT NOT NULL DEFAULT(0) 然后在 isNew 上创建普通索引 create index IX_表名_isNew on 表名 (isNew ASC)
--但是,更为复杂的查询语句,速度却很快。
sql="1=1 and CONTAINS(name,'"张"') and CONTAINS(sex,'"男"')"
这个, 只不过是用到了你建立好的全文索引, 所以更快。
改为bit了,然后就算在sqlserver里面执行SQL语句也要15秒,我就郁闷了,无解啊?!

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧