标签: query-optimization

SQL查询位置半径内的总点数

我有一个美国所有邮政编码的数据库表,其中包括每个邮政编码的城市,州,纬度和经度.我还有一个点数据库表,每个点都有与之关联的纬度和经度.我希望能够使用1个MySQL查询为我提供zipcodes表中所有唯一城市/州组合的列表,以及该城市/州的给定半径内的总点数.我可以使用以下查询获取唯一的城市/州名单:

select city,state,latitude,longitude
from zipcodes 
group by city,state order by state,city;
Run Code Online (Sandbox Code Playgroud)

我可以使用以下查询获得纬度为"$ lat"和经度为"$ lon"的特定城市100英里范围内的点数:

select count(*) 
from points 
where (3959 * acos(cos(radians($lat)) * cos(radians(latitude)) * cos(radians(longitude) - radians($lon)) + sin(radians($lat)) * sin(radians(latitude)))) < 100;
Run Code Online (Sandbox Code Playgroud)

我无法做的是弄清楚如何以不杀死我的数据库的方式组合这些查询.这是我悲伤的尝试之一:

select city,state,latitude,longitude,
    (select count(*) from points
     where status="A" AND 
          (3959 * acos(cos(radians(zipcodes.latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(zipcodes.longitude)) + sin(radians(zipcodes.latitude)) * sin(radians(latitude)))) < 100) as 'points' 
from zipcodes 
group by city,state order by state,city;
Run Code Online (Sandbox Code Playgroud)

表格目前有以下索引:

Zipcodes - `zip` (zip)
Zipcodes - `location` (state,city)
Points - …
Run Code Online (Sandbox Code Playgroud)

mysql query-optimization geolocation

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

sql调优 - 具有多个连接

我最近在某处读到了调优SQL查询的方法之一是,如果它有太多的连接,那么用较少的表做一个连接并将结果缓存到临时表中,然后在该表上进行其余的查询连接.

我的问题是它如何改善性能,因为你加入相同数量的表(只是不在一起)?

注意:我同意这是通用声明; 我最近在一篇文章中读到了它.我会改写它.在哪些条件下将结果存储到临时表帮助?

sql oracle optimization join query-optimization

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

通过多个线程读取文件

我有一个250Mb的文件要读.应用程序是多线程的.如果我允许所有线程读取文件,则会发生内存不足.我内存不足错误.

为了避免它.我想在内存中只有一个String(从流中读取)的副本,我希望所有线程都使用它.

while (true) {
    synchronized (buffer) {
        num = is.read(buffer);
            String str = new String(buffer, 0, num);

    }
    sendToPC(str);
}
Run Code Online (Sandbox Code Playgroud)

基本上我想在所有线程完成发送时只有一个字符串副本,我想读第二个字符串,依此类推.

java memory multithreading query-optimization

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

SQL Server - 减少读取次数

我有一个关于SQL Server优化的一般问题:如何减少存储过程中的读取次数?

我对以下良好实践感兴趣: - 在物理表和临时表中创建索引 - 使用临时表而不是在程序中使用相同的表几次 - 在DML之前使用DDL - 在存储过程开始时设置NOCOUNT ON - ...

我们遇到的问题是由于存储过程引起的大量读取而使用的磁盘空间,我需要对其进行优化.

"最昂贵"的存储过程的一部分是:

create table #stavke   
(  
    Id_Br int identity(1, 1), IDStavke int, 
    HeaderID int, Currency varchar(3),  GLAcct varchar(20), id varchar(20), Trnuid varchar(60), 
    ReferenceID varchar(20), DocumentID varchar(20),
    DtAvail varchar(10), DtBooking varchar(10), DatePosted varchar(10),
    Amount money, AmountLcl money, 
    Description varchar(250), Type varchar(10), DP int  )
insert into #stavke   
  (  
    IDStavke, HeaderID, GLAcct, Currency, id , Trnuid , 
    ReferenceID, DocumentID ,
    DtAvail , DtBooking , DatePosted,
    Amount , AmountLcl …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server stored-procedures query-optimization

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

查询包含Oracle数据库中数百万行的表

我有一个表财务(列:日期,月份,季度,amount_usd,col1,col2,col3).

只是查询......

select sum(amount_usd) from finance
group by date
Run Code Online (Sandbox Code Playgroud)

......需要7秒

select sum(amount_usd) from finance
group by month
Run Code Online (Sandbox Code Playgroud)

......需要6秒

select sum(amount_usd) from finance
group by quarter
Run Code Online (Sandbox Code Playgroud)

......需要5秒

所以我想到了数据仓库

我创建了时间维度和层次结构

  • 作为月子的日期
  • 作为季度的孩子的月份

现在我卡住了......

什么是我的事实表?以及如何从事实表中查询数据?

这可能是一个非常基本的问题.但我是新手.

谢谢

oracle performance data-warehouse query-optimization

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

如何在不重复SELECT子查询的情况下重写此查询

我写了这样的查询.它正在工作并给我我想要的结果.
我有一个SELECT查询来获取CAR_AMOUNTHOTEL_AMOUNT.
但是,我必须重复相同的SELECT查询来获得SUM两者.我无法使用别名.我怎么能避免这个?

SELECT B.EMPLOYEE_ID,
       (select SUM(AMOUNT) 
         FROM travel_reimbursements_items
         WHERE type = 'CAR' 
         AND travel_request_no = B.travel_request_no 
        AND STATUS='APPROVED') as CAR_AMOUNT,
       (select SUM(AMOUNT)
        FROM travel_reimbursements_items 
        WHERE type = 'HOTEL' 
        AND travel_request_no = B.travel_request_no 
        AND STATUS='APPROVED') as HOTEL_AMOUNT,
       NVL((select SUM(AMOUNT) 
            FROM travel_reimbursements_items 
            WHERE type = 'CAR' 
            AND travel_request_no = B.travel_request_no 
            AND STATUS='APPROVED'),0)
        +NVL((select SUM(AMOUNT) 
            FROM travel_reimbursements_items
            WHERE type = 'HOTEL' 
            AND travel_request_no = B.travel_request_no 
            AND STATUS='APPROVED'),0) as TOTAL
FROM TRAVEL_REQUEST_ITEM A …
Run Code Online (Sandbox Code Playgroud)

sql oracle optimization query-optimization

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

优化PL/SQL或迁移到Clojure(可并行语言)?

我有一个大表,希望迭代记录(> 1,000,000),根据另外2组每个表> = 1执行一些检查,并将结果输出到文本文件.

执行此操作的PL\SQL需要几个小时,我可以对其进行优化,或者我可以将其重写为可并行化的clojure程序,因为只有选择而且没有写入(对表).

问题:1优化PL/SQL有哪些挑战/限制?

2在优化PL/SQL方面,将代码迁移到clojure是否有重大的优势?

编辑 这是它的肉

  OPEN cur;

  LOOP
     FETCH cur INTO l_cur;

     EXIT WHEN cur%NOTFOUND;

     SELECT NVL (dUM ( (total - total_old)), 0),
            NVL (dUM ( (new - old)), 0)
       INTO li_debt, li_debt
       FROM tbl1
      WHERE     accounting_date = l_cur.accounting_date
            AND USER_ID = l_cur.USER_ID
            AND USER_ACCOUNT = l_cur.USER_ACCOUNT;

     SELECT NVL (
               dUM (
                  DECODE (a.DEBITS,
                          'foo', ABS (amount),
                          ABS (amount) * -1)),
               0)
               amount
       INTO li_dad_bill
       FROM daily_trandactiond d, ACCOUNTS a
      WHERE     d.USER_ID = l_cur.USER_ID
            AND d.USER_ACCOUNT …
Run Code Online (Sandbox Code Playgroud)

plsql clojure query-optimization

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

优化Oracle中新列的添加

我使用以下查询将"DEPARTMENT"列添加到表'EMPLOYEE'.

ALTER TABLE EMPLOYEE ADD DEPARTMENT varchar(15);
Run Code Online (Sandbox Code Playgroud)

然后使用以下查询将DEPARTMENT更新为"技术"

update EMPLOYEE set DEPARTMENT = 'Technology' where DEPARTMENT is null;
Run Code Online (Sandbox Code Playgroud)

由于记录数量有限,这似乎在开发环境中运行良好,但是在Prod之类的环境中花费了近1个小时,因为在Prod中有大约2000万条记录需要更新,这是不可接受的.

我们正在考虑修改更新查询以删除where条件,如下所示.

update EMPLOYEE set DEPARTMENT = 'Technology';
Run Code Online (Sandbox Code Playgroud)

这会有帮助吗?或者有其他方法来优化此查询?

注意:使用oracle 11g数据库

sql query-optimization oracle11g

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

如何使用Java仅查询MongoDB中的特定字段

我正在使用MongoDB 3.2和MongoDB Java Driver 3.2.为了查询文档,我使用以下代码:

Document query = new Document("fetchStatus", new Document("$lte", fetchStatusParam));
ArrayList<Document> unfetchedEvents = dbC_Events.find(query).into(new ArrayList<Document>());
Run Code Online (Sandbox Code Playgroud)

此查询有效,但问题是在这种情况下,将检索文档的所有字段(select *在SQL中类似).为了优化查询性能,我想指定我真正需要的字段并仅获取它们.

我发现了几个例子,例如:

BasicDBObject query = new BasicDBObject();
BasicDBObject fields = new BasicDBObject("Name", 1);
coll.find(query, fields);
Run Code Online (Sandbox Code Playgroud)

但是所有这些都是针对过时版本的MongoDB Java驱动程序设计的,例如2.4,而我使用的是3.2.

我的问题:
如何只查询MongoDB Java Driver 3.2中的特定文档字段?

java crud query-optimization mongodb mongodb-query

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

是否值得为int值创建PreparedStatement?

我创建的PreparedStatement时候,我需要将答案传递给答案而不解决您的问题,请编辑以详细解释您的问题中唯一的部分.标题

是否值得为int值创建PreparedStatement?SQL查询,但是值得准备一个语句来传递int参数并在执行后关闭吗?

void delete(int key, int orElse) throws SQLException
{
    try(PreparedStatement pst = this.connection.prepareStatement(
        "DELETE FROM a_table WHERE the_int_primary_key=? OR random_int_field=?"
    ))
    {
        pst.setInt(1, key);
        pst.setInt(2, orElse);
        pst.executeUpdate();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否值得准备该声明?是否会增加安全性?

如果我用正常的声明做什么怎么办?这有风险吗?它会执行得更快吗?

void delete(int key, int orElse) throws SQLException
{
  try(Statement stm = this.connection.createStatement())
  {
    stm.executeUpdate(
      "DELETE FROM a_table WHERE the_int_primary_key="+key+" OR random_int_field="+orElse
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这个问题是不是重复的准备好的语句显着减缓程序?因为:

  • 另一个问题是多次重复使用预准备语句,我打算只使用一次,文档已经指定重用更快 PreparedStatements
  • 我打算只将这个语句用于整数,我担心SQL注入但同时我不确定是否可以用原始int参数注入SQL,微速度增强只是一个小的加分,我不是因为表现而问.另一个问题只是想加快速度,可能正在使用字符串,日期或其他非基本类型.

java optimization jdbc query-optimization prepared-statement

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