我在SQL Server 2008中定义了以下索引视图(您可以从gist下载工作架构以进行测试): CREATE VIEW dbo.balances WITH SCHEMABINDING AS SELECT user_id , currency_id , SUM(transaction_amount) AS balance_amount , COUNT_BIG(*) AS transaction_count FROM dbo.transactions GROUP BY user_id , currency_id ; GO CREATE UNIQUE CLUSTERED INDEX UQ_balances_user_id_currency_id ON dbo.balances ( user_id , currency_id ); GO user_id,currency_id和transaction_amount都定义为中的NOT NULL列dbo.transactions。但是,当我看着Management Studio中的对象资源管理器,它标志着这两个视图定义balance_amount,并transaction_count为NULL在视图-able列。 我看了几个讨论,其中最相关的讨论表明一些功能改组可以帮助SQL Server识别视图列始终为NOT NULL。不过,在我的情况下,这样的改组是不可能的,因为在索引视图中不允许使用聚合函数的表达式(例如ISNULL()over SUM())。 …
我有一个MySQL用户,我希望它仅查看所需的视图,而不查看数据库中的任何其他表。我仅在某些视图上授予此用户权限,如下所示: GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%' 如果我show grants;发表声明,我只能按预期看到此权限。但是,我希望该用户仅查询视图,而不查询与这些视图相关的表,但是我找不到解决方法。似乎是如果我希望用户在视图上进行选择,则还必须为表授予选择权,否则我错了吗? 如果我select在其余表中拒绝该语句,并且在命令行中尝试进行选择,则会得到以下信息: SELECT * FROM myDatabase.fordibenForYouTable; ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable' 那确实是我想要的,但是如果选择视图数据,我也会被拒绝。 有没有一种方法可以让用户只使用视图而不是表?
我试图了解从视图中选择数据的性能影响,其中视图中的列之一是原始表中其他数据的功能。 不管计算的列是否在所选列的列表中,都可以执行计算吗? 如果我有一个表并且视图这样声明 CREATE TABLE price_data ( ticker text, -- Ticker of the stock ddate date, -- Date for this price price float8, -- Closing price on this date factor float8 -- Factor to convert this price to USD ); CREATE VIEW prices AS SELECT ticker, ddate, price, factor, price …
我有一个大表(上千万个记录),出于性能原因,我们将其拆分为活动表和存档表,使用直接字段映射,并每晚运行一个存档过程。 在代码的几个地方,我们需要运行结合了活动表和归档表的查询,这些查询几乎总是被一个或多个字段过滤(我们显然已经在两个表中都添加了索引)。为了方便起见,有如下视图是有意义的: create view vMyTable_Combined as select * from MyTable_Active union all select * from MyTable_Archive 但是如果我运行类似的查询 select * from vMyTable_Combined where IndexedField = @val 在使用过滤之前,它将对Active和Store中的所有内容进行合并@val,这会降低性能。 是否有任何巧妙的方法可以使并集的两个子查询@val在创建并集之前查看每个过滤器? 或者,也许您会建议采用其他方法来实现我的目标,即一种简单有效的方法来获取由索引字段过滤的联合记录集? 编辑:这是执行计划(您将在这里看到实际的表名): 奇怪的是,活动表实际上使用了正确的索引(加上RID查找?),但是归档表正在执行表扫描!