背景
大家好!
我最近了解到,在较新版本的Server中,查询优化器可以“扩展”SQL视图,并利用内联性能优势。这可能会对我创建哪些类型的数据库对象以及创建它们的原因和时间产生一些重大影响,这取决于什么时候实现了增强的性能,什么时候没有。
例如,当我只需要在调用查询的底部创建一个视图和一个WHERE语句时,我就不会麻烦地为一个非常大的事务表(性能非常重要)创建一个参数化内联表值函数和一个开始日期参数和一个结束日期参数。
SELECT
Column1
FROM vw_Simple
WHERE
Column1 BETWEEN @SomeStartDate AND @SomeEn
给定Sql Server 2012数据库中的以下视图:
create view vManyUnions as
select 1 as p, a from vSubQuery_1
union all
select 2 as p, a from vSubQuery_2
union all
select 3 as p, a from vSubQuery_3
...
union all
select n as p, a from vSubQuery_n
create view vSubQuery_1 as
select a fr
我需要创建一个带有一些条件的视图,然后我需要使用该视图,但对视图应用的条件与我在视图中已经应用的条件相同。这是我正在使用的一个特殊工具所必需的。
我的问题是: SQL Server优化器是否认识到同一条件应用了两次并消除了第二个条件?
示例:
create view ViewXYZ
as
select x, y, z
from tableXYZ
where x > 0 and y = 'blabla' and z = 1000
创建视图时,我想这样使用它:
select x, y, z
from ViewXYZ
where x > 0
在我的新工作中,我发现SQL Server 2008 Enterprise中的分区视图如下所示:
...
SELECT *
FROM [SERVER1].DATA_2012_7_1.dbo.DATA WITH (nolock)
WHERE DateTime >= '2012-07-01' AND DateTime <= '2012-07-15 23:59:59.997'
UNION ALL
SELECT *
FROM [SERVER2].DATA_2012_7_16.dbo.DATA WITH (nolock)
WHERE
我使用的是MS SQL Server。
当我定义数据库模式时,我定义了一个(非物化的)视图,它包括许多字段,例如(其中" Topic“是表的名称,视图是Topic表的自连接):
CREATE VIEW View_Topic_Ancestor AS
SELECT
Subordinate.Id AS Subordinate_Id,
Subordinate.Folder_Id AS Subordinate_Folder_Id,
Subordinate.topicTitle AS Subordinate_topicTitle,
Subordinate.topic
我使用的是MySQL,并且我有一个复杂的视图,这会导致性能问题。
view_3的定义
select * from view_1 union select * from view_2
现在,当我像下面这样对view_3运行查询时
select * from view_3 where clolumn_a=value;
这是在处理一组很大的行,可能正在执行全表扫描,然后返回结果。
那么像下面这样的查询会不会更好呢
select * from view_1 where column_a=value union select * from view_2 where column_a=value;
这种视
在SQL Server 2014 Management Studio的对象资源管理器中,具有架构绑定的索引视图没有索引节点。因此,您只能通过T-SQL为视图创建和删除索引。SQL Server Management Studio 2012仍显示索引节点。
有没有人有过同样的经历,或者在12.0.2000.8版本中是否有一些我遗漏的Management Studio设置?
在此之前,非常感谢您。
马库斯
在SQL Server存储过程中引用视图而不是视图中包含的SQL代码是不是更好的做法?
我看到很多这样的代码:
ALTER PROCEDURE [dbo].[Report_65PlusLivingAlone]
As
Begin
---- Select all 3 groups from base table
Select
*
INTO
#Temphouseholds
FROM
(
select b.ReportYearDescription as CensusYear
, Case When a.AggregationLevel = 'Min
我需要遍历网格视图以查找与不同表中的项匹配的记录(在SQL中)。循环遍历网格视图并在每个循环上调用SQL过程以查找匹配记录是最好的方法吗?或者,我是否应该将整个sql db放入datatable中,并在网格视图循环中查询数据集?
'find source ID based on make/model/serial No combination.
Dim cSource As New clsSource()
Dim ds As DataSet = cSource.GetSources()
Dim found As Boolean = Fal
我有一个查询,包括连续几次查找响应时间,如下所示:
ROUND(AVG(T.FinishTime-T.StartTime),3) AS 'Average', MAX(T.FinishTime-T.StartTime) AS 'Max', MIN(T.FinishTime-T.StartTime)
现在,我不完全理解SQL是如何在后台处理这些东西的,但是从我对编码的一般知识来看,让减法T.FinishTimeT.StartTime更有效不是更好吗?也就是说,能否进行一次计算,然后再计算出该计算清单上的总和?还是已经这样做了?我只想尝试将我的查询减少到更高效、更易读
我使用hibernate和视图(注释@Subselect和@Synchronize)和过滤器。问题是hibernate封装查询(由@Subselect注释的“value”属性定义),性能变得非常慢。
例如,如果我编写自己的SQL查询(执行不超过100 is ),则如下所示:
SELECT id,
country_id,
firstName,
lastName
FROM client
WHERE client.country_id IN (2564,2558,1452,3652)
但是,如果我使用hibernate和过滤器,生成的查询将是:
SELECT
我有一个在15秒内返回超过100000行的视图。该视图返回一个字段ElementId。我有一个具有主键Id的表元素。
SELECT MV.ElementId
FROM MyView MV
当我在视图和表之间应用连接时,我的查询非常慢(> 4分钟),如下所示:
SELECT E.Id
FROM MyView MV
INNER JOIN Elements E ON E.Id = MV.ElementId
WHERE E.CustomerId = @CustomlerId
为什么两个查询的执行时间会有这么大的差异?如何优化第二个查询?
我使用SQL Server 2014
我知道SQL Server2005的Express edition在估计最佳执行计划时不会自动包含物化视图(具有架构绑定)。但是,当直接查询视图时,我仍然会在实际执行计划中显示underyling表。为什么查询中没有使用在物化视图上创建的聚集索引?
视图的代码是:
CREATE VIEW [dbo].[athObjectNames] WITH SCHEMABINDING
AS
SELECT convert(nvarchar(440),oTextValue) as oTextValue, oObjectID, oTypeID, oVersion
FROM dbo.athO
在MS SQL 2005或T-SQL中,您可以执行以下操作:
SELECT T.NAME, T.DATE
FROM (SELECT * FROM MyTable WHERE ....) AS T
我在Oracle9iDB上尝试类似的SQL失败。在MS SQL中,嵌套的SQL被视为动态创建的临时/动态视图,然后销毁。我如何在Oracle中做类似的事情?我真的不想创建一个视图来做这件事。
我尝试用参数创建视图来动态获取数据。
(我不能使用WHERE条件,因为select语句本身会根据参数进行更改)
为此,我编写了一个以oracle对象类型返回所需数据的过程。
FUNCTION get_data(p_pk_id NUMBER, p_tab_type VARCHAR2)
RETURN M_TYPE_DATA_TAB
AS
v_table_collection M_TYPE_DATA_TAB;
BEGIN
-- my sql query which will change based on the params
RETURN v_table_collection;
END;
然
我刚刚在SQL Server 2012中开始分页,并且我试图在应用分页之前获得总行数,但我的问题是我的视图中有太多的函数调用,这会大大减慢它的速度。
我已经看过了这篇文章,我最终得到了一个查询,在数据库中没有完整数据集的情况下,运行时间为39秒。
SELECT *
, COUNT(TaskId) OVER()
FROM TaskVersionView
WHERE (.. ~10 predicates here .. )
ORDER BY StartDate
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY
如果没有计数,它只需要不到1秒。
我本以为S
在评估创建SQL视图查询的性能时,我注意到在末尾添加WHERE子句可以显著提高性能。输出差异不大(大约减少3%的行数)。
例如:
SELECT x,y,z
FROM (multiple table joins/sub queries)
vs
SELECT x,y,z
FROM (multiple table joins/sub queries)
WHERE x >= 0 (x is not indexed)
检查执行计划,似乎最大的区别是WHERE条件避免了全表扫描,这解释了速度的差异。为什么会这样呢?
编辑:截图显示使用WHERE条件与不使用WHERE条件的执行操作
关于连接的交换性的StackOverflow的讨论很少,如,,和。它变得相当复杂,我不认为他们中的任何一个在这里回答了我的问题。
我经常注意到,当我将用于查询的SQL放入Access中时,Access会打乱连接的顺序,甚至会将LEFT连接更改为RIGHT连接。我通常把我的外部连接写成LEFT,从逻辑上安排连接的表的顺序,所以我不喜欢Access把它搞乱。但现在我注意到在设计视图中查询的表示方式有所不同,我想知道这种差异是否显著。
这里有三个问题:
Query1
SELECT Table1.ID_Table1
FROM Table2 RIGHT JOIN (Table1 LEFT JOIN Ta