标签: query-optimization

为什么这个SQL查询会进行密钥查找?

我有一个表用户有一堆索引.其中一个是AccountIdentifier列的唯一索引.

由于这是一个唯一索引,为什么除了索引查找之外还需要键查找?索引查找工具提示报告只返回一条记录.我也尝试将索引转换为"唯一键"类型.

alt text http://s3.amazonaws.com/brandonc.baconfile.com/pitchurs/tmp/capture_2.png

sql sql-server query-optimization sql-execution-plan

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

在SQLite中的一个语句中递增计数器或插入行

在SQLite中,给出了这个数据库模式

CREATE TABLE observations (
    src TEXT,
    dest TEXT,
    verb TEXT,
    occurrences INTEGER
);
CREATE UNIQUE INDEX observations_index
    ON observations (src, dest, verb);
Run Code Online (Sandbox Code Playgroud)

每当有一个新的观察元组(:src, :dest, :verb)出现时,我想要为该元组的现有行增加"出现次数"列,或者如果还没有,则添加一个出现次数= 1的新行.在具体的伪代码中:

if (SELECT COUNT(*) FROM observations
        WHERE src == :src AND dest == :dest AND verb == :verb) == 1:
    UPDATE observations SET occurrences = occurrences + 1
        WHERE src == :src AND dest == :dest AND verb == :verb
else:
    INSERT INTO observations VALUES (:src, :dest, :verb, 1)
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在一个SQLite语句中执行整个操作.这将简化应用程序逻辑(这需要与数据库操作完全异步),并且还避免使用完全相同的密钥进行双索引查找.INSERT OR REPLACE似乎不是我想要的,唉没有UPDATE …

sql sqlite query-optimization

15
推荐指数
2
解决办法
9806
查看次数

LIKE'%...%'通配符查询的PL/SQL性能调优

我们正在使用Oracle 11g数据库.
正如你可能会或可能不知道,如果你在前面的字符串使用通配符查询用"%",列没有被使用的索引全表扫描正在发生的事情.

看起来似乎没有关于如何改进此类查询的明确建议,但也许您可以根据您的经验分享一些有价值的信息,以了解如何优化以下查询:

SELECT * 
  FROM myTable 
 WHERE UPPER(CustomerName) like '%ABC%' 
    OR UPPER(IndemnifierOneName) like '%ABC%' 
    OR UPPER(IndemnifierTwoName) like '%ABC%';
Run Code Online (Sandbox Code Playgroud)

...其中所有3列的类型为varchar2(100),ABC是变量输入参数的值.

@All建议使用CONTEX索引,请注意我的数据每天的任何时间都会更新,而且这个索引需要重新同步,因此对于150万行的表来说这不是一个好的选择,抱歉.

PS我会支持每个答案,所以请保持他们的到来.

sql oracle indexing query-optimization

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

无法优化使用ORDER BY子句的MySQL查询

我正在使用Drupal 6与MySQL 5.0.95版本,并且陷入僵局,其中我的一个基于最近文章日期显示内容的查询速度变慢,并且由于使用频率导致网站性能完全丧失.有问题的查询如下:

     SELECT n.nid, 
            n.title, 
            ma.field_article_date_format_value, 
            ma.field_article_summary_value
       FROM node n 
 INNER JOIN content_type_article ma ON n.nid=ma.nid
 INNER JOIN term_node tn            ON n.nid=tn.nid 
      WHERE tn.tid= 153 
        AND n.status=1 
   ORDER BY ma.field_article_date_format_value DESC 
      LIMIT 0, 11;
Run Code Online (Sandbox Code Playgroud)

查询的EXPLAIN显示以下结果:

+----+-------------+-------+--------+--------------------------+---------+---------+----------------------+-------+---------------------------------+
| id | select_type | table | type   | possible_keys            | key     | key_len | ref                  | rows  | Extra                           |
+----+-------------+-------+--------+--------------------------+---------+---------+----------------------+-------+---------------------------------+
|  1 | SIMPLE      | tn    | ref    | PRIMARY,nid              | PRIMARY | 4       | const                | 19006 | Using temporary; …
Run Code Online (Sandbox Code Playgroud)

mysql indexing sql-order-by query-optimization

15
推荐指数
2
解决办法
1050
查看次数

查询250k行需要53秒

运行此查询的框是在数据中心中运行的专用服务器.

AMD Opteron 1354四核2.20GHz 2GB内存Windows Server 2008 x64(是的,我知道我只有2GB内存,当项目上线时我升级到8GB).

因此,我在表格中创建了250,000个虚拟行,以真正压力测试LINQ to SQL生成的一些查询,并确保它们不会太糟糕,我注意到其中一个正在花费大量时间.

我使用索引将此查询缩短到17秒,但为了这个答案,我从头到尾删除了它们.只有索引是主键.

Stories table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[CategoryID] [int] NOT NULL,
[VoteCount] [int] NOT NULL,
[CommentCount] [int] NOT NULL,
[Title] [nvarchar](96) NOT NULL,
[Description] [nvarchar](1024) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[UniqueName] [nvarchar](96) NOT NULL,
[Url] [nvarchar](512) NOT NULL,
[LastActivityAt] [datetime] NOT NULL,

Categories table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[ShortName] [nvarchar](8) NOT NULL,
[Name] [nvarchar](64) NOT NULL,

Users table --
[ID] …
Run Code Online (Sandbox Code Playgroud)

sql query-optimization linq-to-sql

14
推荐指数
1
解决办法
3455
查看次数

Zend Framework中有很多DESCRIBE查询

我只是在Zend中设置FirePHP,我注意到大量的DESCRIBE查询.某些页面在同一个表上有50个或更多相同的查询.例如

0.00198     connect      NULL
0.00449 DESCRIBE `nodes`    NULL
0.00041 SELECT `nodes`.* FROM `nodes` WHERE (((`nodes`.`id` = 111)))    NULL
0.0037  DESCRIBE `nodes`    NULL
0.00155 SELECT `nodes`.* FROM `nodes` WHERE (((`nodes`.`id` = 111)))    NULL
0.00059 SELECT `nodes`.* FROM `nodes` WHERE (parent_id = '111') ORDER BY `order` ASC, `id` ASC  NULL
0.00366 DESCRIBE `nodes`    NULL
0.0054  DESCRIBE `nodes`    NULL
0.0049  DESCRIBE `nodes`    NULL
0.00519 DESCRIBE `nodes`    NULL
0.00492 DESCRIBE `nodes`    NULL
0.00691 DESCRIBE `nodes`    NULL
0.00741 DESCRIBE `nodes`    NULL
0.0048  DESCRIBE `nodes`    NULL …

php zend-framework query-optimization

14
推荐指数
1
解决办法
4974
查看次数

左连接或使用逗号(,)从多个表中选择

我很好奇为什么我们需要使用,LEFT JOIN因为我们可以使用逗号来选择多个表.

LEFT JOIN使用逗号选择多个表之间有什么区别.

哪一个更快?

这是我的代码:

   SELECT mw.*, 
          nvs.* 
     FROM mst_words mw 
LEFT JOIN (SELECT no as nonvs, 
                  owner, 
                  owner_no, 
                  vocab_no, 
                  correct 
             FROM vocab_stats 
            WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no 
    WHERE (nvs.correct > 0 ) 
      AND mw.level = 1
Run Code Online (Sandbox Code Playgroud)

...和:

SELECT * 
  FROM vocab_stats vs, 
       mst_words mw 
 WHERE mw.no = vs.vocab_no 
   AND vs.correct > 0 
   AND mw.level = 1 
   AND vs.owner = 1111
Run Code Online (Sandbox Code Playgroud)

mysql sql query-optimization left-join

14
推荐指数
1
解决办法
6万
查看次数

如何在三个表(40k行)中优化缓慢的"选择不同"查询,只返回22个结果

所以我有其他人写的这个查询,我正在尝试重构,这为项目提供了一些功能/材料(通常是鞋子).

有很多产品,因此有很多连接表条目,但只有少数几个可用的功能.我认为必须有一种方法可以减少触及"大"项目列表的需要,以获得这些功能,我听说要明确避免,但我没有可以替换此处"不同"选项的语句.

根据我的日志,我的结果时间很慢:

Query_time:7 Lock_time:0 Rows_sent:32 Rows_examined:5362862

Query_time:8 Lock_time:0 Rows_sent:22 Rows_examined:6581994

正如消息所说,有时它需要7或8秒,有时或每次查询超过500万行.

这可能是由于同时发生的其他负载,因为这里是直接从mysql命令行在数据库上运行的选择:

mysql> SELECT DISTINCT features.FeatureId, features.Name
       FROM features, itemsfeatures, items
       WHERE items.FlagStatus != 'U'
         AND items.TypeId = '13'
         AND features.Type = 'Material'
         AND features.FeatureId = itemsfeatures.FeatureId
       ORDER BY features.Name;
+-----------+--------------------+
| FeatureId | Name               |
+-----------+--------------------+
|        40 | Alligator          |
|        41 | Burnished Calfskin |
|        42 | Calfskin           |
|        59 | Canvas             |
|        43 | Chromexcel         |
|        44 | Cordovan           |
| …
Run Code Online (Sandbox Code Playgroud)

mysql sql distinct query-optimization

14
推荐指数
2
解决办法
7832
查看次数

优化MySQL搜索查询

需要你帮助优化一个mysql查询.让我们以简单的表格为例.

CREATE TABLE `Modules` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `moduleName` varchar(100) NOT NULL,
 `menuName` varchar(255) NOT NULL,
PRIMARY KEY (`ID`),
KEY `moduleName` (`moduleName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

让我们填写一些数据:

INSERT INTO  `Modules` (`moduleName` ,`menuName`)
VALUES 
    ('abc1',  'name1'), 
    ('abc',  'name2'), 
    ('ddf',  'name3'), 
    ('ccc',  'name4'), 
    ('fer',  'name5');
Run Code Online (Sandbox Code Playgroud)

还有一些样本字符串.让它成为abc_def;

传统上我们试图找到包含搜索字符串的所有行.

相反,我的任务是找到包含moduleName在输入字符串中的所有行.现在我有以下查询来获得所需的结果:

SELECT `moduleName` ,`menuName` 
FROM `Modules` 
WHERE 'abc_def' LIKE(CONCAT(`moduleName`,'%'))
Run Code Online (Sandbox Code Playgroud)

这将返回

moduleName   | menuName 
---------------------------
abc          | name2
Run Code Online (Sandbox Code Playgroud)

问题是,此查询未使用索引.

有没有办法强迫它使用一个?

mysql query-optimization

14
推荐指数
2
解决办法
3578
查看次数

CPU时间或经过的时间 - 这实际上意味着SQL Query的性能?

我有一个SQL Server 2012表与2697记录,表没有索引.未来数据将增加至多10万条记录.我没有加入任何其他表来检索记录.最初我创建了一个用户定义的函数来从表中检索记录.

后来我才知道视图会比用户定义的函数更快,因此我为该表创建了一个View.

要了解Query的性能,我包含以下代码以获取我的UDF,VIEW和直接SQL语句的CPU时间和已用时间.

SET STATISTICS IO ON;
SET STATISTICS TIME ON;
Run Code Online (Sandbox Code Playgroud)

当我使用select查询直接从我的表中提取数据时,我得到了下面的CPU时间和经过的时间

SELECT [CollegeName]
      ,[CandidateID]
      ,[age]
      ,[race]
      ,[sex]
      ,[ethnic]
      ,[arm]
      ,[Weeknum]
      ,[siteid]
      ,[country]
      ,[Region]
      ,[SubRegion]
      ,[SNAME]
      ,[UID]
  FROM [testdata]
Run Code Online (Sandbox Code Playgroud)

----结果

Scan count 1, logical reads 1338, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
 SQL Server Execution Times:
   CPU time = 31 ms,  elapsed time = 4381 ms.
Run Code Online (Sandbox Code Playgroud)

当我使用VIEW时,我得到了CPU时间和经过时间

CREATE VIEW vw_testdata
AS
SELECT [CollegeName]
      ,[CandidateID]
      ,[age]
      ,[race] …
Run Code Online (Sandbox Code Playgroud)

sql-server performance query-optimization

14
推荐指数
1
解决办法
2万
查看次数