SQL提供的那些专业/细微技术是什么,而不是很多人知道哪些技术也削减了代码并提高了性能?
例如:我刚刚学会了如何在聚合函数中使用CASE语句,它完全改变了我的方法。
还有其他人吗?
更新:基本上是任何供应商。但PostgreSQL如果你只想关注一个:D
答案 0 :(得分:6)
SQL GROUP BY - CUBE, ROLLUP clauses
分析(AKA排名,AKA窗口)功能 IE:
观看次数:正常和实体化
如果没有引用供应商特定的语法
,很难说答案 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)
这是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文档:
分区是指将逻辑上一个大表分成较小的物理块。分区可以带来几个好处:
对于某些类型的查询,可以显着提高查询性能。
更新性能也可以提高,因为每个表的索引都小于整个数据集的索引。当索引不再适合内存时,索引上的读写操作都会逐渐增加磁盘访问次数。
如果计划在分区设计中,则可以通过简单地删除其中一个分区来完成批量删除。 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)
我一直都在使用这个