我有一个美国所有邮政编码的数据库表,其中包括每个邮政编码的城市,州,纬度和经度.我还有一个点数据库表,每个点都有与之关联的纬度和经度.我希望能够使用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) 我最近在某处读到了调优SQL查询的方法之一是,如果它有太多的连接,那么用较少的表做一个连接并将结果缓存到临时表中,然后在该表上进行其余的查询连接.
我的问题是它如何改善性能,因为你加入相同数量的表(只是不在一起)?
注意:我同意这是通用声明; 我最近在一篇文章中读到了它.我会改写它.在哪些条件下将结果存储到临时表帮助?
我有一个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)
基本上我想在所有线程完成发送时只有一个字符串副本,我想读第二个字符串,依此类推.
我有一个关于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) 我有一个表财务(列:日期,月份,季度,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秒
所以我想到了数据仓库
我创建了时间维度和层次结构
现在我卡住了......
什么是我的事实表?以及如何从事实表中查询数据?
这可能是一个非常基本的问题.但我是新手.
谢谢
我写了这样的查询.它正在工作并给我我想要的结果.
我有一个SELECT查询来获取CAR_AMOUNT和HOTEL_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) 我有一个大表,希望迭代记录(> 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) 我使用以下查询将"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数据库
我正在使用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中的特定文档字段?
我创建的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)
编辑:这个问题是不是重复的准备好的语句显着减缓程序?因为:
PreparedStatementsjava optimization jdbc query-optimization prepared-statement
sql ×4
java ×3
optimization ×3
oracle ×3
clojure ×1
crud ×1
geolocation ×1
jdbc ×1
join ×1
memory ×1
mongodb ×1
mysql ×1
oracle11g ×1
performance ×1
plsql ×1
sql-server ×1
t-sql ×1