我从2005年开始在MySQL论坛上发帖,但没有比这更新的了.基于此,这是不可能的.但是很多都可以在3 - 4年内改变.
我正在寻找的是一种方法,在视图上有一个索引,但是查看的表仍然没有索引.索引会损害写入过程,并且会经常写入此表(直到索引将所有内容减慢到爬行的程度).但是,缺少索引会使我的查询变得非常缓慢.
如何在SQL服务器数据库中获取具有索引(即索引视图)的视图列表?
我发现运行"ALTER VIEW"非常容易,因为我正在开发并忽略了我不仅要编辑视图而且还要删除现有索引.所以我认为有一个小的实用程序查询会很好,这将使用索引列出所有视图.
有人可以用简单的英文向我解释一个视图的索引是如何工作的吗?我对表上的索引有一个相当简单的理解; 索引视图的工作方式与仅让底层表上的索引自然地完成它们的工作方式有何不同?
我有一个简单的索引视图.当我查询它时,它很慢.首先,我向您展示架构和索引.然后是简单的查询.最后一个查询计划screnie.
这就是它的样子: -
CREATE view [dbo].[PostsCleanSubjectView] with SCHEMABINDING AS
SELECT PostId, PostTypeId,
[dbo].[ToUriCleanText]([Subject]) AS CleanedSubject
FROM [dbo].[Posts]
Run Code Online (Sandbox Code Playgroud)
我的udf ToUriCleanText只是用空字符替换各种字符.例如.用''替换所有'#'字符.
然后我在这上面添加了两个索引: -
主键指数(即聚集指数)
CREATE UNIQUE CLUSTERED INDEX [PK_PostCleanSubjectView] ON
[dbo].[PostsCleanSubjectView]
(
[PostId] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
和非聚集索引
CREATE NONCLUSTERED INDEX [IX_PostCleanSubjectView_PostTypeId_Subject] ON
[dbo].[PostsCleanSubjectView]
(
[CleanedSubject] ASC,
[PostTypeId] ASC
)
WITH (PAD_INDEX …Run Code Online (Sandbox Code Playgroud) SQL小提琴:http://sqlfiddle.com/#!6/d4496/1 (为您的实验预先生成数据)
有明显的表:
CREATE TABLE Entity
(
ID int,
Classificator1ID int,
Classificator2ID int,
Classificator3ID int,
Classificator4ID int,
Classificator5ID int
);
Run Code Online (Sandbox Code Playgroud)
和观点:
CREATE VIEW dbo.EntityView (ID, Code1, Code2, Code3, Code4, Code5)
WITH SCHEMABINDING
Run Code Online (Sandbox Code Playgroud)
其中实体字段Classificator1ID..Classificator5ID已解析为分类器值Code1..Code5
并且此视图上有很多索引:
CREATE UNIQUE CLUSTERED INDEX [IXUC_EntityView$ID] ON EntityView
([ID]);
CREATE UNIQUE NONCLUSTERED INDEX [IXU_EntityView$ID$include$ALL] ON EntityView
([ID]) INCLUDE (Code1, Code2, Code3, Code4, Code5);
CREATE UNIQUE NONCLUSTERED INDEX [IXU_EntityView$ALL] ON EntityView
([ID],Code1, Code2, Code3, Code4, Code5);
CREATE UNIQUE NONCLUSTERED INDEX [IXU_EntityView$ID$Code1] ON EntityView
([ID],Code1);
CREATE UNIQUE …Run Code Online (Sandbox Code Playgroud) 服务器:MS Sql Server 2008
当我创建索引视图..然后我改变视图的架构时,索引全部被删除.
这太烦人了!
有人可以解释为什么会这样吗?起初我以为可能是因为索引所需的字段不再出现在模式中(我们只是改变它,对吗?)....但是对于索引字段在视图模式中的所有时间. ..它应该只是留下索引.
无论如何..咆哮咆哮...
只是希望有人可能对此有一些内在的了解.
它很容易检查表和索引的存储大小,您可以右键单击SSMS资源管理器上的表对象,然后将详细信息显示在一个漂亮的弹出窗口中.
但由于索引视图显示与普通视图相同,因此SSMS中没有可用的存储信息来向我显示磁盘上占用的当前大小.

有没有改变的方法来计算尺寸(比如通过系统SP或类似的方法)?
谢谢.
我想创建以下索引视图:
CREATE VIEW [Cic].[vwMarker] WITH SCHEMABINDING
AS
Select
SubId,
marker.EquipmentID,
marker.ReadTime,
marker.CdsLotOpside,
marker.CdsLotBackside,
marker.CdteLotOpside,
marker.CdTeLotBackside
From dbo.Marker
Where dbo.Marker.ReadTime >= Convert(dateTime,'10/5/2011',120)
GO
CREATE UNIQUE CLUSTERED INDEX IX_vwMarker_ReadTime_EquipmentID
ON Cic.vwMarker (ReadTime, EquipmentID);
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,我真正想要做的是在此视图中仅包含两天或更新的行,从查询视图的当前日期/时间开始.我找不到这样做的方法,因为我不能在Where谓词中使用GetDate(),因为它是非确定性的.换句话说,我想做这样的事情,但不能:
Where dbo.Marker.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120)
Run Code Online (Sandbox Code Playgroud)
有没有解决的办法?
假设我有一个非常长的表(约3500万行),名为TimeCard,只有5列(tableID,CompanyID,UserID,ProjectID,DailyHoursWorked,entryDate).这是一个非常直接的表格,记录员工每个公司每个项目每天的工作时间.
我现在需要生成一份报告,以了解员工每个项目每个月的总工时数.我希望构建一个类似于表的数据结构,而不是执行报表运行时所需的聚合,我希望按月汇总所有公司/项目/用户数据,因此当报表运行时,我可以直接查询该数据结构没有执行任何运行时聚合,因为~3500万条记录可能需要几分钟.
所以我有两种不同的方式.一个创建一个额外的物理表(CompanyID,UserID,ProjectID,MonthlyHoursWorked,Month)作为我的列,只需在TimeCard表中使用trigger来修改额外表中的值.或者我可以创建索引视图.所以我试过了两个.我首先使用以下代码尝试了索引视图:
CREATE VIEW [dbo].[vw_myView] WITH SCHEMABINDING AS
SELECT
JobID,
ProjectID,
Sum(DailyHoursWorked) AS MonthTotal,
DATEADD( Month, DATEDIFF( Month, 0, entryDate), 0 ) AS entryMonth,
CompanyID,
COUNT_BIG(*) AS Counter
FROM
dbo.TimeCard
Group By DATEADD( Month, DATEDIFF( Month, 0, entryDate ), 0 ), JobID, ProjectID, CompanyID
Go
CREATE UNIQUE CLUSTERED INDEX [IX_someIndex] ON [dbo].[vw_myView]
(
[CompanyID] ASC,
[entryMonth] ASC,
[UserID] ASC,
[ProjectID] ASC
)
Run Code Online (Sandbox Code Playgroud)
索引视图正确创建,总计约500万行.
但是,每次如果我清除SQL缓存,并运行以下查询:*select*from vw_myView where companyID = 1*,则需要将近3分钟.如果我按照上面提到的那样使用额外的表路由,清除了我的缓存,大约需要4秒钟.
我的问题是,索引查看这个特定场景的错误选择吗?特别是我有兴趣知道每次更改基础表(TimeCard)或对其运行查询时是否重新计算/重新聚合整个索引视图?
谢谢!
我正在使用 SQL Server 2000,我对开始使用索引视图犹豫不决(我有一个包含日常性能值的表,我需要用许多数学函数对它们进行评分)。
如果我创建一个索引视图(使用我的性能表),然后在我的性能表中添加一个新行,我的视图索引是立即更新,还是在视图上的第一个用户请求时更新?
indexed-view ×10
sql-server ×8
sql ×4
t-sql ×2
views ×2
indexing ×1
metadata ×1
mysql ×1
ssms ×1