我知道集群索引和非集群索引之间的主要区别,并了解它们的实际工作方式.我理解群集和非群集索引如何提高读取性能.但有一件事我不确定是什么原因让我选择一个而不是另一个.
例如:如果一个表没有聚集索引,那么应该创建一个非聚集索引并且有什么好处呢?
sql-server indexing clustered-index query-tuning non-clustered-index
我正在通过以下链接过滤过滤统计数据.
http://blogs.msdn.com/b/psssql/archive/2010/09/28/case-of-using-filtered-statistics.aspx
数据偏重,一个区域有0行,其余都来自不同的区域.以下是重现该问题的完整代码
create table Region(id int, name nvarchar(100))
go
create table Sales(id int, detail int)
go
create clustered index d1 on Region(id)
go
create index ix_Region_name on Region(name)
go
create statistics ix_Region_id_name on Region(id, name)
go
create clustered index ix_Sales_id_detail on Sales(id, detail)
go
-- only two values in this table as lookup or dim table
insert Region values(0, 'Dallas')
insert Region values(1, 'New York')
go
set nocount on
-- Sales is skewed
insert Sales values(0, 0)
declare @i …Run Code Online (Sandbox Code Playgroud) 我希望您能帮助讨论如何使用通用方法避免过多的连接。对此有一般规则吗?
目前,我有一个非常复杂的查询,它连接了 11 个表并且性能很差(即使有索引和更新的统计数据)。使用 Entity Framework Profiler,我收到了减少连接数量的建议,而是执行几个单独的查询:link。
每个连接都需要数据库执行额外的工作,并且查询的复杂性和成本随着每个连接的增加而迅速增加。虽然关系数据库针对处理连接进行了优化,但执行多个单独的查询通常比具有多个连接的单个查询更有效。
我应该如何修改以下示例以获得更好的性能?
select *
from Blogs blog0_
inner join Posts posts1_
on blog0_.Id = posts1_.BlogId
inner join Comments comments2_
on posts1_.Id = comments2_.PostId
inner join Users user3_
on posts1_.UserId = user3_.Id
inner join UsersBlogs users4_
on blog0_.Id = users4_.BlogId
inner join Users user5_
on users4_.UserId = user5_.Id
Run Code Online (Sandbox Code Playgroud) 我有一个大的历史交易表(15-20万行MANY列)和一行一列一列.具有一行的表包含日期(最后处理日期),该日期将用于提取trasaction表中的数据('process_date').
问题:我应该将'process_date'表连接到事务表,还是将事务表连接到'process_date'表?
通过Management Studio执行T-SQL查询时,我可以使用SET STATISTICS IO ON和SET STATISTICS TIME ON捕获统计信息以进行查询调优.
当我使用.NET客户端API执行T-SQL查询而不是使用Mangaement Studio的UI时,如何收集相同的统计信息?
这似乎是一个显而易见的事情,但在搜索MSDN和Google很长一段时间后,我很难过.我发现最接近的是MSDN上的SQL Server提供商统计信息(ADO.NET),但这些统计信息似乎是客户端关于网络连接的统计信息(例如,发送/接收的字节数),从客户端的角度来看,而不是服务器端统计信息我在找.
我知道UNION ALL应该比UNION具有更好的性能(参见:联盟与联盟的表现).
现在,我有这个庞大的存储过程(有很多查询),其中最后的结果是两部分SELECT,它们之间有一个UNION.由于两个数据集彼此都是外来的,我可以使用UNION ALL,它假设更好(没有明显的操作).
我在几个数据库上检查它,它工作正常.问题是我的一个客户给我他的数据库进行性能调整,当我调查它时,我注意到如果我将UNION ALL更改为UNION,性能会更好(!).这是我在存储过程中所做的所有改变.
有人可以解释一下这种情况会怎样?
谢谢,
Ziv
更新:
两个查询的附加执行计划(差异部分):

sql sql-server-2008 sql-server-2008-r2 database-performance query-tuning
在Neo4j(3.0版)中,以下查询返回相同的结果:
1. MATCH (a:Label) WHERE a.property = "Something" RETURN a
2. MATCH (a:Label {property: "Something"}) RETURN a
Run Code Online (Sandbox Code Playgroud)
在处理一些大型数据集时,我注意到(并使用EXPLAIN和PROFILE进行了验证),在某些情况下,第二个查询之类的查询会更快更好地执行。虽然存在其他实例,两个版本的性能均相同,但我还没有看到第一个版本的性能更好的实例。
neo4j文档和教程也有所不同。两者之间没有明确的比较。docs和tut使用这两个版本,通常倾向于第一个版本(可能是因为非精确匹配只能使用WHERE子句来完成)。但是指南还指出,缩小搜索范围的越早,搜索速度就越快。
我有一个CHAR(250)列用作varchar(24)列的外键.
在MySQL中我记得我可以创建一个指定列(24)的索引,以便在最左边的24个字符上创建索引.这似乎不可能在MS SQL Server上.
我的问题是:
是否可以在SQL Server 2008上使用索引视图来索引该列的子字符串,如果是这样,它是否会对表的性能产生任何副作用?
更新:我在下面自己回答了这个问题.
我正在尝试修复MySQL查询中的性能问题.我认为我所看到的是,将函数的结果赋给变量,然后运行带有与该变量进行比较的SELECT相对较慢.
但是,如果为了测试,我将比较替换为变量,并将其与我知道该函数将返回的字符串文字等效值(对于给定的场景)进行比较,然后查询运行得更快.
例如:
...
SET @metaphone_val := double_metaphone(p_parameter)); -- double metaphone is user defined
SELECT
SQL_CALC_FOUND_ROWS
t.col1,
t.col2,
...
FROM table t
WHERE
t.pre_set_metaphone_string = @metaphone_val -- OPTION A
t.pre_set_metaphone_string = 'PRN' -- OPTION B (Literal function return value for a given name)
Run Code Online (Sandbox Code Playgroud)
如果我使用选项A中的行,则查询速度很慢.
如果我使用选项B中的行,那么查询速度很快,就像您期望的任何简单字符串比较一样.
为什么?
运行一个非常简单的查询:
SELECT TOP 10 *
FROM WH.dbo.vw_data m
ORDER BY DateCompleted
Run Code Online (Sandbox Code Playgroud)
大约需要4分钟.
执行的96%由以下内容占用:

警告意味着什么,它是如何解释的?
该字段DateCompleted未编入索引:这是否意味着除非我们使用索引命中备用字段,否则添加索引DateCompleted将始终很慢?
SELECT
/*+ INDEX(ID_BL_REF_NO REF_number_BL_idx*/ DECODE(BL_TYPE,'E',BL_ORIGIN_NAME,'I',BL_FINAL_NAME) FROM_PORT,
DECODE(BL_TYPE,'I',BL_ORIGIN_NAME,'E',BL_FINAL_NAME) TO_PORT,
(BL_VESSEL_CONNECT||'/'||BL_VOYAGE_CONNECT||'/'||BL_PORT_CONNECT) Mother_vessel_voyage_port,
SUM(BLC_SIZE) No_of_20s,
SUM(BLC_SIZE) No_of_40s,
SUM(DECODE(BLC_SIZE,'20',1,'40',2)) Teus,
SUM(BLC_GROSSWT) GrossWt,
round((BLC_GROSSWT/SUM(DECODE(BLC_SIZE,'20',1,'40',2))),2) AverageWt,
SUM(DECODE(BLF_MODE,'P',BLF_LOCAL_AMOUNT)) PREPAID,
SUM(DECODE(BLF_MODE,'C',BLF_LOCAL_AMOUNT)) COLLECT,
SUM(DECODE(BLF_MODE,'E',BLF_LOCAL_AMOUNT)) ELSEWHERE,
(SUM(DECODE(BLF_MODE,'P',BLF_LOCAL_AMOUNT)+DECODE(BLF_MODE,'C',BLF_LOCAL_AMOUNT)+DECODE(BLF_MODE,'E',BLF_LOCAL_AMOUNT))/SUM(DECODE(BLC_SIZE,'20',1,'40',2))) AVERAGE
FROM ID_BL_DETAILS,id_bl_containers,ID_BL_FREIGHT
WHERE BL_REFNO=BLC_REFNO
AND BLF_REFNO=BLC_REFNO
GROUP BY BL_VESSEL_CONNECT,BL_VOYAGE_CONNECT,BL_PORT_CONNECT,BL_ORIGIN_NAME,BL_LODPORT,BL_DISPORT,BL_FINAL_NAME,BLC_GROSSWT,BL_TYPE
Run Code Online (Sandbox Code Playgroud) 任何人都可以解释如何在Oracle解释计划中评估成本吗?是否有任何特定的算法来确定查询的成本?
例如:全表扫描,具有较高的性价比,索引扫描下... Oracle如何评估情况的 full table scan,index range scan等等?
此链接与我要求的相同:关于Oracle解释计划中的成本的问题
但是,任何人都可以用一个例子来解释,我们可以通过执行找到成本explain plan,但它如何在内部工作?