SQL隐藏技术?

时间:2010-05-28 16:08:29

标签: sql mysql sql-server postgresql

  

可能重复:
  Hidden Features of SQL Server

SQL提供的那些专业/细微技术是什么,而不是很多人知道哪些技术也削减了代码并提高了性能?

例如:我刚刚学会了如何在聚合函数中使用CASE语句,它完全改变了我的方法。

还有其他人吗?

更新:基本上是任何供应商。但PostgreSQL如果你只想关注一个:D

14 个答案:

答案 0 :(得分:6)

SQL GROUP BY - CUBE, ROLLUP clauses

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

  • ROW_NUMBER
  • RANK
  • DENSE_RANK
  • NTILE
  • OVER

观看次数:正常和实体化

如果没有引用供应商特定的语法

,很难说

答案 1 :(得分:6)

OVER Clause(SQL Server)a.k.a。Window functions(PostgreSQL)或analytic functions(Oracle)

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

答案 2 :(得分: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

总是更好。

答案 3 :(得分:5)

SELECT... EXCEPT SELECT...

SELECT... INTERSECT SELECT...

在选择不同或常见的行时非常有用(并且令人不安地有效) - 这对于行中的所有列 - 在集合之间。当你有很多列时,这非常有用。

答案 4 :(得分:3)

人们不会使用内置功能并且喜欢重新发明轮子,这里有Ten SQL Server Functions That You Have Ignored Until Now

在群集uniqueidentifier列上使用NEWSEQUENTIALID()而不是NEWID()会表现得更好,因为它不会导致页面拆分,从而导致碎片

使用辅助数字表,以便您可以快速执行基于集合的逻辑

例如

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

任何,所有和某些

答案 5 :(得分:3)

Postgresql中的两个:DISTINCT ON(参见示例)和新的WITH

答案 6 :(得分:2)

最近我一直在使用CROSS APPLY

答案 7 :(得分:2)

Pivot

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

答案 8 :(得分:2)

公用表表达式(SQL Server 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

他们非常善于将您的查询分解为步骤

答案 9 :(得分:1)

在MySQL下,使用关键字“STRAIGHT_JOIN”。如果您知道自己的数据以及要加入的查找表的关系,有时优化程序会将较小的表作为连接的基础进行查看,并尝试查询“较少记录”计数到“更大”的表中,从而获取明显更多的时间。如果您的主表位于“from”的第一个位置,并且前面是“条件”,则直接连接将首先点击,然后连接到其余表格并立即完成。

我必须这样做才能处理加入大约15个以上查找表的超过100万条记录的政府数据。如果没有直接连接,系统会在20多个小时后窒息。添加直接连接,大约在2小时内完成。

答案 10 :(得分:1)

在Sql Server中,HAVING子句。特别是,HAVING(COUNT DISTINCT FOO)&gt; @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 ;

答案 11 :(得分:1)

来自PostgreSQL文档:

Table partitioning

分区是指将逻辑上一个大表分成较小的物理块。分区可以带来几个好处:

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

  • 更新性能也可以提高,因为每个表的索引都小于整个数据集的索引。当索引不再适合内存时,索引上的读写操作都会逐渐增加磁盘访问次数。

  • 如果计划在分区设计中,则可以通过简单地删除其中一个分区来完成批量删除。 DROP TABLE比批量DELETE快得多,更不用说随之而来的VACUUM开销了。

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

答案 12 :(得分: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

答案 13 :(得分:1)

在SQL Server中使用Convert()函数以mm / dd / yyyy格式获取日期而不是Cast()函数

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

我一直都在使用这个