标签: performance

如何有效地检查多列上的 EXISTS?

这是我定期遇到的一个问题,但尚未找到好的解决方案。

假设如下表结构

CREATE TABLE T
(
A INT PRIMARY KEY,
B CHAR(1000) NULL,
C CHAR(1000) NULL
)
Run Code Online (Sandbox Code Playgroud)

并且要求是确定可空列中的任何一个BC实际上是否包含任何NULL值(如果是,则是哪个(些))。

还假设该表包含数百万行(并且没有可用的列统计信息可以查看,因为我对此类查询的更通用解决方案感兴趣)。

我可以想到几种方法来解决这个问题,但都有弱点。

两个单独的EXISTS声明。这将具有允许查询在NULL发现a 后尽早停止扫描的优点。但是如果两列实际上都不包含NULLs,那么将导致两次完整扫描。

单一聚合查询

SELECT 
    MAX(CASE WHEN B IS NULL THEN 1 ELSE 0 END) AS B,
    MAX(CASE WHEN C IS NULL THEN 1 ELSE 0 END) AS C
FROM T
Run Code Online (Sandbox Code Playgroud)

这可以同时处理两列,因此最坏的情况是一次完整扫描。缺点是即使它NULL在查询的很早的时候在两列中都遇到了 a ,最终仍会扫描整个表的其余部分。

用户变量

可以想到第三种方式来做到这一点

BEGIN TRY
DECLARE @B INT, @C INT, @D …
Run Code Online (Sandbox Code Playgroud)

performance sql-server

26
推荐指数
2
解决办法
11万
查看次数

访问相同LOB数据时的逻辑读取不同

以下是三个读取相同数据的简单测试,但报告的逻辑读取却截然不同:

设置

以下脚本创建一个具有 100 个相同行的测试表,每个行都包含一个xml列,其中包含足够的数据以确保将其存储在行外。在我的测试数据库中,生成的xml的长度为每行 20,204 字节。

-- Conditional drop
IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL
    DROP TABLE dbo.XMLTest;
GO
-- Create test table
CREATE TABLE dbo.XMLTest
(
    ID integer IDENTITY PRIMARY KEY,
    X xml NULL
);
GO
-- Add 100 wide xml rows
DECLARE @X xml;

SET @X =
(
    SELECT TOP (100) *
    FROM  sys.columns AS C
    FOR XML 
        PATH ('row'),
        ROOT ('root'),
        TYPE
);

INSERT dbo.XMLTest
    (X)
SELECT TOP (100)
    @X
FROM  sys.columns …
Run Code Online (Sandbox Code Playgroud)

performance sql-server database-internals blob

26
推荐指数
1
解决办法
1301
查看次数

我应该为多语言网站选择哪种排序规则?

排序规则对查询速度有任何影响吗?表的大小是否根据排序规则而变化?

如果我想构建一个必须支持所有可能语言的网站(例如 Google),推荐的排序规则是什么?

我将需要存储的字符,例如???,我的搜索过的网站将有返回somethingsóméthíng输入,它必须是不区分大小写也是如此。

我怎么知道哪个是最好的选择?哪种排序规则更适合这种情况?

performance sql-server collation

25
推荐指数
3
解决办法
5028
查看次数

生成大型测试数据集的工具

很多时候,当试图提出一个高效的数据库设计时,最好的做法是建立两个示例数据库,用数据填充它们,然后对它们运行一些查询,看看哪个性能更好。

是否有一种工具可以相对快速地生成(最好直接进入数据库)大型(约 10,000 条记录)测试数据集?我正在寻找至少适用于 MySQL 的东西。

mysql performance tools performance-testing

25
推荐指数
2
解决办法
3万
查看次数

如何加快选择不同的?

我在一些时间序列数据上有一个简单的选择:

SELECT DISTINCT user_id
FROM events
WHERE project_id = 6
AND time > '2015-01-11 8:00:00'
AND time < '2015-02-10 8:00:00';
Run Code Online (Sandbox Code Playgroud)

它需要112秒。这是查询计划:

http://explain.depesz.com/s/NTyA

我的应用程序必须执行许多不同的操作并像这样计数。有没有更快的方法来获取这种数据?

postgresql performance optimization postgresql-9.3 amazon-rds query-performance

25
推荐指数
2
解决办法
4万
查看次数

如何在大表上使用 LEFT JOIN 优化非常慢的 SELECT

我在谷歌上搜索、自我教育和寻找解决方案几个小时,但没有运气。我在这里发现了一些类似的问题,但不是这种情况。

我的表:

  • 人(约 1000 万行)
  • 属性(位置,年龄,...)
  • 人员和属性之间的链接 (M:M)(约 40M 行)

完全转储 ~280MB

情况: 我尝试person_id从某些位置 ( location.attribute_value BETWEEN 3000 AND 7000) 中选择所有人员 ID ( ) ,具有某种性别 ( gender.attribute_value = 1),出生于某些年份 ( bornyear.attribute_value BETWEEN 1980 AND 2000) 并且具有某种眼睛颜色 ( eyecolor.attribute_value IN (2,3))。

这是我的查询女巫花了3~4 分钟。我想优化:

SELECT person_id
FROM person
    LEFT JOIN attribute location ON location.attribute_type_id = 1 AND location.person_id = person.person_id
    LEFT JOIN attribute gender ON gender.attribute_type_id = 2 AND gender.person_id = person.person_id
    LEFT JOIN …
Run Code Online (Sandbox Code Playgroud)

mysql performance optimization eav query-performance

25
推荐指数
2
解决办法
10万
查看次数

两个日期列的 SARGable WHERE 子句

对我来说,我有一个关于 SARGability 的有趣问题。在这种情况下,它是关于对两个日期列之间的差异使用谓词。这是设置:

USE [tempdb]
SET NOCOUNT ON  

IF OBJECT_ID('tempdb..#sargme') IS NOT NULL
BEGIN
DROP TABLE #sargme
END

SELECT TOP 1000
IDENTITY (BIGINT, 1,1) AS ID,
CAST(DATEADD(DAY, [m].[severity] * -1, GETDATE()) AS DATE) AS [DateCol1],
CAST(DATEADD(DAY, [m].[severity], GETDATE()) AS DATE) AS [DateCol2]
INTO #sargme
FROM sys.[messages] AS [m]

ALTER TABLE [#sargme] ADD CONSTRAINT [pk_whatever] PRIMARY KEY CLUSTERED ([ID])
CREATE NONCLUSTERED INDEX [ix_dates] ON [#sargme] ([DateCol1], [DateCol2])
Run Code Online (Sandbox Code Playgroud)

我会经常看到的是这样的:

/*definitely not sargable*/
SELECT
    * ,
    DATEDIFF(DAY, [s].[DateCol1], [s].[DateCol2])
FROM
    [#sargme] AS [s] …
Run Code Online (Sandbox Code Playgroud)

performance index sql-server query-performance

25
推荐指数
3
解决办法
3116
查看次数

LIKE 是如何实现的?

谁能解释一下 LIKE 运算符是如何在当前数据库系统(例如 MySQL 或 Postgres)中实现的?或者指出一些解释它的参考资料?

天真的方法是检查每条记录,在感兴趣的字段上执行正则表达式或部分字符串匹配,但我有一种感觉(希望)这些系统做一些更聪明的事情。

mysql postgresql performance full-text-search pattern-matching

24
推荐指数
3
解决办法
1万
查看次数

SQL 编译对 SQL Server 性能的影响有多大?

我正在分析 SQL Server 2005 的一个实例,通过 PerfMon 的SQLServer:SQL Statistics - SQL Compilations/sec指标,我看到平均值约为 170 左右。

我拿出 SQL Profiler 并寻找 SP:Compile 或 SQL:Compile 事件。显然它们不存在。我确实发现Stored Procedure/SP:RecompileTSQL/SQL:StmtRecompile事件。我在 Profiler 中看到的数据量表明这些是错误的事件,尽管我不确定。

所以我的问题。对其中任何一个的回答都会很棒。

  1. 如何查看 SQL Server 中编译的内容?
  2. 我是否选择了错误的指标来查看?在 Perfmon 或 SQL Profiler 中?
  3. 至于Stored Procedure/SP:RecompileTSQL/SQL:StmtRecompile事件在SQL事件探查器,他们不包括持续时间度量。如果这些事件无法查看对系统的时序影响,我该如何衡量这些事件对系统的影响。

performance sql-server-2005 sql-server perfmon

24
推荐指数
2
解决办法
3万
查看次数

通过子查询选择多列

我正在尝试从以下查询中的子查询中选择 2 列,但无法这样做。尝试创建别名表,但仍然无法获取它们。

SELECT
  DISTINCT petid,
  userid,
  (SELECT MAX(comDate) FROM comments WHERE petid=pet.id) AS lastComDate,
  (SELECT userid FROM comments WHERE petid=pet.id ORDER BY id DESC LIMIT 1) AS lastPosterID
FROM 
  pet LEFT JOIN comments ON pet.id = comments.petid
WHERE 
  userid='ABC'      AND 
  deviceID!='ABC'   AND 
  comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH);
Run Code Online (Sandbox Code Playgroud)

基本上,我试图从同一行获取lastComDate& lastPosterID- 特定宠物评论中的最新行。请建议我如何以有效的方式获得它们。

上面的查询有效,但由于同一行被提取两次似乎有点矫枉过正。此外,该ORDER BY子句比聚合函数慢得多 - 正如我在分析查询时发现的那样。因此,避免排序的解决方案将不胜感激。

mysql performance subquery select

24
推荐指数
2
解决办法
13万
查看次数