日期:2014-05-17  浏览次数:20758 次

这个表如何优化减少逻辑读取数?

CREATE TABLE [dbo].[ce_article_table](
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](105) COLLATE Chinese_PRC_CI_AS NULL,
[browseurl] [nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL,
[channel] [nvarchar](30) COLLATE Chinese_PRC_CI_AS NULL,
[flag] [nvarchar](300) COLLATE Chinese_PRC_CI_AS NULL,
[addtime] [datetime] NULL CONSTRAINT [DF_ce_newstable_addtime]  DEFAULT (getdate()),
[click] [int] NULL CONSTRAINT [DF_ce_newstable_click]  DEFAULT ((0)),
[comment] [int] NULL CONSTRAINT [DF_ce_article_table_comment]  DEFAULT ((0)),
[keywords] [nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL,
[description] [nvarchar](205) COLLATE Chinese_PRC_CI_AS NULL,
[ischeck] [tinyint] NULL CONSTRAINT [DF_ce_newstable_ischeck]  DEFAULT ((0)),
[imageurl] [nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL,
[admin_id] [int] NULL CONSTRAINT [DF_ce_article_table_adminid]  DEFAULT ((0)),
 CONSTRAINT [PK_article_ID] PRIMARY KEY CLUSTERED 
(
[id] DESC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 100) ON [PRIMARY]
) ON [PRIMARY]


表里面的数据有 30万条左右,如果条件
charindex(',1,',','+channel+',')>0 有数据,读取会很快,如果没有数据非常慢。求指教!索引如何优化?


------最佳解决方案--------------------
字段用函数是用不到索引的,建了也没用。
------其他解决方案--------------------
引用:
引用:用字符串拼接的方式存储,确实不容易优化。
用SQL SERVER 2012的列存储索引可以减少逻辑读取次数。
我是需要存储一个无限级分类,所以无法使用 int 的
channel 是 nvarchar的

不知道有没有好的思想。


如果方便的话,是否可以采用子节点和父节点的方式来存储。如果是无限级存储分类的话,采用单节点会有所限制,并且既然是无限极的,那30个字符的长度能够么?
------其他解决方案--------------------
用字符串拼接的方式存储,确实不容易优化。
用SQL SERVER 2012的列存储索引可以减少逻辑读取次数。
------其他解决方案--------------------
引用:
用字符串拼接的方式存储,确实不容易优化。
用SQL SERVER 2012的列存储索引可以减少逻辑读取次数。

我是需要存储一个无限级分类,所以无法使用 int 的
channel 是 nvarchar的

不知道有没有好的思想。
------其他解决方案--------------------
一般的读都是逻辑读,而减少逻辑读的其中一件最有效的方法就是走索引,当然如果你的都是表扫描,那索引没有比有更好。