2010-05-28 84 views
15

可能重复:
Hidden Features of SQL ServerSQL隐藏技术?

什么是SQL提供的PRO /微妙的技巧并没有太多的了解也削减代码和提高性能?

例如:我刚刚学会了如何在集合函数内部使用CASE语句,它完全改变了我对事物的方法。

有其他吗?

更新:基本上任何供应商。不过,PostgreSQL的,如果你想只专注于一个:d

+3

标记为[SQL Server的隐藏功能](http://stackoverflow.com/questions/121243/hidden-features-of-sql-server)的副本 - 将其扩展到所有平台只会进一步“主观”/ NARQ类别。 – Aaronaught 2010-05-28 16:32:34

+0

请阅读更新。我也在寻找常用的很好的sql技术。就像我的示例中适用于所有关系数据库的数据一样 – AlexRednic 2010-05-28 19:45:19

回答

6

SQL GROUP BY - CUBE, ROLLUP clauses

分析(AKA排名中,AKA窗口)功能 IE:

  • ROW_NUMBER
  • RANK
  • DENSE_RANK
  • NTILE
  • OVER

浏览:正常和物化

这很难说太多没有参考供应商特定语法

+0

排名功能非常有用。 – 2010-05-28 16:14:36

3

人不使用内置的足够的功能,喜欢推倒重来,在这里是Ten SQL Server Functions That You Have Ignored Until Now

在集群uniqueidentifier列上使用NEWSEQUENTIALID()而不是NEWID()将执行得更好,因为它不会导致页面拆分并因此导致碎片化

使用数字的auxilarry表,以便您可以快速做一些一套基于逻辑

例如

select DATEADD(m,number,'20010101') 
from master..spt_values 
where type = 'P' 
order by 1 

ANY,ALL和SOME

+0

我还没有在* ages *中使用ANY/ALL/SOME,使用JOIN – 2010-05-28 16:17:32

+0

第三项通常被称为使用“tally”表,并且对于查找序列中的空位非常有用。 – 2010-05-28 16:19:48

+0

难道人们真的不知道GETUTCDATE()吗? – 2010-05-28 20:17:08

6

OVER Clause(SQL服务器)又名Window functions( PostgreSQL)或analytic functions(甲骨文)

这对我来说非常好。你可以做各种方便的事情,如计数,分区,排名等。

+0

同样适用于PostgreSQL窗口函数 - http://www.postgresql.org/docs/current/static/tutorial-window.html - 具有相同的语法。似乎是我最近回答的一半sql问题的答案...... – araqnid 2010-05-28 16:26:43

5
SELECT... EXCEPT SELECT... 

SELECT... INTERSECT SELECT... 

可以在pickout出不同或共同排有用的(和令人不安的效率) - 这是为所有列行 - 套之间。当你有很多列时,这是非常有用的。

2

Pivot

这在2005年是新的(我知道的是很久以前的事,但还有人仍在使用2000加载)。 保存做一堆“case when name ='tim',然后输入值0结束”来构建您的聚合周末。

+0

PIVOT/UNPIVOT受SQL Server 2005+,Oracle 11g +支持。我相信这是ANSI。 CASE得到了更广泛的支持,因此为了便于携带,我倾向于选择PIVOT。 – 2010-05-28 17:03:08

6

EXISTS。令人惊讶的是,当EXISTS可以更快地完成这项工作时,有多少人在检查存在或IN(SELECT ...)子句时仍然使用COUNT(*)。

最常见的,你可能会看到:

SELECT @MyVar = Count(*) FROM Table1 WHERE.... 
If @MyVar <> 0 
BEGIN 
    --do something 
END 

IF EXISTS(SELECT 1 FROM Table1 WHERE...) 
BEGIN 
    --don something 
END 

总是更好。

+0

加入和聚合比使用子查询更好吗? :D – AlexRednic 2010-05-28 16:32:48

+0

外部连接通常比不存在的非常快(至少在SQL Server 2000中),除非不满足存在谓词的集远小于表。但是,总体性能将主要取决于查询优化器是否获取查询权 - 在大多数情况下可能会这样做。在这种情况下,EXISTS可能会更好,如果它使查询更清晰。 – ConcernedOfTunbridgeWells 2010-05-28 16:40:40

1

在MySQL下,使用关键字“STRAIGHT_JOIN”。如果你知道你的数据以及你要加入的查询表的关系,有时候优化器会将较小的表看作一个连接的基础,并试图将“较少的记录”计数查询到“较大”的表中,明显更多的时间。如果您的主表首先位于“from”和其前面的“标准”中,那么直接连接将首先出现,然后加入其余表格并立即完成。

我不得不这样做,处理10多万条记录加入到约15个查找表的政府数据。如果没有直接连接,系统会在20个小时后窒息。加入直接连接,约2小时完成。

1

在Sql Server中,HAVING子句。特别是,HAVING(COUNT DISTINCT FOO)> @SomeNumber快速查找具有给定分组的多个不同值的行。

MSDN

USE AdventureWorks2008R2 ; 
GO 
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal 
FROM Sales.SalesOrderDetail 
GROUP BY SalesOrderID 
HAVING SUM(LineTotal) > 100000.00 
ORDER BY SalesOrderID ; 
1

和PostgreSQL文档:

Table partitioning

分区是指分裂是什么逻辑上的一个大表分成更小的物理块。分区可以带来以下好处:

  • 对于某些查询类型,查询性能可以显着提高。

  • 更新性能也可以得到改善,因为每个表的索引都小于整个数据集上的索引。当索引不再容易地适应内存时,对索引的读取和写入操作都会逐渐进行更多的磁盘访问。

  • 批量删除可以通过简单地删除其中一个分区来完成,如果该需求计划在分区设计中。 DROP TABLE比批量DELETE快得多,对于随后的VACUUM开销没有任何影响。

  • 很少使用的数据可以迁移到更便宜和更慢的存储介质。

1

派生表创建“变量”并减少重复代码。

这样的事情,但可以扩展。显然,“平均值”可以是一个更复杂的计算,如果你有几个它有助于清理代码。

Select *, case when AverageValue > 50 then 'Pass' Else 'Fail' end 
From 
(
Select ColA, ColB, AverageValue = (ColA+ColB)/2 
From InnerMostTable 
) AverageValues 
Order By AverageValue Desc 
+0

看到leonbloy的答案。更优雅。 – AlexRednic 2010-05-28 21:24:18

2

通用表表达式(SQL服务器2005+)

WITH x AS (
    SELECT 1 as A, 2 as B, 3 as C 
), 
WITH y AS (
    SELECT 4 as A, 5 as B, 6 as C 
    UNION 
    SELECT 7 as A, 8 as B, 9 as C 
) 
SELECT A, B, C FROM x 
UNION 
SELECT A, B, C FROM y 

他们是非常好的使用转换()函数来获取日期打破你的查询到步骤

1

在SQL Server格式mm/dd/yyyy而不是Cast()函数

SELECT convert(datetime, '1/1/2010', 101) 

我一直用这个